Avatar billede olehen Nybegynder
27. november 2007 - 22:56 Der er 12 kommentarer og
1 løsning

Hente data fra flere excelfiler automatisk

jeg vil gerne hente bestemte rækker fra flere excel filer til en excel fil.

Dataene der skal hentes fra filerne står i kolonne A til F og er med samme kolonneoverskrifter og ens opbygget for alle filerne.

Overskrifterne er i række 3 og dataområdet er fra række 4 til og med række Xfr sidste række. Dataene der skal overføres er fra række 3 og ned. Den skal ikke hente de 3 første rækker med over.

For dataene i række E og F skal disse deles med 1.000.000, så tallene står med 2 decimaler. F.eks. 150.000 bliver til 0,15

Når den har fundet alle rækker i en fil og hente dem over skal den forsætte til næste fil og gøre det samme.

Næste gang jeg køre macroen skal den slette hele arket, hvorefter den gennemser alle filerne igen.

Filerne ligger altid i samme mappe og opdateringer bliver ført over og gemt med det oprindelige navn.

Sidste opdateringsdato skal gerne være i kolonne A i samle arket og kan hentes fra alle filerne i felt "B1".

Har set på flere forslag herinde men har endnu ikke fundet en der virker selvom jeg retter dem til..

http://www.eksperten.dk/spm/413238
http://www.eksperten.dk/spm/673876
http://www.eksperten.dk/spm/279147

Jeg har selv været i gang med en kode a la den fra http://www.eksperten.dk/spm/413238.
Har også forsøgt med forskellige ActiveX 2.0, 2,1 slået til. Lige lidt hjælper det...

Den strander ved:

rsData.Open szSQL, szConnect, adOpenForwardOnly, _
                adLockReadOnly, adCmdText

Run-time error'-2147467259(80004005)':
Could not find installable ISAM.


Hvad betyder dette???



Min code der ud som følgende:

Sub GetAllData()
Dim FS As FileSearch
Dim FilePath As String, FileSpec As String
Dim i As Long
Dim v As Variant
Dim szSQL As String
Dim rTarget As Range
Dim ToSheet As Worksheet
'******************************
FilePath = "J:\updatere"
FileSpec = "*.xls"
Set ToSheet = ThisWorkbook.Worksheets("Data")
szSQL = "SELECT [CC],[Bk], [Fc],[Cur],[Max]/1000000,[Act]/1000000 FROM [Bk Ovw$]"
'******************************
'find excel filerne
Set FS = Application.FileSearch
With FS
  .LookIn = FilePath
  .Filename = FileSpec
  .SearchSubFolders = False          'skal underfoldere også søges
  .Execute
  If .FoundFiles.Count = 0 Then
      MsgBox ("Ingen filer fundet")
      Exit Sub
  End If
End With
'hent data
For i = 1 To FS.FoundFiles.Count
  Set rTarget = ToSheet.Range("A1000").End(xlUp).Offset(1, 0)
  rTarget.Offset(4, 0) = FS.FoundFiles(i)
  QueryWorksheet FS.FoundFiles(i), szSQL, rTarget
Next
End Sub

Public Sub QueryWorksheet(szFName As String, szSQL As String, rTarget As Range)
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & szFName & ";" & _
                "Extended Properties=Excel 11.5;"
   
    Set rsData = New ADODB.Recordset
    rsData.Open szSQL, szConnect, adOpenForwardOnly, _
                adLockReadOnly, adCmdText
               
   
    ' Check at data er modtaget
    If Not rsData.EOF Then
        rTarget.CopyFromRecordset rsData
    Else
        MsgBox "No records returned.", vbCritical
    End If
   
    ' Clean up.
    rsData.Close
    Set rsData = Nothing
End Sub


