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 宏将复制一系列单元格并粘贴到另一个工作簿中

如何从工作表中获取公式单元格并仅更改一次该公式的变量?

VBA按多个标准剪切和粘贴行

选择特定范围的单元格并仅删除突出显示的单元格并向上移动的 VBA

根据行数据复制特定单元格并粘贴到特定工作表上