最后一列命令间歇覆盖现有单元格vba
我正在开发一个程序,在这个程序中,我需要将多个工作表中的数据复制并重新组织到一个主工作表中。每张纸一行。从G列到R列,我需要设置一个if语句,这样,如果工作表上的值大于0,它将被复制/粘贴到其行中的下一个可用列。为了进行测试,我去掉了if语句,所以我总是得到一个结果。我遇到的问题是,在数据的第一行上,“B”列被覆盖,后续行按预期工作。你知道为什么会这样吗最后一列命令间歇覆盖现有单元格vba,vba,excel,Vba,Excel,我正在开发一个程序,在这个程序中,我需要将多个工作表中的数据复制并重新组织到一个主工作表中。每张纸一行。从G列到R列,我需要设置一个if语句,这样,如果工作表上的值大于0,它将被复制/粘贴到其行中的下一个可用列。为了进行测试,我去掉了if语句,所以我总是得到一个结果。我遇到的问题是,在数据的第一行上,“B”列被覆盖,后续行按预期工作。你知道为什么会这样吗 Sub CopyRangeFromMultiWorksheets() Dim sh As Worksheet Dim
Sub CopyRangeFromMultiWorksheets()
Dim sh As Worksheet
Dim DestSh As Worksheet
Dim LastR As Long
Dim LastC As Long
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
'Delete the sheet "Master" if it exist
Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Worksheets("Master").Delete
On Error GoTo 0
Application.DisplayAlerts = True
'Add a worksheet with the name "Master"
Set DestSh = ActiveWorkbook.Worksheets.Add
DestSh.Name = "Master"
'loop through all worksheets and copy the data to the DestSh
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> DestSh.Name Then
'Find the last row with data on the DestSh
With ActiveSheet
LastR = .Cells(.Rows.Count, "a").End(xlUp).Row
End With
With ActiveSheet
LastC = .Cells(LastR, .Columns.Count).End(xlToLeft).Column
End With
sh.Range("B2").Copy
DestSh.Cells(LastR + 1, "A").PasteSpecial xlPasteValues 'customer'
DestSh.Cells(LastR + 1, "B").Value = ("Glass") 'Product"
DestSh.Cells(LastR + 1, "C").Value = sh.Name 'Color Name
sh.Range("H32").Copy
DestSh.Cells(LastR + 1, "D").PasteSpecial xlPasteValues 'based on QTY'
DestSh.Cells(LastR + 1, "E").Value = ("Liters") 'based on Units'
DestSh.Cells(LastR + 1, "F").Value = ("Clear") 'Base'
sh.Range("F13").Copy
DestSh.Cells(LastR + 1, LastC + 1).PasteSpecial xlPasteValues 'THIS IS THE LINE GIVING ME TROUBLE'
End If
Next
ExitTheSub:
Application.Goto DestSh.Cells(1)
'AutoFit the column width in the DestSh sheet
DestSh.Columns.AutoFit
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
多工作表()的子副本范围
将sh设置为工作表
将DestSh设置为工作表
暗淡的最后一样长
长的
应用
.ScreenUpdate=False
.EnableEvents=False
以
'删除工作表“主控”如果存在
Application.DisplayAlerts=False
出错时继续下一步
活动工作簿。工作表(“主”)。删除
错误转到0
Application.DisplayAlerts=True
'添加名为“Master”的工作表'
设置DestSh=ActiveWorkbook.Worksheets.Add
DestSh.Name=“Master”
'循环浏览所有工作表并将数据复制到DestSh
对于ActiveWorkbook.工作表中的每个sh
如果sh.Name DestSh.Name那么
'查找DestSh上包含数据的最后一行
使用ActiveSheet
LastR=.Cells(.Rows.Count,“a”).End(xlUp).Row
以
使用ActiveSheet
LastC=.Cells(LastR、.Columns.Count).End(xlToLeft).Column
以
sh.Range(“B2”)。副本
DestSh.单元格(LastR+1,“A”).paste特殊XLPaste值“客户”
设计单元(LastR+1,“B”)。值=(“玻璃”)产品
DestSh.Cells(LastR+1,“C”).Value=sh.Name'颜色名称
sh.Range(“H32”)。副本
删除单元格(LastR+1,“D”)。粘贴特殊XLPaste值“基于数量”
设计单元(LastR+1,“E”)。值=(“升”)“基于单位”
DestSh.Cells(LastR+1,“F”).Value=(“Clear”)“Base”
sh.Range(“F13”)。副本
DestSh.Cells(LastR+1,LastC+1).paste特殊XLPaste值“这是给我带来麻烦的那行”
如果结束
下一个
退出主题:
应用程序。转到DestSh。单元格(1)
'自动调整DestSh工作表中的列宽
DestSh.Columns.AutoFit
应用
.ScreenUpdate=True
.EnableEvents=True
以
端接头
尝试用
DestSh
替换ActiveSheet
,可能这就是问题的原因:
'Find the last row with data on the DestSh
With DestSh
LastR = .Cells(.Rows.Count, "a").End(xlUp).Row
End With
With DestSh
LastC = .Cells(LastR, .Columns.Count).End(xlToLeft).Column
End With
在您的情况下,
LastC=.Cells(LastR,.Columns.Count).End(xlToLeft).Column
不返回父工作表中的最后一列,而是返回行LastR
中的最后一列。对于真正的最后一列,请尝试以下操作:
LastC = LastRow(DestSh)
Function LastRow(sh As Worksheet)
On Error Resume Next
LastRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
End Function
这是值得一读的-你能不能也放一些屏幕截图?代码实际上看起来还不错。我怀疑问题出在你的
ActiveSheet
上。如果你的ActiveSheet
是新添加的“Master”表,你会在第一个实例中将值添加到B列,因为当你得到该列的计数时,这是在您在工作表中添加任何数据之前,因此在此阶段,您的计数将为1。一旦开始添加数据,您将获得正确的列计数。在您在工作表中添加值后,尝试获取列和行计数。此外,根据@vityta建议,我强烈建议不要使用ActiveSheet
。始终保持质量吹嘘你的sheets@Zac我尝试了Vityata的建议,但我得到了相同的结果。我的建议与Vityata的不同。我建议您在添加行中的值后获得列计数。我引用Vityata的答案的唯一原因是因为我不喜欢使用ActiveSheet
。这会给您带来麻烦问题是,您不是在寻找最后一列,而是在寻找最后一行的最后一列。这是非常不同的。谢谢,但它仍然在覆盖。我正在向op添加一个屏幕截图。现在,我已将包含最后一个c定义的“With statement”替换为您刚刚发布的代码,并且我得到了“error 424 object required”“调试指向该块。谢谢您的帮助。顺便说一句@hithenameisbj-请仔细查看代码,其中有一些.rng
,未定义。一般来说,请参阅编辑。这在lastc的定义下为我提供了一个“预期结束子”。如果我试图在不改变代码的情况下再次运行,我会得到指向“for Each sh in”的“for control variable ready in use”。此时,我正在考虑设置一个固定的粘贴位置,让它使用if语句为单元格指定“0”值,并使用单独的代码删除0。@hithenameisbj-应将LastC=LastRow(DestSh)
放在代码中LastC=.cells(LastR,.Columns.Count).End(xlToLeft).Column
的位置。然后,在代码的最后一个End子部分
之后,在Error Resume Next LastRow=sh.Cells上编写函数LastRow(sh作为工作表)。查找(What:=“*”,…等