Kabbak er det ikke en opgave for dig? Jeg er sikker på du kan komme op med en løsning på problemet. Har har selvfølgelig også lov til at komme med forslag.
Avatar billede kabbak Professor
28. november 2007 - 00:12 #1
hvilket arknavn, eller nummer har de ark, den skal hente fra ??
Avatar billede kabbak Professor
28. november 2007 - 00:22 #2
prøv at se på denne, den skulle måske kunne gøre det.

Sub GetAllData()
    Dim FS As FileSearch
    Dim FilePath As String, FileSpec As String
    Dim i As Long
    Dim v As Variant
    Dim rTarget As Range
    Dim ToSheet As Worksheet
    Dim Data As Variant
    '******************************
    FilePath = "c:\data"
    FileSpec = "*.xls"
    Set ToSheet = ThisWorkbook.Worksheets("Data")
    '******************************
    'find excel filerne
    Set FS = Application.FileSearch
    With FS
        .LookIn = FilePath
        .Filename = FileSpec
        .SearchSubFolders = False          'skal underfoldere også søges
        .Execute
        If .FoundFiles.Count = 0 Then
            MsgBox ("Ingen filer fundet")
            Exit Sub
        End If
    End With
    'hent data
    For i = 1 To FS.FoundFiles.Count
        Set rTarget = ToSheet.Range("A1000").End(xlUp).Offset(1, 0)
        rTarget.Offset(4, 0) = FS.FoundFiles(i)
        Workbooks.Open Filename:=FS.FoundFiles(i)
        Data = Range(Range("A3"), Range("F" & Range("A1000").End(xlUp).Row))
        ActiveWorkbook.Close False
        For x = 1 To UBound(Data)
            Data(x, 5) = Data(x, 5) / 100000
            Data(x, 5) = Data(x, 5) / 100000
        Next
        rTarget.Offset(5, 0).Resize(UBound(Data, 1), UBound(Data, 2)) = Data
    Next
End Sub
Avatar billede kabbak Professor
28. november 2007 - 00:29 #3
Sub GetAllData()
    Dim FS As FileSearch
    Dim FilePath As String, FileSpec As String
    Dim i As Long
    Dim v As Variant
    Dim rTarget As Range
    Dim ToSheet As Worksheet
    Dim Data As Variant
    '******************************
    FilePath = "J:\updatere"
    FileSpec = "*.xls"
    Set ToSheet = ThisWorkbook.Worksheets("Data")
    '******************************
    'find excel filerne
    Set FS = Application.FileSearch
    With FS
        .LookIn = FilePath
        .Filename = FileSpec
        .SearchSubFolders = False          'skal underfoldere også søges
        .Execute
        If .FoundFiles.Count = 0 Then
            MsgBox ("Ingen filer fundet")
            Exit Sub
        End If
    End With
    'hent data
    Application.ScreenUpdating = False
    For i = 1 To FS.FoundFiles.Count
        Set rTarget = ToSheet.Range("A1000").End(xlUp).Offset(1, 0)
        rTarget.Offset(4, 0) = FS.FoundFiles(i)
        Workbooks.O½pen Filename:=FS.FoundFiles(i)
        Data = Range(Range("A4"), Range("F" & Range("A1000").End(xlUp).Row))
        ActiveWorkbook.Close False
        For x = 1 To UBound(Data)
            Data(x, 5) = Data(x, 5) / 100000
            Data(x, 5) = Data(x, 5) / 100000
        Next
        rTarget.Offset(5, 0).Resize(UBound(Data, 1), UBound(Data, 2)) = Data
    Next
    Application.ScreenUpdating = True
End Sub
Avatar billede kabbak Professor
28. november 2007 - 00:30 #4
den sidste
Data(x, 5) = Data(x, 5) / 100000
skal være
Data(x, 6) = Data(x, 6) / 100000
Avatar billede olehen Nybegynder
28. november 2007 - 08:17 #5
Hej Kabbak,

Det er super godt arbejde på et kvarters tid..

