返回

VBA合并多表数据时,当合并区域列数不定时如何解决

Excel技巧

合并区域列数不定怎么办

在利用VBA代码合并多表数据时,合并区域列数不定,这是经常遇到的问题之一。解决方法其实很简单,只需要将过程改写为:

Sub 合并多表数据()
    Dim EndRow As Long, DataArr As Variant, ToRng As Range
    Dim WsArr As Variant, Ws As Worksheet, LastCol As Long
    
    WsArr = Array("Sheet1", "Sheet2", "Sheet3") ' 要合并的工作表名称数组
    For Each Ws In WsArr
        LastCol = Ws.Cells(1, Ws.Columns.Count).End(xlToLeft).Column
        EndRow = Ws.Cells(Ws.Rows.Count, LastCol).End(xlUp).Row
        DataArr = Ws.Range(Cells(1, 1), Cells(EndRow, LastCol)).Value
        
        If ToRng Is Nothing Then
            Set ToRng = ActiveSheet.Range(Cells(1, 1), Cells(1, LastCol))
        Else
            Set ToRng = Union(ToRng, ActiveSheet.Range(Cells(ToRng.Rows.Count + 1, 1), _
                                Cells(ToRng.Rows.Count + EndRow, LastCol)))
        End If
    Next Ws
    
    ToRng.Value = DataArr
End Sub

在这个代码中,首先定义变量EndRowDataArrToRng。然后,定义一个变量数组WsArr来存储要合并的工作表名称。

接着,循环遍历WsArr数组,对于每个工作表Ws,使用LastCol变量来存储工作表中最后一列的列号,EndRow变量来存储工作表中最后一行的行号。

然后,使用Range方法来获取工作表Ws中从A1到最后一列、最后一行的单元格区域,并将该区域的值存储到DataArr数组中。

如果ToRng变量为空,则将工作表ActiveSheet中从A1到最后一列的单元格区域设置为ToRng变量的值。否则,将工作表ActiveSheet中从ToRng变量的最后一行+1到EndRow行、从A列到最后一列的单元格区域与ToRng变量的值进行合并,并将合并后的结果设置为ToRng变量的值。

最后,使用Value属性将DataArr数组中的值复制到ToRng变量的值中。

这样,就可以将多个工作表中的数据合并到一个新的工作表中,即使合并区域的列数不确定。

注意事项

  • 在使用上述代码之前,请确保要合并的工作表都位于同一个工作簿中。
  • 如果要合并的工作表中包含空单元格,则这些空单元格在合并后将被忽略。
  • 如果要合并的工作表中包含公式,则这些公式在合并后将被复制到新的工作表中,但不会被重新计算。
  • 如果要合并的工作表中包含格式,则这些格式在合并后将被复制到新的工作表中。