我有多个工作表,其中大多数具有相同的标题,但一个(1)工作表具有不同的标题
我有这段代码可以将它们全部结合起来
Sub combined()
Dim xWs As Worksheet
On Error Resume Next
Set xWs = ActiveWorkbook.Worksheets.Add(Sheets(1))
xWs.name = "Combined"
Worksheets(2).Range("A1").EntireRow.Copy Destination:=xWs.Range("A1")
For i = 2 To Worksheets.Count
Worksheets(i).Range("A1").CurrentRegion.Offset(1, 0).Copy _
Destination:=xWs.Cells(xWs.UsedRange.Cells(xWs.UsedRange.Count).Row + 1, 1)
Next
Dim s As Worksheet, t As String
Dim j As Long, K As Long
K = Sheets.Count
For j = K To 1 Step -1
t = Sheets(j).name
If t <> "Combined" Then
Application.DisplayAlerts = False
Sheets(j).Delete
Application.DisplayAlerts = True
End If
Next j
子目录结束
它工作得很好,但我想将我的 1 张表插入到 D 列的最后一列
sheet3 不包含另一张表示例的前 3 列
Sheet1、Sheet2 和 Sheet 4 包含以下列
Branch | Population | Store | name | age | ...
而 sheet3 包含
name | age | ...
其余的都相同,只有前 3 列不同。我不知道要添加什么代码才能将其插入到指定的列中。
哦,它们包含不同的数据值
谢谢!
答案1
简单但不太动态的方法是更改 sheet3 的复制过程。只需if
在循环中添加一个,如下所示:
For i = 2 To Worksheets.Count
If i <> 4 Then
Worksheets(i).Range("A1").CurrentRegion.Offset(1, 0).Copy _
Destination:=xWs.Cells(xWs.UsedRange.Cells(xWs.UsedRange.Count).Row + 1, 1)
Else
Worksheets(i).Range("A1").CurrentRegion.Offset(1, 0).Copy _
Destination:=xWs.Cells(xWs.UsedRange.Cells(xWs.UsedRange.Count).Row + 1, 4)
End If
Next i
这会将整个“粘贴”部分移动工作表 3 的 3 列。
根据其他工作表的列如何变化,您可以计算列数并进行相应的移动,甚至无需使用语句if
。
如果从左到右始终缺少列,并且 Sheet1 被用作表格大小的基础(如此代码中所示),那么您可以做一些更动态的事情,如下所示:
Dim xWs As Worksheet, i As Long, lCol As Long, mCol As Long
Set xWs = ActiveWorkbook.Worksheets.Add(Sheets(1))
xWs.Name = "Combined"
mCol = Worksheets(2).Cells(1, Columns.Count).End(xlToLeft).Column + 1
Worksheets(2).Range("A1").EntireRow.Copy Destination:=xWs.Range("A1")
For i = 2 To Worksheets.Count
lCol = Worksheets(i).Cells(1, Columns.Count).End(xlToLeft).Column
Worksheets(i).Range("A1").CurrentRegion.Offset(1, 0).Copy _
Destination:=xWs.Cells(xWs.UsedRange.Cells(xWs.UsedRange.Count).Row + 1, mCol - lCol)
Next i
或者一些更高级的方法,比较每列的名称。