Avatar billede jss Nybegynder
28. november 2007 - 16:58 Der er 2 kommentarer og
1 løsning

Samle data fra mange workbooks i en workbook

Hejsa,
Er faldet over en smart makro på http://www.eksperten.dk/spm/491698, men oplever desværre at ikke alle data overføres. Der er tilfældige "huller" i de samlede data, efter at makro er kørt. Ofte mangler overskrifter til kolonner, men også data.
Det skal lige siges at jeg har data i et varierende antal kolonner og rækker:
Kolonner: De første 6 kolonner er altid faste, men herefter kan der være et varierende antal kolonner. Disse kolonner skal opfattes som observation 1 til n, indeholdende tal og det er ikke noget problem at de "placeres" ovenpå hinanden efterhånden som filerne lægges sammen.
Men det er mærkeligt, hvorfor disse huller i data opstår. Er der nogen der har et bud på det?
Avatar billede kabbak Professor
28. november 2007 - 21:39 #1
vi arbejder med noget lignende her http://www.eksperten.dk/spm/807865
Avatar billede jss Nybegynder
28. november 2007 - 23:51 #2
Prøver med en anden makro, der ser sådan her ud:

Option Explicit
Sub Example()
    Const strRootFolder_c As String = "C:\Test\"
    Const lngLwrBnd_c As Long = 1
    Const lngOffset_c As Long = 1
    Dim fs As Office.FileSearch
    Dim lngFileIndex As Long
    Dim wbNew As Excel.Workbook
    Dim wsTarget As Excel.Worksheet
    Dim wbCrnt As Excel.Workbook
    Dim wsOne As Excel.Worksheet
    Set fs = Excel.Application.FileSearch
    fs.NewSearch
    fs.FileType = msoFileTypeExcelWorkbooks
    fs.LookIn = strRootFolder_c
    fs.Execute
    If fs.FoundFiles.Count < lngLwrBnd_c + 1 Then
        VBA.MsgBox _
        "Cannot find any workbooks in the specified root folder. Please check to make sure you have excel workbooks in the location specified. Operation aborted.", _
        vbExclamation Or vbSystemModal, "No Workbooks Found"
        Exit Sub
    End If
    Set wbNew = Excel.Workbooks.Add
    Set wsTarget = wbNew.Worksheets(lngLwrBnd_c)
    For lngFileIndex = lngLwrBnd_c To fs.FoundFiles.Count
        Set wbCrnt = Excel.Workbooks.Open(fs.FoundFiles(lngFileIndex), False, _
        False, Password:="foo")
        Range("D2") = Application.ActiveWorkbook.Name
        Set wsOne = wbCrnt.Worksheets(lngLwrBnd_c + 1)
        wsOne.UsedRange.Copy wsTarget.Cells(wsTarget.UsedRange.Rows.Count, lngLwrBnd_c)
        wbCrnt.Close False
    Next
    VBA.MsgBox "All worksheets have been merged.", vbInformation Or _
    vbSystemModal, "Operation Complete"
End Sub


Problemet er nu  blot, at den nederste række data fra hver workbook bliver overskrevet med overskrifter fra den næste workbook. Feks. den første workbook der kopieres indeholder data  til og med række 100, og når data fra næste workbook herefter kopieres indsættes overskrifterne i række 100 og data i række 101->. Dvs. jeg mister den nederste række data fra hver workbook, pånær den sidst kopierede workbook.

Har prøvet lidt forskelligt og tror det ligger i linjen
wsOne.UsedRange.Copy wsTarget.Cells(wsTarget.UsedRange.Rows.Count, lngLwrBnd_c), hvor jeg skal tilføje noget OffSet-halløj, men lige hvordan ...?
Avatar billede jss Nybegynder
29. november 2007 - 00:47 #3
Fandt selv løsningen:

Option Explicit
Sub Example()
    Const strRootFolder_c As String = "C:\Test\"
    Const lngLwrBnd_c As Long = 1
    Const lngOffset_c As Long = 1
    Dim fs As Office.FileSearch
    Dim lngFileIndex As Long
    Dim lngRowCnt As Long
    Dim wbNew As Excel.Workbook
    Dim wsTarget As Excel.Worksheet
    Dim wbCrnt As Excel.Workbook
    Dim wsOne As Excel.Worksheet
    Set fs = Excel.Application.FileSearch
    fs.NewSearch
    fs.FileType = msoFileTypeExcelWorkbooks
    fs.LookIn = strRootFolder_c
    fs.Execute
    If fs.FoundFiles.Count < lngLwrBnd_c Then
        VBA.MsgBox _
        "Cannot find any workbooks in the specified root folder. Please check to make sure you have excel workbooks in the location specified. Operation aborted.", _
        vbExclamation Or vbSystemModal, "No Workbooks Found"
        Exit Sub
    End If
    Set wbNew = Excel.Workbooks.Add
    Set wsTarget = wbNew.Worksheets(lngLwrBnd_c)
    For lngFileIndex = lngLwrBnd_c To fs.FoundFiles.Count
        If (lngFileIndex = lngLwrBnd_c) Then lngRowCnt = 0 Else lngRowCnt = 1
        Set wbCrnt = Excel.Workbooks.Open(fs.FoundFiles(lngFileIndex), False, _
        False, Password:="foo")
        Range("D2") = Application.ActiveWorkbook.Name
        Set wsOne = wbCrnt.Worksheets(lngLwrBnd_c + 1)
        'MsgBox wsTarget.UsedRange.Rows.Count + 1
        wsOne.UsedRange.Copy wsTarget.Cells(wsTarget.UsedRange.Rows.Count + lngRowCnt, lngLwrBnd_c)
        wbCrnt.Close False
    Next
    VBA.MsgBox "All worksheets have been merged.", vbInformation Or _
    vbSystemModal, "Operation Complete"
End Sub

Oprettede ny variabel "lngRowCnt", der sættes i første linje i for-endfor løkken som "If (lngFileIndex = lngLwrBnd_c) Then lngRowCnt = 0 Else lngRowCnt = 1". Værdien i "lngRowCnt" bruges i den ovenfor nævnte linje, der nu ser således ud "wsOne.UsedRange.Copy wsTarget.Cells(wsTarget.UsedRange.Rows.Count + lngRowCnt, lngLwrBnd_c)"
Dvs. for fil nr. 1 tillægges ingen værdi (lngRowCnt=0), mens den for de efterfølgende filer tillægges værdien 1 (lngRowCnt=1). Dette giver netop den ønskede løsning, hvor nederste række data nu altid er med
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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