arknavnene er Overview og er nummer 2 ark i alle filerne. Men det ser ud til den godt kan finde ud af og finde arkene med dataene uden arknavn.

Koden stopper hvis en af filerne er åben, kan man få den til at læse fra en i forvejen åben fil ellers skal brugerne promptes til at lukke filen, så koden kan forsætte indlæsningen.

Jeg har ændret rTarget.Offset(0,0) så filerne kommer lige efter hinanden samt jeg undgår at selve stien bliver ført over i arket.

Har tilføjet en sortering efter den sidste next.

Kan jeg tilføje en ny tom kolonne ind i mellem kolonne A og B?
Avatar billede olehen Nybegynder
28. november 2007 - 08:26 #6
Det bedste vil være at den indsætter arkene på følgende måde i arket DATA:

Fra filerne kolonne A til DATA kolonne A,
Fra filerne kolonne B til DATA kolonne C,
Fra filerne kolonne C til DATA kolonne E,
Fra filerne kolonne D til DATA kolonne G,
Fra filerne kolonne E til DATA kolonne H,
Fra filerne kolonne F til DATA kolonne I.

For i kolonnerne ind i mellem er der nogle vlookups som jeg benytter.
Avatar billede kabbak Professor
28. november 2007 - 15:03 #7
Det kan godt laves, men så bliver koden langsommere
Avatar billede olehen Nybegynder
28. november 2007 - 18:57 #8
Hvor meget langsommere taler vi om?

For jeg kunne nemlig godt tænke mig at hente en eller to kolonner mere med over.. Og jeg mener ikke de står lige efter F men er kolonne i og j.. Kan lige følge op på det i morgen..

Hvor indsætter jeg et specifikt arknavn så jeg kan hente fra det?
Avatar billede kabbak Professor
28. november 2007 - 20:29 #9
Sub GetAllData()
    Dim FS As FileSearch
    Dim FilePath As String, FileSpec As String
    Dim i As Long
    Dim v As Variant
    Dim rTarget As Long
    Dim ToSheet As Worksheet
    Dim Data1 As Variant, Data2 As Variant, Data3 As Variant
    '******************************
    FilePath = "c:\temp"
    FileSpec = "*.xls"
    Set ToSheet = ThisWorkbook.Worksheets("Data")
    '******************************
    'find excel filerne
    Set FS = Application.FileSearch
    With FS
        .LookIn = FilePath
        .Filename = FileSpec
        .SearchSubFolders = False          'skal underfoldere også søges
        .Execute
        If .FoundFiles.Count = 0 Then
            MsgBox ("Ingen filer fundet")
            Exit Sub
        End If
    End With
    'hent data
    Application.ScreenUpdating = False
    For i = 1 To FS.FoundFiles.Count
        rTarget = ToSheet.Range("A1000").End(xlUp).Row + 1
        ' rTarget.Offset(4, 0) = FS.FoundFiles(i)

        Workbooks.Open Filename:=FS.FoundFiles(i), ReadOnly:=True
        With Worksheets("Overview")
            Data1 = .Range(.Range("A4"), .Range("A" & .Range("A1000").End(xlUp).Row))    ' kolonne A
            Data2 = .Range(.Range("B4"), .Range("F" & .Range("A1000").End(xlUp).Row))    'kolonne B-F
            Data3 = .Range(.Range("i4"), .Range("j" & .Range("A1000").End(xlUp).Row))    ' kolonne I-J
        End With
        ActiveWorkbook.Close False

        For x = 1 To UBound(Data2)
            Data2(x, 4) = Data2(x, 4) / 100000
            Data2(x, 5) = Data2(x, 5) / 100000
        Next
        ToSheet.Cells(rTarget, "A").Resize(UBound(Data1, 1), UBound(Data1, 2)) = Data1  ' kolonne A til Kolonne A
        ToSheet.Cells(rTarget, "C").Resize(UBound(Data2, 1), UBound(Data2, 2)) = Data2    ' kolonne B-F til kolonne C-G
        ToSheet.Cells(rTarget, "H").Resize(UBound(Data3, 1), UBound(Data3, 2)) = Data3    ' kolonne I-J til kolonne H-I
    Next

    Application.ScreenUpdating = True
