【问题标题】:vba Excel Paste Values: automatic: Error 1004 manual: OKvba Excel粘贴值:自动:错误1004手动:确定
【发布时间】:2017-03-27 14:09:02
【问题描述】:

奇怪的问题: 我从带有循环的表格中读取了一些值并将它们粘贴到另一张表格中。

我有一个控制模块,它一个接一个地调用另一个模块。

我的问题:如果我通过控制模块进行调用,我会遇到运行时错误 1004。

当我手动启动宏时没问题,一切正常..

这是我的代码:

    [...]
rngname = 3
    temp = 1
    Do Until Cells(lngRow, 1).Value = "test"

        lngLastRowOfSection = Cells(lngRow, 1).End(xlDown).Row

        Set slcFind = Range(Cells(lngRow, 1), Cells(lngLastRowOfSection, 1))
        slcFind.Copy
        Set targetRange = Worksheets("Node Canister VPD").Cells(1, 1)

         targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


        lngRow = Cells(lngLastRowOfSection, 1).End(xlDown).Row
        If lngRow >= Rows.Count Then Exit Do

    Loop

    lngRow = 1

    rngname = 3
    i = 2
    Do Until Cells(lngRow, 1).Value = "test"

        lngLastRowOfSection = Cells(lngRow, 1).End(xlDown).Row

        Set slcFind = Range(Cells(lngRow, 2), Cells(lngLastRowOfSection, 2))
        slcFind.Copy
        Set targetRange = Worksheets("Node Canister VPD").Cells(i, 1)

         targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


        lngRow = Cells(lngLastRowOfSection, 1).End(xlDown).Row
        If lngRow >= Rows.Count Then Exit Do
    i = i + 1
    Loop

[...]

有人知道吗? 这部分代码标注:

targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

最好的问候, 卡兰

【问题讨论】:

  • 明确地将您的对象定义为它们的父对象。例如,Cells(lngRow, 1) 未绑定到任何特定工作表。所以定义到特定的工作表。 Worksheets(1).Cells(lngRow,1) ...例如。
  • 感谢您的提示。但它没有解决我的问题。我不明白...手动启动:没问题。自动启动:运行时错误 1004...
  • 在这么快将其作为解决方案驳回之前,请完全实施它,看看它是否有效。当您不向父母明确声明对象时,代码可能会以看似非常有趣的方式表现。具体来说,它将作用于在代码行运行时恰好处于活动状态的任何工作表,这可能不是您怀疑的工作表。有时问题并不在你认为的地方。
  • 我和斯科特一起做这个。剔除乍一看似乎很明显的问题。可以肯定的是,他或我会首先努力重构您的 VBA,使其在运行代码之前尽可能明确地说明哪个对象接触了哪个工作表/单元格。
  • 我实现了它....但是错了..我是 vba 脚本的新手。但我能够学习:)

标签: vba excel loops copy-paste


【解决方案1】:

Scott Holtzman 是正确的,请在设置范围时定义您的工作表。我能够通过一张包含有效数据的工作表、要粘贴的工作表和另一个完全空白的工作表来重新创建错误。当我从有效工作表运行宏时,它很好,当我在激活空白工作表的情况下运行它时,它会尝试将空白列转换为一行。 Excel 工作表的列多于行,因此它会因为放不下而崩溃。

尝试使用它,将“First”更改为您调用的源表。

Sub test()

Dim Other As New Worksheet
Set Other = Worksheets("First")
lngrow = 1
rngname = 3
    temp = 1
    Do Until other.Cells(lngrow, 1).Value = "test"

        lngLastRowOfSection = Other.Cells(lngrow, 1).End(xlDown).Row

        Set slcFind = Range(Other.Cells(lngrow, 1), Other.Cells(lngLastRowOfSection, 1))
        slcFind.Copy
        Set targetRange = Worksheets("Node Canister VPD").Cells(1, 1)

         targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


        lngrow = Other.Cells(lngLastRowOfSection, 1).End(xlDown).Row
        If lngrow >= Rows.Count Then Exit Do

    Loop

    lngrow = 1

    rngname = 3
    i = 2
    Do Until Other.Cells(lngrow, 1).Value = "test"

        lngLastRowOfSection = Other.Cells(lngrow, 1).End(xlDown).Row

        Set slcFind = Range(Other.Cells(lngrow, 2), Other.Cells(lngLastRowOfSection, 2))
        slcFind.Copy
        Set targetRange = Worksheets("Node Canister VPD").Cells(i, 1)

         targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True


        lngrow = Other.Cells(lngLastRowOfSection, 1).End(xlDown).Row
        If lngrow >= Rows.Count Then Exit Do
    i = i + 1
    Loop

End Sub

【讨论】:

  • 像魅力一样工作!我在错误的地方使用了工作表的定义..我感到羞耻..
猜你喜欢
  • 2017-11-28
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多