【问题标题】:Excel/VBA - Combine rows and columns from worksheets into one, with varying source columnsExcel/VBA - 将工作表中的行和列合并为一个,具有不同的源列
【发布时间】:2017-10-11 21:43:31
【问题描述】:

我正在将多个 Excel 工作表合并到一个主工作表中。以下代码适用于所有工作表具有相同列的情况:

Sub CombineData()
Dim Sht As Worksheet

'This If will clear Master before combining
Worksheets("Master").Range("A2:ZZ9000").ClearContents

For Each Sht In ActiveWorkbook.Worksheets
    If Sht.Name <> "Master" And Sht.Range("A2").Value <> "" Then
        Sht.Select
        LastRow = Range("A9000").End(xlUp).Row
        Range("A2", Cells(LastRow, "ZZ")).Copy
        Sheets("Master").Select
        Range("A9000").End(xlUp).Offset(1, 0).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Else
    End If
Next Sht

End Sub

但是,我现在需要更进一步,当列与源工作表不同时,将工作表合并到一个列出所有列的母版中。

This shows the layout of the worksheets I'm testing with, to keep things simple.

我愿意将所有源列映射到目标列(例如

-Source1,A 列到主控,A 列

-Source2,B 列到主控,D 列

-等

或者简单地使用源工作表中的所有列重新创建 Master - 如果源工作表发生更改,这是更可取的。

干杯-

【问题讨论】:

标签: vba excel


【解决方案1】:

我对您的代码进行了一些更改,以使其适合将任何列从 master 映射到 sheet1。您必须在代码中对映射进行硬编码 子组合数据() 暗淡作为工作表 暗淡 colname 作为字符串 将 Lastrow 设为整数,将行数设为整数 '这个If会在组合之前清除Master Worksheets("Master").Range("A2:ZZ9000").ClearContents 列名 = 1 对于 ActiveWorkbook.Worksheets 中的每个 Sht

  If Sht.Name = "Sheet2" And Sht.Range("A2").Value <> "" Then
     Lastrow = Range("A9000").End(xlUp).Row
     Sheets("Master").Select
     rowcount = Range("A9000").End(xlUp).Row
     Sht.Select
'Map the columns of sheet2 to master
     Sheets("Master").Range("A" & rowcount & ":A" & rowcount + Lastrow - 2).Value = Sht.Range("A2:A" & Lastrow).Value
     Sheets("Master").Range("B" & rowcount & ":B" & rowcount + Lastrow - 2).Value = Sht.Range("C2:C" & Lastrow).Value

  ElseIf Sht.Name = "Sheet3" And Sht.Range("A2").Value <> "" Then
     Lastrow = Range("A9000").End(xlUp).Row
     Sheets("Master").Select
     rowcount = Range("A9000").End(xlUp).Row
     Sht.Select
'Map the columns of sheet3 to master
     Sheets("Master").Range("A" & rowcount & ":A" & rowcount + Lastrow - 2).Value = Sht.Range("A2:A" & Lastrow).Value
     Sheets("Master").Range("B" & rowcount & ":B" & rowcount + Lastrow - 2).Value = Sht.Range("B2:B" & Lastrow).Value
  End If
 Next Sht

End Sub

**************已编辑********************

Sub CombineData()
Dim Sht As Worksheet
Dim colname As String
 Dim Lastrow As Integer, rowcount As Integer
'This If will clear Master before combining
Worksheets("Master").Range("A2:ZZ9000").ClearContents
 colname = 1
For Each Sht In ActiveWorkbook.Worksheets
  If Sht.Name = "Sheet1" And Sht.Range("A2").Value <> "" Then
Sheets("Sheet1").Select

Lastrow = Range("A9000").End(xlUp).Row

     Sheets("Master").Select
     rowcount = Range("A9000").End(xlUp).Row + 1
     Sht.Select
'Map the columns of sheet2 to master
     Sheets("Master").Range("A" & rowcount & ":A" & rowcount + Lastrow - 2).Value = Sht.Range("A2:A" & Lastrow).Value
     Sheets("Master").Range("B" & rowcount & ":B" & rowcount + Lastrow - 2).Value = Sht.Range("B2:B" & Lastrow).Value
     Sheets("Master").Range("C" & rowcount & ":C" & rowcount + Lastrow - 2).Value = Sht.Range("C2:C" & Lastrow).Value
     Sheets("Master").Range("D" & rowcount & ":D" & rowcount + Lastrow - 2).Value = Sht.Range("D2:D" & Lastrow).Value

  ElseIf Sht.Name = "Sheet2" And Sht.Range("A2").Value <> "" Then
Sheets("Sheet2").Select

     Lastrow = Range("A9000").End(xlUp).Row
     Sheets("Master").Select
     rowcount = Range("A9000").End(xlUp).Row + 1
     Sht.Select
'Map the columns of sheet3 to master
     Sheets("Master").Range("A" & rowcount & ":A" & rowcount + Lastrow - 2).Value = Sht.Range("A2:A" & Lastrow).Value
     Sheets("Master").Range("E" & rowcount & ":E" & rowcount + Lastrow - 2).Value = Sht.Range("B2:B" & Lastrow).Value
     Sheets("Master").Range("F" & rowcount & ":F" & rowcount + Lastrow - 2).Value = Sht.Range("C2:C" & Lastrow).Value
     Sheets("Master").Range("G" & rowcount & ":G" & rowcount + Lastrow - 2).Value = Sht.Range("D2:D" & Lastrow).Value
     Sheets("Master").Range("C" & rowcount & ":C" & rowcount + Lastrow - 2).Value = Sht.Range("E2:E" & Lastrow).Value

 End If
 Next Sht

End Sub

【讨论】:

  • 瓦利,谢谢分享。我看到您如何将列从 Sheet1 映射到 Master、Sheet2 到 Master 等。我做了一个简单的测试,但它似乎不起作用。我在这里上传了示例:drive.google.com/file/d/0B6qW2z_2XgKbaktZOUlMcl9kQWc/…
  • @EricW 它不能这样工作。您必须编辑映射、工作表名称。我已经为你分享的表格写了一个。希望对你有帮助
  • 效果很好!太感谢了,太感谢了!我将继续努力。
猜你喜欢
  • 2010-12-16
  • 2015-07-30
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2019-10-27
  • 2020-05-01
相关资源
最近更新 更多