17. marts 2005 - 13:14Der er
24 kommentarer og 3 løsninger
Importere data fra mange Excel-regneark
Har ca. 500 regneark, som strukturmæssigt er identiske, men naturligvis navngivet individuelt.
Jeg har behov for at selectere enkelt data fra alle disse regnark ( celle A1, celle A2, celle B13 o.s.v. ). Dette skal gøres i samtlige regneark, som ligger i et bestemt bibliotek på vores filserver.
Ja, denne kode aflæser alle filer i en mappe. Du behøver således ikke at indlæse dem i en tabel, man kan indkode din Excel-kode direkte heri:
Public Sub ListFiler(stDir As String) Dim stName As String
On Error GoTo err_FindFiler
'List alle filer i denne mappe stName = Dir(stDir & "\*.*") Do While stName <> "" On Error Resume Next If (GetAttr(stDir & stName) And vbDirectory) <> vbDirectory Then 'Er filen allerede åben opstår en fejl 5 If Err.Number = 5 Then Err.Clear
If stName <> "." Or stName <> ".." Then 'placer filnavn et eller andet sted 'her placeres det bare i debug-vinduet Debug.Print stName End If End If stName = Dir Loop
exit_FindFiler: Exit Sub err_FindFiler: If Err.Number = 71 Then MsgBox AccessError(Err.Number) _ & " Prøv venligst igen. ", vbCritical + vbOKOnly, _ "Fejl ved læsning af drev " & stDir End If Resume exit_FindFiler End Sub
Denne her læser alle de ønskede filer ind i en tabel
Sub FileSearch_EXCELL(soegmappe As String, soegsubs As Boolean, strextend As String, dropdbfilnavn As String, droptable As String, dropfield As String) ' Set Microsoft Office 9.0 Object Library before Executing this Sub Dim intI As Integer Dim cn As ADODB.Connection, rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _ "Data Source=" & dropdbfilnavn & ";" ' Åben et recordset Set rs = New ADODB.Recordset rs.Open droptable, cn, adOpenKeyset, adLockOptimistic, adCmdTable ' alle records i en tabel With Application.FileSearch .NewSearch .LookIn = soegmappe .SearchSubFolders = soegsubs .FileName = strextend .MatchTextExactly = True .FileType = msoFileTypeAllFiles
End With
With Application.FileSearch If .Execute() > 0 Then MsgBox "Der blev fundet " & .FoundFiles.Count & " fil(er)."
For intI = 1 To .FoundFiles.Count rs.AddNew ' tilføj ny record rs.Fields(dropfield) = .FoundFiles(intI) rs.Fields("filsize") = FileLen(.FoundFiles(intI)) / (1024 ^ 2) rs.Update ' gen den nye record Next intI Else MsgBox "Der blev ikke fundet nogen filer." End If End With rs.Close ' luk skidtet Set rs = Nothing cn.Close ' også her Set cn = Nothing ' slut prut finale End Sub
Så skal vi blot åbne hver enkelt fil i tabell - hente data ud af arket og ind i en 3. tabel kommer om lidt
Denne her åbner hvert ark - henter data ind. Denne viser det i en form, men kan nemt laves om til at blive kaldt ovenfra, hvor man looper igennem f.eks. 1000 ark og adder data til en anden tabel.
Det kan tilrådes at gemme filnavne i en tabel, da sådan en operation godt kan tage 20 minutter for 1000 excell ark.
Private Sub Hentdata(filnavn) Dim A As String, filnavn As String Dim xApp As Object
Hm den er lavet, så den køres fra en db og smider data i en anden db. lav en tabel i en anden db og husk lige at sætte office referencen. jeg bruger sådan et kald:
Sub test() FileSearch_EXCELL "C:\Documents and Settings\risthen\My Documents", True, "*.xls", "C:\Documents and Settings\xxx\My Documents\extractexcell.mdb", "tblfilnavn", "filnavn" End Sub
tblfilnavn ser sådan ud: filnavn, medtag, FDato, filsize
' Set Microsoft Office 9.0->11,0 Object Library before Executing this Sub
Her er en sturm til at løbe tabellen igennem og hente data ind via en move funktion, som de tilpasser efter ovestående. Denne del er lavet i DAO men kan ændres til ADO Sub hentdatafrafilnavn() Dim db As DAO.Database Dim RsFil As DAO.Recordset ' Set db = CurrentDb Set RsFil = db.OpenRecordset("tblfilnavn", dbOpenDynaset) If Not (Err = 0) Then RsFil.Close Exit Sub End If Forms![inddata]![lblfilnavn].Caption = "" Forms![inddata].Refresh While Not RsFil.EOF 'MsgBox Rsfil.Fields(0) Forms![inddata]![lblfilnavn].Caption = RsFil.Fields(0) Forms![inddata].Refresh Movedata RsFil.Fields(0), "Tblaktiv"
RsFil.MoveNext Wend
Forms![inddata]![lblfilnavn].Caption = "Dataindsamlingen er Nu Slut" Forms![inddata].Refresh RsFil.Close ' luk skidtet Set RsFil = Nothing db.Close ' også her Set db = Nothing ' slut prut finale End Sub
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.