2017-12-20 6 views
0

97種類のワークブックがあります。それらを1つのワークブックにまとめたい。異なるワークブックを1つにマージする

検索の結果、このコードが見つかり、変更が加えられました。

F5キーを押すと、エラーは発生しません。しかし、私はコードの結果を見ません。

ここに私のコード:あなたのコーディングスタイルを使用して

Sub MergeDifferentWorkbooksTogether() 

Dim wbk As Workbook 
Dim wbk1 As Workbook 
Set wbk1 = ThisWorkbook 
Dim Filename As String 
Dim Path As String 

Path = "C:\Users\xezer.suleymanov\Desktop\Combine Workbooks" 
Filename = Dir(Path & "*.xlsx") 

Do While Len(Filename) > 0 

Set wbk = Workbooks.Open(Path & Filename) 
wbk.Activate 
Range("A2").Select 
Range(ActiveCell, ActiveCell.End(xlDown).End(xlToRight)).Copy 
Windows("Book1.xlsx").Activate 
Application.DisplayAlerts = False 
Dim i As Double 
i = wbk1.Sheets("Sheet1").cell(Rows.Count, 1).End(xlUp).Row 
Sheets("Sheet").Select 
Cells(i + 1, 1).Select 
ActiveCell.PasteSpecial xlPasteAll 
wbk.Close True 
Filename = Dir 

Loop 
End Sub 
+0

あなたのワークブックからのデータを集計するために電源クエリを使って方が良いと思います。 – Olly

+1

'' Path'の最後に '' \ 'がありません。私は 'FileSystemObject'を使ってループすることをお勧めします – AntiDrondert

答えて

1

、あなたが必要なものを得るために、このような何かを試してみてください:一般的に

Sub MergeDifferentWorkbooksTogether() 

    Dim wbk As Workbook 
    Dim wbk1 As Workbook 
    Set wbk1 = ThisWorkbook 
    Dim Filename As String 
    Dim Path As String 

    Path = "C:\Users\SomeFile\" 
    Filename = Dir(Path & "*.xlsx") 

    Do While Len(Filename) > 0 
     Debug.Print Filename 
     Set wbk = Workbooks.Open(Path & Filename) 
     wbk.Activate 
     Range("A2").Select 
     Range(ActiveCell, ActiveCell.End(xlDown).End(xlToRight)).Copy 
     wbk.Activate 
     Application.DisplayAlerts = False 
     Dim i As Long 
     i = wbk1.Worksheets(1).Range("A:A").End(xlUp).Row 
     Worksheets(2).Select 
     Cells(i + 1, 1).Select 
     ActiveCell.PasteSpecial xlPasteAll 
     wbk.Close True 
     Filename = Dir 
    Loop 

End Sub 

コメントで述べたように、あなたが終了する必要がありますパスは\となります。次に、コードで正しい参照が使用されていることを確認します。 Cellはどこか、将来的に第三段階として

Cellsを書かれており、などしなければならない、VBAでSelectionActiveCellを回避しようと、それはあなたを遅くし、それはいくつかのエラーにつながることができます - How to avoid using Select in Excel VBA

0

ので、97ワークブックが1にマージされました。

最後のセルを検索または

Function RDB_Last(choice As Integer, rng As Range) 
'Ron de Bruin, 5 May 2008 
' 1 = last row 
' 2 = last column 
' 3 = last cell 
    Dim lrw As Long 
    Dim lcol As Integer 

    Select Case choice 

    Case 1: 
     On Error Resume Next 
     RDB_Last = rng.Find(What:="*", _ 
          after:=rng.cells(1), _ 
          Lookat:=xlPart, _ 
          LookIn:=xlFormulas, _ 
          SearchOrder:=xlByRows, _ 
          SearchDirection:=xlPrevious, _ 
          MatchCase:=False).Row 
     On Error GoTo 0 

    Case 2: 
     On Error Resume Next 
     RDB_Last = rng.Find(What:="*", _ 
          after:=rng.cells(1), _ 
          Lookat:=xlPart, _ 
          LookIn:=xlFormulas, _ 
          SearchOrder:=xlByColumns, _ 
          SearchDirection:=xlPrevious, _ 
          MatchCase:=False).Column 
     On Error GoTo 0 

    Case 3: 
     On Error Resume Next 
     lrw = rng.Find(What:="*", _ 
         after:=rng.cells(1), _ 
         Lookat:=xlPart, _ 
         LookIn:=xlFormulas, _ 
         SearchOrder:=xlByRows, _ 
         SearchDirection:=xlPrevious, _ 
         MatchCase:=False).Row 
     On Error GoTo 0 

     On Error Resume Next 
     lcol = rng.Find(What:="*", _ 
         after:=rng.cells(1), _ 
         Lookat:=xlPart, _ 
         LookIn:=xlFormulas, _ 
         SearchOrder:=xlByColumns, _ 
         SearchDirection:=xlPrevious, _ 
         MatchCase:=False).Column 
     On Error GoTo 0 

     On Error Resume Next 
     RDB_Last = rng.Parent.cells(lrw, lcol).Address(False, False) 
     If Err.Number > 0 Then 
      RDB_Last = rng.cells(1).Address(False, False) 
      Err.Clear 
     End If 
     On Error GoTo 0 

    End Select 
