Avatar billede andreas_ace Nybegynder
04. maj 2006 - 15:18 Der er 6 kommentarer og
1 løsning

Merge flere excel filer i et dokument

Hej Eksperter!
Jeg har følgende script til at samle flere excel dokumenter i ét. Mit spørgsmål er følgende, kan dette ændres til ikke at gemme dataene i et enkelt dataark i stedet for at oprette et nyt for hver fil?

Jeg regner med at det er denne del der skal rettes i
    While x <= UBound(FilesToOpen)
        Workbooks.Open FileName:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets _
          (ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend

Hele scriptet ser ud som følger.
---------------------------------------------------

Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xls), *.xls", _
      MultiSelect:=True, Title:="Files to Merge")

    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "No Files were selected"
        GoTo ExitHandler
    End If

    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open FileName:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets _
          (ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend

ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
Avatar billede excelent Ekspert
05. maj 2006 - 19:13 #1
prøv evt. denne kode (fundet på nettet)

Sub Example1_More_Sheets()
    Dim basebook As Workbook
    Dim mybook As Workbook
    Dim sourceRange As Range
    Dim destrange As Range
    Dim rnum As Long
    Dim SourceRcount As Long
    Dim FNames As String
    Dim MyPath As String
    Dim SaveDriveDir As String
    Dim sh As Worksheet

    SaveDriveDir = CurDir
    MyPath = "C:\" '  Indtast aktuel sti
    ChDrive MyPath
    ChDir MyPath

    FNames = Dir("*.xls")
    If Len(FNames) = 0 Then
        MsgBox "No files in the Directory"
        ChDrive SaveDriveDir
        ChDir SaveDriveDir
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Set basebook = ThisWorkbook
    basebook.Worksheets(1).Cells.Clear
    'clear all cells on the first sheet
    rnum = 1

    Do While FNames <> ""
        Set mybook = Workbooks.Open(FNames)
        For Each sh In mybook.Worksheets
            Set sourceRange = sh.Range("A1:P40")
            SourceRcount = sourceRange.Rows.Count
            Set destrange = basebook.Worksheets(1).Cells(rnum, "A")

            basebook.Worksheets(1).Cells(rnum, "L").Value = mybook.Name & " " & sh.Name

            sourceRange.Copy destrange

            rnum = rnum + SourceRcount
        Next sh

        mybook.Close False
        FNames = Dir()
    Loop

    ChDrive SaveDriveDir
    ChDir SaveDriveDir
    Application.ScreenUpdating = True
End Sub
Avatar billede excelent Ekspert
05. maj 2006 - 19:14 #2
ret sti, og evt. Range
Avatar billede andreas_ace Nybegynder
09. maj 2006 - 14:45 #3
Beklager mit sene svar.
Jeg prøver, tak.
Avatar billede andreas_ace Nybegynder
09. maj 2006 - 15:50 #4
Rangen giver lidt problemer. Har svært ved at definere hvor langt ned i dokumentet den skal gå. Svaret er til der ikke er flere data at indlæse...

Set sourceRange = sh.Range("A1:P40")

I enkelte tilfælde er dokumentet til indlæsning tomt.
jeg må kigge videre på det ved lejlighed. Hvis der er nogen der ved hvordan man udvider ragen til at være en dynamisk værdi lig antallet af rækker med data i et givent dokument?
Avatar billede excelent Ekspert
09. maj 2006 - 15:58 #5
prøv med :

Set sourceRange = sh.UsedRange
Avatar billede andreas_ace Nybegynder
11. maj 2006 - 15:10 #6
Perfekt!

Det endelige script ser ud som følger.

------------------------------
Sub Example1_More_Sheets()
    Dim basebook As Workbook
    Dim mybook As Workbook
    Dim sourceRange As Range
    Dim destrange As Range
    Dim rnum As Long
    Dim SourceRcount As Long
    Dim FNames As String
    Dim MyPath As String
    Dim SaveDriveDir As String
    Dim sh As Worksheet

    SaveDriveDir = CurDir
    MyPath = "X:\MAPPE\MED\EXCEL\FILER\" '  Indtast aktuel sti
    ChDrive MyPath
    ChDir MyPath

    FNames = Dir("*.xls")
    If Len(FNames) = 0 Then
        MsgBox "No files in the Directory"
        ChDrive SaveDriveDir
        ChDir SaveDriveDir
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Set basebook = ThisWorkbook
    basebook.Worksheets(1).Cells.Clear
    'clear all cells on the first sheet
    rnum = 1

    Do While FNames <> ""
        Set mybook = Workbooks.Open(FNames)
        For Each sh In mybook.Worksheets
            Set sourceRange = sh.UsedRange
            SourceRcount = sourceRange.Rows.Count
            Set destrange = basebook.Worksheets(1).Cells(rnum, "A")

            basebook.Worksheets(1).Cells(rnum, "L").Value = mybook.Name & " " & sh.Name

            sourceRange.Copy destrange

            rnum = rnum + SourceRcount
        Next sh

        mybook.Close False
        FNames = Dir()
    Loop

    ChDrive SaveDriveDir
    ChDir SaveDriveDir
    Application.ScreenUpdating = True
End Sub

------

Smid et svar, så du kan få point.
Jeg vil forsøge at udvide med en 'gennemse'/'browse' option, så man nemt kan angive hvilken mappe der skal anvendes. Smider scriptet her, så snart jeg har noget der virker.
Tusind tak.
Avatar billede excelent Ekspert
11. maj 2006 - 15:20 #7
ok velbekom :-)
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