MAC VBA尝试从每个工作表中剪切一个单元格并粘贴到下一个空单元格中的另一张表中
Posted
技术标签:
【中文标题】MAC VBA尝试从每个工作表中剪切一个单元格并粘贴到下一个空单元格中的另一张表中【英文标题】:MAC VBA Trying to cut one cell from each worksheet and paste in another sheet in next empty cell 【发布时间】:2019-09-25 12:50:30 【问题描述】:我正在尝试浏览活动工作簿中的每个工作表,其中工作表是作为正在工作的宏的一部分创建的。每次的名字都可能不同,所以我不能只做查找。我想获取一条信息(每个工作表上的相同单元格)并将其粘贴到另一张工作表上的列中的下一个空单元格中。
在第 6 行,我得到错误下标超出范围错误 9。我检查了我要粘贴到的工作表的命名,它是正确的。没有多余的空格。
这让我发疯了。你能帮忙吗?
ps 我正在努力让它在我通常不这样做的 MAC 上运行,所以也许我的代码有点错误。
For Each sh In ThisWorkbook.Worksheets
DoEvents
sh.Activate
Range("K5").Select
Selection.Copy
Sheets("Payment Ref").Range("b2").Select
If Range("b2") = "" Then
Range("b2").PasteSpecial Paste:=xlPasteFormats
Range("b2").PasteSpecial Paste:=xlPasteValues
Else
Range("b2").Offset(1, 0).PasteSpecial xlPasteFormats
Range("b2").Offset(1, 0).PasteSpecial xlPasteValues
End If
Next sh
在运行结束时,Payment Ref 电子表格应该有一列填充了上一个宏部分中创建的发票表中的发票编号。这非常有效。
【问题讨论】:
首先您可能会从阅读How to avoid using Select in Excel VBA 中受益。 • 然后请说出哪一个是第6 行(每个人的计算方式不同)。请告诉哪个代码抛出了错误。 Sheets("Payment Ref").Range("b2").Select 【参考方案1】:避免使用.Select
和.Activate
(参见How to avoid using Select in Excel VBA)并为所有范围引用工作表(例如使用With
)。
您还需要在每次粘贴时找到最后使用的单元格。查找列中最后使用的单元格的一个好方法是:
Cells(Rows.Count, "B").End(xlUp) 'last used cell in column B
所以以下应该适合你
Dim wsDestination As Worksheet
Set wsDestination = ThisWorkbook.Worksheets("Payment Ref")
For Each sh In ThisWorkbook.Worksheets
sh.Range("K5").Copy
With wsDestination.Cells(wsDestination.Rows.Count, "B").End(xlUp).Offset(RowOffset:=1)
.PasteSpecial Paste:=xlPasteFormats
.PasteSpecial Paste:=xlPasteValues
End With
Next sh
【讨论】:
嗨。现在我得到一个编译错误数据成员未找到。我正在研究 MAC,所以我说编码可能略有不同。错误在这一行 sh.Range("K5").Copy asnd range 被突出显示,所以在 MAC 上猜测它必须用不同的措辞。我知道这适用于 PC,但在 MAC 上工作的编码似乎不喜欢它。【参考方案2】:一般情况下,您应避免使用.Select
,如 cmets 中链接的那样。这很可能是您的错误的原因。此外,如果您在超过 1 个或 2 个工作表上执行此代码(取决于 B2
是否已经有一个值),该过程将继续将这些值放在单元格 B3
中。我建议进行以下更改:
For Each sh In ThisWorkbook.Worksheets
sh.Range("K5").Copy
Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteFormats
Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Next sh
我认为这应该也可以:
For Each sh In ThisWorkbook.Worksheets
sh.Range("K5").Copy Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)
Next sh
【讨论】:
请随意投反对票,但也请让我知道您对改进我的答案的建议,否则无法学习。 不是我的 dv,但您确定要粘贴到sh
上吗?看起来这不是 OP 想要的。
谢谢大家。我会尝试建议,让你知道它是怎么回事。感谢 .select 提示
嗨。也试过这个,我在这一行得到一个错误: sh.Range("K5").Copy Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) .突出显示范围 - 未找到编译错误数据成员。正如我所说,我正在研究 MAC,所以代码可能略有不同。以上是关于MAC VBA尝试从每个工作表中剪切一个单元格并粘贴到下一个空单元格中的另一张表中的主要内容,如果未能解决你的问题,请参考以下文章
选择您的 if 语句触发的单元格并在 vba 中选择该单元格
Excel VBA 宏将复制一系列单元格并粘贴到另一个工作簿中