【问题标题】:VBA Excel 2016 - Run-time error '1004'VBA Excel 2016 - 运行时错误“1004”
【发布时间】:2017-09-07 20:03:24
【问题描述】:

我正在尝试编写代码以根据主工作表上的 5 个下拉列表(使用数据验证)将数据从一张工作表复制并粘贴到同一工作簿中的主工作表,并为其编写了如下代码,但是每次我得到运行时 1004 错误并且不知道如何解决它时,有没有办法解决这个问题?

Private Sub GO_Click()
Worksheets("Dashboard").Select
If Worksheets("Dashboard").Range(B3) = "National Gallery" And 
Worksheets("Dashboard").Range(B4) = "unframed" And 
Worksheets("Dashboard").Range(B7) = "Product Costings" And 
Worksheets("Dashboard").Range(B5) = "N/A" And 
Worksheets("Dashboard").Range(B6) = "N/A" Then
Worksheets("(7b)").Activate
Worksheets("(7b)").Range(A8, F23).Copy_
Destination = Worksheets("Dashboard").Range(D11)

Else: MsgBox ("No Data")

End If

End Sub

【问题讨论】:

  • 如果您在使用...Range(B3) = ... 时指的是单元格B3,那么您需要包含引号。所以它会是...Range("B3") = ...,目前它会假设B4是一个变量,它可能没有分配任何东西。
  • 这应该是编译错误,如果你在顶部添加Option Explicit。因此建议 - 添加Option Explicit 并重写代码,直到可以编译为止。

标签: vba excel runtime-error


【解决方案1】:

复制行后放这个:

Worksheets("Dashboard").activate
range("D11").pasteSpecial xlpastevalues 'or just paste depends on your need

别忘了把 " 放在范围内("x") 希望有效

【讨论】:

    【解决方案2】:

    Jean-Pierre Oosthuizen 是正确的。在您的范围中添加逗号将为您解决 1004 问题。下面的代码现在应该适合你了。

    Private Sub GO_Click()
    Worksheets("Dashboard").Activate
    If Worksheets("Dashboard").Range("B3") = "National Gallery" And _
    Worksheets("Dashboard").Range("B4") = "unframed" And _
    Worksheets("Dashboard").Range("B7") = "Product Costings" And _
    Worksheets("Dashboard").Range("B5") = "N/A" And _
    Worksheets("Dashboard").Range("B6") = "N/A" Then
    Worksheets("(7b)").Activate
    Worksheets("(7b)").Range("A8", "F232").Copy_
    Destination = Worksheets("Dashboard").Range("D11")
    
    Else: MsgBox ("No Data")
    
    End If
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      除非B3B4 等是全局变量,否则您要求的.Range(null) 是无效的。作为@Jean-PierreOosthuizen said,你想要.Range("B3")

      此外,除非您有一个名为“(7b)”的工作表(包括括号“()”),否则您对Worksheets("(7b)") 的引用接下来将失败。


      奖励代码审查:

      进行适当的缩进-它使您的代码更加更具可读性!未来的你(就像一周后的你)会感谢现在的你这样做。 Rubberduck VBA* 会为您做到这一点,并指出许多其他可以使您的代码更好的事情,例如:

      • 消除 Worksheets("Dashboard").Select - 您在明确指定所有工作表引用方面做得非常出色,因此您不需要 .Select 一个。
      • 消除Worksheets("(7b)").Activate - 同上
      • 去掉多行 Else: MsgBox ("No Data") 并用两行代码替换它 - 它更具可读性。

      *我还不是 Rubberduck 项目的贡献者,但我是一个快乐的用户,并且从他们那里学到了很多关于更好编码的知识

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多