End Sub
Avatar billede kabbak Professor
28. november 2007 - 20:44 #10
Skulle nu være rettet til de rigtige kolonner, Jeg har også taget I og J med, du kan selv rette hvis det er de forkerte.


Sub GetAllData()
    Dim FS As FileSearch
    Dim FilePath As String, FileSpec As String
    Dim i As Long
    Dim v As Variant
    Dim rTarget As Long
    Dim ToSheet As Worksheet
    Dim Data As Variant
    '******************************
    FilePath = "J:\updatere"
    FileSpec = "*.xls"
    Set ToSheet = ThisWorkbook.Worksheets("Data")
    '******************************
    'find excel filerne
    Set FS = Application.FileSearch
    With FS
        .LookIn = FilePath
        .Filename = FileSpec
        .SearchSubFolders = False          'skal underfoldere også søges
        .Execute
        If .FoundFiles.Count = 0 Then
            MsgBox ("Ingen filer fundet")
            Exit Sub
        End If
    End With
    'hent data
    Application.ScreenUpdating = False
    For i = 1 To FS.FoundFiles.Count
        rTarget = ToSheet.Range("A1000").End(xlUp).Row + 1
        Workbooks.Open Filename:=FS.FoundFiles(i), ReadOnly:=True ' åbnes som skrivebeskyttet
        With Worksheets("Overview") ' Navnet på arket der hentes fra
            Data = .Range(.Range("A4"), .Range("A" & .Range("A1000").End(xlUp).Row))    ' kolonne A
            ToSheet.Cells(rTarget, "A").Resize(UBound(Data, 1), UBound(Data, 2)) = Data  ' kolonne A til Kolonne A

            Data = .Range(.Range("B4"), .Range("B" & .Range("A1000").End(xlUp).Row))    'kolonne B
            ToSheet.Cells(rTarget, "C").Resize(UBound(Data, 1), UBound(Data, 2)) = Data    ' kolonne B til kolonne C

            Data = .Range(.Range("C4"), .Range("C" & .Range("A1000").End(xlUp).Row))    'kolonne C
            ToSheet.Cells(rTarget, "E").Resize(UBound(Data, 1), UBound(Data, 2)) = Data    ' kolonne C til kolonne E

            Data = .Range(.Range("D4"), .Range("F" & .Range("A1000").End(xlUp).Row))    'kolonne D, E, F
            For x = 1 To UBound(Data)
                Data(x, 2) = Data(x, 2) / 100000
                Data(x, 3) = Data(x, 3) / 100000
            Next
            ToSheet.Cells(rTarget, "G").Resize(UBound(Data, 1), UBound(Data, 2)) = Data    ' kolonne D, E, F til kolonne G,H,I

            Data = .Range(.Range("I4"), .Range("j" & .Range("A1000").End(xlUp).Row))    ' kolonne I-J
            ToSheet.Cells(rTarget, "J").Resize(UBound(Data, 1), UBound(Data, 2)) = Data    ' kolonne I,J til kolonne J,K
        End With
        ActiveWorkbook.Close False
    Next
    Application.ScreenUpdating = True
End Sub
Avatar billede olehen Nybegynder
28. november 2007 - 21:49 #11
Super - afprøver lige koden i morgen.. Så vender jeg tilbage..
Avatar billede olehen Nybegynder
29. november 2007 - 07:45 #12
Det virker perfekt.. Koden virker ikke til at være blevet langsommere.. Så det er perfekt..

Læg et svar så får du pointene asap. Og tusind tak for hjælpen..
Avatar billede kabbak Professor
29. november 2007 - 08:05 #13
et svar ;-))
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester