如何解决此"Compile Error: Invalid or Unqualified Reference"



我对 vba 宏完全陌生,似乎找不到解决错误的方法。我有以下代码:

Sub BuilderUpdate()
Range("B2").Copy Worksheets("Pack").Range("B2")
.PasteSpecial xlPasteValues
Range("D2").Copy Worksheets("Pack").Range("C2")
.PasteSpecial xlPasteValues
Range("F2").Copy Worksheets("Pack").Range("D2")
.PasteSpecial xlPasteValues
Range("H2").Copy Worksheets("Pack").Range("E2")
.PasteSpecial xlPasteValues
Range("B3").Copy Worksheets("Pack").Range("F2")
.PasteSpecial xlPasteValues
Range("D3").Copy Worksheets("Pack").Range("G2")
.PasteSpecial xlPasteValues
Range("F3").Copy Worksheets("Pack").Range("H2")
.PasteSpecial xlPasteValues
Range("H3").Copy Worksheets("Pack").Range("I2")
.PasteSpecial xlPasteValues
Range("B4").Copy Worksheets("Pack").Range("J2")
.PasteSpecial xlPasteValues
Range("D4").Copy Worksheets("Pack").Range("K2")
.PasteSpecial xlPasteValues
Range("F4").Copy Worksheets("Pack").Range("L2")
.PasteSpecial xlPasteValues
Range("H4").Copy Worksheets("Pack").Range("M2")
.PasteSpecial xlPasteValues
Range("B5").Copy Worksheets("Pack").Range("N2")
.PasteSpecial xlPasteValues
Range("D5").Copy Worksheets("Pack").Range("O2")
.PasteSpecial xlPasteValues
Range("F5").Copy Worksheets("Pack").Range("P2")
.PasteSpecial xlPasteValues
Range("H5").Copy Worksheets("Pack").Range("Q2")
.PasteSpecial xlPasteValues
Range("B6").Copy Worksheets("Pack").Range("R2")
.PasteSpecial xlPasteValues
Range("D6").Copy Worksheets("Pack").Range("S2")
.PasteSpecial xlPasteValues
Range("F6").Copy Worksheets("Pack").Range("T2")
.PasteSpecial xlPasteValues
Range("H6").Copy Worksheets("Pack").Range("U2")
.PasteSpecial xlPasteValues
Range("B7").Copy Worksheets("Pack").Range("V2")
.PasteSpecial xlPasteValues
Range("D7").Copy Worksheets("Pack").Range("W2")
.PasteSpecial xlPasteValues
Range("F7").Copy Worksheets("Pack").Range("X2")
.PasteSpecial xlPasteValues
Range("H7").Copy Worksheets("Pack").Range("Y2")
.PasteSpecial xlPasteValues
Range("B8").Copy Worksheets("Pack").Range("Z2")
.PasteSpecial xlPasteValues
Range("D8").Copy Worksheets("Pack").Range("AA2")
.PasteSpecial xlPasteValues
Range("F8").Copy Worksheets("Pack").Range("AB2")
.PasteSpecial xlPasteValues
Range("H8").Copy Worksheets("Pack").Range("AC2")
.PasteSpecial xlPasteValues
Range("B9").Copy Worksheets("Pack").Range("AD2")
.PasteSpecial xlPasteValues
Range("D9").Copy Worksheets("Pack").Range("AE2")
.PasteSpecial xlPasteValues
Range("F9").Copy Worksheets("Pack").Range("AF2")
.PasteSpecial xlPasteValues
Range("H9").Copy Worksheets("Pack").Range("AG2")
.PasteSpecial xlPasteValues
Range("B10").Copy Worksheets("Pack").Range("AH2")
.PasteSpecial xlPasteValues
Range("D10").Copy Worksheets("Pack").Range("AI2")
.PasteSpecial xlPasteValues
Range("F10").Copy Worksheets("Pack").Range("AJ2")
.PasteSpecial xlPasteValues
Range("H10").Copy Worksheets("Pack").Range("AK2")
.PasteSpecial xlPasteValues
Range("B11").Copy Worksheets("Pack").Range("AL2")
.PasteSpecial xlPasteValues
Range("D11").Copy Worksheets("Pack").Range("AM2")
.PasteSpecial xlPasteValues
Range("F11").Copy Worksheets("Pack").Range("AN2")
.PasteSpecial xlPasteValues
Range("H11").Copy Worksheets("Pack").Range("AO2")
.PasteSpecial xlPasteValues
Range("B12").Copy Worksheets("Pack").Range("AP2")
.PasteSpecial xlPasteValues
Range("D12").Copy Worksheets("Pack").Range("AQ2")
.PasteSpecial xlPasteValues
Range("F12").Copy Worksheets("Pack").Range("AR2")
.PasteSpecial xlPasteValues
Range("H12").Copy Worksheets("Pack").Range("AS2")
.PasteSpecial xlPasteValues
Range("B13").Copy Worksheets("Pack").Range("AT2")
.PasteSpecial xlPasteValues
Range("D13").Copy Worksheets("Pack").Range("AU2")
.PasteSpecial xlPasteValues
Range("F13").Copy Worksheets("Pack").Range("AV2")
.PasteSpecial xlPasteValues
Range("H13").Copy Worksheets("Pack").Range("AW2")
.PasteSpecial xlPasteValues
Range("B14").Copy Worksheets("Pack").Range("AX2")
.PasteSpecial xlPasteValues
Range("D14").Copy Worksheets("Pack").Range("AY2")
.PasteSpecial xlPasteValues
Range("F14").Copy Worksheets("Pack").Range("AZ2")
.PasteSpecial xlPasteValues
Range("H14").Copy Worksheets("Pack").Range("BA2")
.PasteSpecial xlPasteValues
Range("B15").Copy Worksheets("Pack").Range("BB2")
.PasteSpecial xlPasteValues
Range("D15").Copy Worksheets("Pack").Range("BC2")
.PasteSpecial xlPasteValues
Range("F15").Copy Worksheets("Pack").Range("BD2")
.PasteSpecial xlPasteValues
Range("H15").Copy Worksheets("Pack").Range("BE2")
.PasteSpecial xlPasteValues
Range("B16").Copy Worksheets("Pack").Range("BF2")
.PasteSpecial xlPasteValues
Range("D16").Copy Worksheets("Pack").Range("BG2")
.PasteSpecial xlPasteValues
Range("F16").Copy Worksheets("Pack").Range("BH2")
.PasteSpecial xlPasteValues
Range("H16").Copy Worksheets("Pack").Range("BI2")
.PasteSpecial xlPasteValues
End Sub

但是,当尝试运行代码时,我收到一条错误消息,指出"编译错误:无效或非限定引用",它指向宏的第一行,如下所示 https://puu.sh/GHfuN/45afb283fd.png

我觉得有一个简单的解决方案,但我完全没有看到它。

重构

《守则》

Option Explicit
Sub BuilderUpdate()
Dim Target As Variant
Target = Array("B2", "C2", "D2", "E2", "F2", "G2", "H2", "I2", "J2", "K2", _
"L2", "M2", "N2", "O2", "P2", "Q2", "R2", "S2", "T2", "U2", _
"V2", "W2", "X2", "Y2", "Z2", "AA2", "AB2", "AC2", "AD2", _
"AE2", "AF2", "AG2", "AH2", "AI2", "AJ2", "AK2", "AL2", _
"AM2", "AN2", "AO2", "AP2", "AQ2", "AR2", "AS2", "AT2", _
"AU2", "AV2", "AW2", "AX2", "AY2", "AZ2", "BA2", "BB2", _
"BC2", "BD2", "BE2", "BF2", "BG2", "BH2", "BI2")
Dim Source As Variant
Source = Array("B2", "D2", "F2", "H2", "B3", "D3", "F3", "H3", "B4", "D4", _
"F4", "H4", "B5", "D5", "F5", "H5", "B6", "D6", "F6", "H6", _
"B7", "D7", "F7", "H7", "B8", "D8", "F8", "H8", "B9", "D9", _
"F9", "H9", "B10", "D10", "F10", "H10", "B11", "D11", _
"F11", "H11", "B12", "D12", "F12", "H12", "B13", "D13", _
"F13", "H13", "B14", "D14", "F14", "H14", "B15", "D15", _
"F15", "H15", "B16", "D16", "F16", "H16")
Dim ws As Worksheet
Set ws = Worksheets("Pack")

Dim n As Long
For n = LBound(Source) To UBound(Source)
ws.Range(Target(n)).Value = Range(Source(n)).Value
Next n

MsgBox "Data copied.", vbInformation, "Success"

End Sub
在Excel中,
  • 您可以在两列中记下单元格地址,然后使用公式在工作表引用下方获取以下字符串:

    ="    ws.Range("""&A1&""").Value = Range("""&B1&""").Value"
    

快速修复

Sub BuilderUpdateQF()

Dim ws As Worksheet
Set ws = Worksheets("Pack")
ws.Range("B2").Value = Range("B2").Value
ws.Range("C2").Value = Range("D2").Value
ws.Range("D2").Value = Range("F2").Value
ws.Range("E2").Value = Range("H2").Value
ws.Range("F2").Value = Range("B3").Value
ws.Range("G2").Value = Range("D3").Value
ws.Range("H2").Value = Range("F3").Value
ws.Range("I2").Value = Range("H3").Value
ws.Range("J2").Value = Range("B4").Value
ws.Range("K2").Value = Range("D4").Value
ws.Range("L2").Value = Range("F4").Value
ws.Range("M2").Value = Range("H4").Value
ws.Range("N2").Value = Range("B5").Value
ws.Range("O2").Value = Range("D5").Value
ws.Range("P2").Value = Range("F5").Value
ws.Range("Q2").Value = Range("H5").Value
ws.Range("R2").Value = Range("B6").Value
ws.Range("S2").Value = Range("D6").Value
ws.Range("T2").Value = Range("F6").Value
ws.Range("U2").Value = Range("H6").Value
ws.Range("V2").Value = Range("B7").Value
ws.Range("W2").Value = Range("D7").Value
ws.Range("X2").Value = Range("F7").Value
ws.Range("Y2").Value = Range("H7").Value
ws.Range("Z2").Value = Range("B8").Value
ws.Range("AA2").Value = Range("D8").Value
ws.Range("AB2").Value = Range("F8").Value
ws.Range("AC2").Value = Range("H8").Value
ws.Range("AD2").Value = Range("B9").Value
ws.Range("AE2").Value = Range("D9").Value
ws.Range("AF2").Value = Range("F9").Value
ws.Range("AG2").Value = Range("H9").Value
ws.Range("AH2").Value = Range("B10").Value
ws.Range("AI2").Value = Range("D10").Value
ws.Range("AJ2").Value = Range("F10").Value
ws.Range("AK2").Value = Range("H10").Value
ws.Range("AL2").Value = Range("B11").Value
ws.Range("AM2").Value = Range("D11").Value
ws.Range("AN2").Value = Range("F11").Value
ws.Range("AO2").Value = Range("H11").Value
ws.Range("AP2").Value = Range("B12").Value
ws.Range("AQ2").Value = Range("D12").Value
ws.Range("AR2").Value = Range("F12").Value
ws.Range("AS2").Value = Range("H12").Value
ws.Range("AT2").Value = Range("B13").Value
ws.Range("AU2").Value = Range("D13").Value
ws.Range("AV2").Value = Range("F13").Value
ws.Range("AW2").Value = Range("H13").Value
ws.Range("AX2").Value = Range("B14").Value
ws.Range("AY2").Value = Range("D14").Value
ws.Range("AZ2").Value = Range("F14").Value
ws.Range("BA2").Value = Range("H14").Value
ws.Range("BB2").Value = Range("B15").Value
ws.Range("BC2").Value = Range("D15").Value
ws.Range("BD2").Value = Range("F15").Value
ws.Range("BE2").Value = Range("H15").Value
ws.Range("BF2").Value = Range("B16").Value
ws.Range("BG2").Value = Range("D16").Value
ws.Range("BH2").Value = Range("F16").Value
ws.Range("BI2").Value = Range("H16").Value
End Sub

您的代码(至少)存在 2 个问题:

(1)你可以通过两种方式使用一个范围的Copy-方法:
(1A)第一种方法是提供一个参数,给出Copy的目的地。所以写作

Range("B2").Copy Worksheets("Pack").Range("B2")

将活动表的单元格 B2复制到工作表包的单元格 B2,包括格式设置。这是模拟您在Excel中手动执行的复制和粘贴。不同之处在于,之后粘贴缓冲区为空,您无法使用它发出另一个Paste命令

(1B)第二种方法是使用不带参数的Copy。这就像Excel中的复制命令。之后,您可以发出一个或多个PasteSpecial

Range("B2").Copy 
Worksheets("Pack").Range("B2").PasteSpecial xlPasteValues
Worksheets("Pack").Range("B3").PasteSpecial xlPasteValues

但是,如果您只想将值从一个单元格复制到另一个单元格,则使用起来要简单得多

Worksheets("Pack").Range("B2") = Range("B2")

(2) 使用前导点(如.PasteSpecial)的语法仅在与With- 子句结合使用时才有效。

With Worksheets("Pack").Range("B2")
Range("B2").Copy 
.PasteSpecial xlPasteValues
End With

现在,前导.将告诉 VBA 您使用您在With-语句中声明的对象的成员(在您的情况下是工作表包的单元格 B2)。是否使用With语句是一个品味问题。

将代码更改为此结构,它将起作用

ActiveSheet.Range("B2").复制

工作表("工作表 1")。范围("B2")。粘贴特殊 xl粘贴值

ActiveSheet.Range("D2").复制

工作表("工作表 1")。范围("C2")。粘贴特殊 xl粘贴值

最新更新