End Function 

場合から、ここでそれを行に(互いに未満)

Sub Basic_Example_1() 
    Dim MyPath As String, FilesInPath As String 
    Dim MyFiles() As String 
    Dim SourceRcount As Long, Fnum As Long 
    Dim mybook As Workbook, BaseWks As Worksheet 
    Dim sourceRange As Range, destrange As Range 
    Dim rnum As Long, CalcMode As Long 

    'Fill in the path\folder where the files are 
    MyPath = "C:\Users\Ron\test" 

    'Add a slash at the end if the user forget it 
    If Right(MyPath, 1) <> "\" Then 
     MyPath = MyPath & "\" 
    End If 

    'If there are no Excel files in the folder exit the sub 
    FilesInPath = Dir(MyPath & "*.xl*") 
    If FilesInPath = "" Then 
     MsgBox "No files found" 
     Exit Sub 
    End If 

    'Fill the array(myFiles)with the list of Excel files in the folder 
    Fnum = 0 
    Do While FilesInPath <> "" 
     Fnum = Fnum + 1 
     ReDim Preserve MyFiles(1 To Fnum) 
     MyFiles(Fnum) = FilesInPath 
     FilesInPath = Dir() 
    Loop 

    'Change ScreenUpdating, Calculation and EnableEvents 
    With Application 
     CalcMode = .Calculation 
     .Calculation = xlCalculationManual 
     .ScreenUpdating = False 
     .EnableEvents = False 
    End With 

    'Add a new workbook with one sheet 
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1) 
    rnum = 1 

    'Loop through all files in the array(myFiles) 
    If Fnum > 0 Then 
     For Fnum = LBound(MyFiles) To UBound(MyFiles) 
      Set mybook = Nothing 
      On Error Resume Next 
      Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum)) 
      On Error GoTo 0 

      If Not mybook Is Nothing Then 

       On Error Resume Next 

       With mybook.Worksheets(1) 
        Set sourceRange = .Range("A1:C1") 
       End With 

       If Err.Number > 0 Then 
        Err.Clear 
        Set sourceRange = Nothing 
       Else 
        'if SourceRange use all columns then skip this file 
        If sourceRange.Columns.Count >= BaseWks.Columns.Count Then 
         Set sourceRange = Nothing 
        End If 
       End If 
       On Error GoTo 0 

       If Not sourceRange Is Nothing Then 

        SourceRcount = sourceRange.Rows.Count 

        If rnum + SourceRcount >= BaseWks.Rows.Count Then 
         MsgBox "Sorry there are not enough rows in the sheet" 
         BaseWks.Columns.AutoFit 
         mybook.Close savechanges:=False 
         GoTo ExitTheSub 
        Else 

         'Copy the file name in column A 
         With sourceRange 
          BaseWks.cells(rnum, "A"). _ 
            Resize(.Rows.Count).Value = MyFiles(Fnum) 
         End With 

         'Set the destrange 
         Set destrange = BaseWks.Range("B" & rnum) 

         'we copy the values from the sourceRange to the destrange 
         With sourceRange 
          Set destrange = destrange. _ 
              Resize(.Rows.Count, .Columns.Count) 
         End With 
         destrange.Value = sourceRange.Value 

         rnum = rnum + SourceRcount 
        End If 
       End If 
       mybook.Close savechanges:=False 
      End If 

     Next Fnum 
     BaseWks.Columns.AutoFit 
    End If 

ExitTheSub: 
    'Restore ScreenUpdating, Calculation and EnableEvents 
    With Application 
     .ScreenUpdating = True 
     .EnableEvents = True 
     .Calculation = CalcMode 
    End With 
End Sub 

RDB_Last機能をフォルダ内のすべてのブックの範囲をマージ。

https://www.rondebruin.nl/win/s3/win008.htm

また、このエクセルアドインを使用することを検討してください。

https://www.rondebruin.nl/win/addins/rdbmerge.htm

enter image description here

関連する問題