【问题标题】:Excel VBA: Run-time error '1004' Application-defined or object-defined errorExcel VBA:运行时错误“1004”应用程序定义或对象定义错误
【发布时间】:2018-08-15 12:31:21
【问题描述】:

我已经为我们在工作场所使用的清单编写了一段代码 - 这已经工作了 6 个月没有任何问题,现在我突然收到“运行时错误 '1004' 应用程序定义或对象定义的错误”由这一行引起:

Range("U" & ar).Formula = "=IF('PCA & Feedback'!Q" & ar & "=""Y"", 'PCA & Feedback'R" & ar & ", IF('PCA & Feedback'!N" & ar & "="""", 'PCA & Feedback'!M" & ar & ", 'PCA & Feedback'!N" & ar & "))"

我使用的工作表是受保护的,但正如您所见,它们在宏开始时不受保护。代码放在一个模块中,所以这也不应该是问题。我也尝试在每个范围之前指定工作表,但这对我也不起作用(例如,Ov.Range("U" & ar)....)。

在那条线之前一切正常,对于我的一生,我无法弄清楚是什么导致了错误。感谢您提供的任何帮助!

Sub InsertRows()

Dim Ov, Bo, Bi, SU, Co, PF, ws As Worksheet
Dim ar As Long
Dim ce As Range
Set Ov = Sheets("Overview")
Set Bo = Sheets("Booking")
Set Bi = Sheets("Billing")
Set SU = Sheets("Set Up")
Set Co = Sheets("Copy")
Set PF = Sheets("PCA & Feedback")

ar = ActiveCell.Row

Application.ScreenUpdating = False

For Each ws In Worksheets
ws.Unprotect
Next

Bo.Activate
Rows(ar & ":" & ar).EntireRow.Insert
Range("E" & ar).Formula = "=VLOOKUP(C" & ar & ",'Deal Numbers 2015'!$A$2:$B$85,2,FALSE)"
Range("Q" & ar).Formula = "=VLOOKUP(H" & ar & ", Lists!$A$18:$B$25, 2, FALSE)"
Range("R" & ar).Formula = "=WORKDAY(I" & ar & ", -Q" & ar & ")"

Bi.Activate
Rows(ar & ":" & ar).EntireRow.Insert

Range("B" & ar).Formula = "=Booking!B" & ar
Range("C" & ar).Formula = "=Booking!C" & ar
Range("D" & ar).Formula = "=Booking!D" & ar
Range("E" & ar).Formula = "=Booking!I" & ar
Range("F" & ar).Formula = "=Booking!J" & ar
Range("G" & ar).Formula = "=Booking!P" & ar
Range("H" & ar).Formula = "=Booking!F" & ar
Range("I" & ar).Formula = "=Booking!G" & ar
Range("M" & ar).Formula = "=IF(AND(L" & ar & "=""Y"", N" & ar & " = """"), ""Y"", ""N"")"

SU.Activate
Rows(ar & ":" & ar).EntireRow.Insert

Range("B" & ar).Formula = "=Booking!B" & ar
Range("C" & ar).Formula = "=Booking!C" & ar
Range("D" & ar).Formula = "=Booking!D" & ar
Range("E" & ar).Formula = "=Booking!I" & ar
Range("F" & ar).Formula = "=Booking!J" & ar
Range("G" & ar).Formula = "=Booking!P" & ar
Range("L" & ar).Formula = "=WORKDAY(Booking!I" & ar & ", -8)"
Range("N" & ar).Formula = "=IF(AND(COUNTA(O" & ar & ")=1, ISBLANK(M" & ar & ")), ""Y"", ""N"")"

Co.Activate
Rows(ar & ":" & ar).EntireRow.Insert

Range("B" & ar).Formula = "=Booking!B" & ar
Range("C" & ar).Formula = "=Booking!C" & ar
Range("D" & ar).Formula = "=Booking!D" & ar
Range("E" & ar).Formula = "=Booking!I" & ar
Range("F" & ar).Formula = "=Booking!J" & ar
Range("G" & ar).Formula = "='Set Up'!K" & ar
Range("H" & ar).Formula = "='Set Up'!O" & ar
Range("J" & ar).Formula = "=WORKDAY(Booking!I" & ar & ", -7)"
Range("L" & ar).Formula = "=IF(AND(ISNUMBER(SEARCH(""Copy Attached"", M" & ar & ")), ISBLANK(K" & ar & ")), ""Y"", ""N"")"
Range("N" & ar).Formula = "=IF(AND(M" & ar & "=""Copy Attached"", OR(O" & ar & "=""N"", O" & ar & " = """")), ""Y"", ""N"")"

Range("I" & ar).Value = "Awaiting Set Up"
Range("M" & ar).Value = "Copy Not Attached"

PF.Activate
Rows(ar & ":" & ar).EntireRow.Insert
Range("B" & ar).Formula = "=Booking!B" & ar
Range("C" & ar).Formula = "=Booking!C" & ar
Range("D" & ar).Formula = "=Booking!D" & ar
Range("E" & ar).Formula = "=Booking!J" & ar
Range("F" & ar).Formula = "=WORKDAY(Booking!J" & ar & ", 8)"
Range("H" & ar).Formula = "=IF(AND(G" & ar & "=""Y"", I" & ar & "=""""), ""Y"", ""N"")"
Range("M" & ar).Formula = "=WORKDAY(F" & ar & ", 10)"
Range("P" & ar).Formula = "=WORKDAY(O" & ar & ", 10)"

  'Adding Row to Sheet
Ov.Activate

Rows(ar & ":" & ar).EntireRow.Insert

'Adding formulas to Sheet
Range("B" & ar).Formula = "=Booking!B" & ar
Range("C" & ar).Formula = "=Booking!C" & ar
Range("D" & ar).Formula = "=IF(Booking!D" & ar & "=0, """", Booking!D" & ar & "&""-""&Booking!K" & ar & ")"
Range("E" & ar).Formula = "=Booking!F" & ar
Range("F" & ar).Formula = "=Booking!I" & ar
Range("G" & ar).Formula = "=Booking!J" & ar
Range("H" & ar).Formula = "=Booking!H" & ar
Range("I" & ar).Formula = "=ISBLANK(Booking!P" & ar & ")"
Range("J" & ar).Formula = "=IF(D" & ar & "="""", """", IF(Booking!M" & ar & "=""Y"", ""On SF"", ""Not on SF""))"
Range("K" & ar).Formula = "=IF(D" & ar & "="""", """", IF(I" & ar & "=TRUE, J" & ar & ", Booking!P" & ar & "))"
Range("L" & ar).Formula = "=ISBLANK('Set Up'!K" & ar & ")"
Range("M" & ar).Formula = "=Booking!R" & ar
Range("N" & ar).Formula = "=IF(Booking!G" & ar & "=""Y"", 1, 0)"
Range("O" & ar).Formula = "=IF(Booking!N" & ar & "=""Closed Won"", 1, 0)"
Range("P" & ar).Formula = "=IF(D" & ar & "="""", """", IF(SUM(N" & ar & ":O" & ar & ")<2, ""N"", IF(SUM(N" & ar & ":O" & ar & ")=2, ""Y"")))"
Range("Q" & ar).Formula = "=IF(D" & ar & "="""", """", IF(L" & ar & "=TRUE, ""Requested"", 'Set Up'!K" & ar & "))"
Range("R" & ar).Formula = "=IF(D" & ar & "="""", """", IF(Copy!M" & ar & "=""Copy Not Attached"", Copy!I" & ar & ", Copy!M" & ar & "))"
Range("S" & ar).Formula = "=Copy!J" & ar
Range("T" & ar).Formula = "='PCA & Feedback'!I" & ar
Range("U" & ar).Formula = "=IF('PCA & Feedback'!Q" & ar & "=""Y"", 'PCA & Feedback'R" & ar & ", IF('PCA & Feedback'!N" & ar & "="""", 'PCA & Feedback'!M" & ar & ", 'PCA & Feedback'!N" & ar & "))"
Range("V" & ar).Formula = "=IF(COUNTBLANK(Booking!S" & ar & ")+COUNTBLANK('Set Up'!R" & ar & ")+COUNTBLANK(Copy!P" & ar & ")=3, """", Booking!S" & ar & "&""; ""&'Set Up'!R" & ar & "&""; ""&Copy!P" & ar & ")"

For Each ws In Worksheets
ws.Protect , DrawingObjects:=False, AllowFiltering:=True
Next

Bo.Activate
Range("B" & ar).Activate

Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 理想情况下,您应该使用工作表“锚点”进行所有范围访问,即Ov.Range...。或者,您可以使用简单的With Ov ... End With 包装所有范围语句,这样会更有效。至于您的错误,特别是如果所有其他 Range.Formula = ... 语句都在工作,请尝试使用虚拟公式更改错误行,例如 Range("U" &amp; ar).Formula = "=""hello world""" 并查看是否也会给您带来错误。这将有助于指出确切的问题所在。
  • 我不知道答案,但我对带有特殊字符的 'PCA & Feedback'!M" 这样的名称持怀疑态度。这些通常是等待发生的错误。错误是否一直发生独立于数据?还是只有某些数据有错误?
  • 记得将OvBoBiSUCoPF 声明为工作表。目前它们是变体 - 只有 ws 是工作表。

标签: excel vba runtime-error


【解决方案1】:

您的具体问题是公式在PCA &amp; Feedback'R &amp; ar 处缺少!

Range("U" &amp; ar).Formula = "=IF('PCA &amp; Feedback'!Q" &amp; ar &amp; "=""Y"", 'PCA &amp; Feedback'R" &amp; ar &amp; ", IF('PCA &amp; Feedback'!N" &amp; ar &amp; "="""", 'PCA &amp; Feedback'!M" &amp; ar &amp; ", 'PCA &amp; Feedback'!N" &amp; ar &amp; "))"

我已重写代码以包含 With 并不再需要激活每张工作表。
我还注释掉了屏幕更新 - 因为不再激活工作表,所以不应该真的需要它。

注 1: 我写了 ThisWorkbook 的地方是指代码所在的工作簿。
注 2: 使用单元格时With...End With 块内的引用以 . 开头。
所以.Range("E" &amp; ar) 而不仅仅是Range("E" &amp; ar)

Sub InsertRows()

    Dim Ov As Worksheet, Bo As Worksheet, Bi As Worksheet, SU As Worksheet
    Dim Co As Worksheet, PF As Worksheet, ws As Worksheet
    Dim ar As Long
    Dim ce As Range

    With ThisWorkbook
        Set Ov = .Sheets("Overview")
        Set Bo = .Sheets("Booking")
        Set Bi = .Sheets("Billing")
        Set SU = .Sheets("Set Up")
        Set Co = .Sheets("Copy")
        Set PF = .Sheets("PCA & Feedback")
    End With

    ar = ActiveCell.Row

    'Application.ScreenUpdating = False

    For Each ws In ThisWorkbook.Worksheets
        ws.Unprotect
    Next

    'Bo.Activate
    With Bo
        .Rows(ar & ":" & ar).EntireRow.Insert
        .Range("E" & ar).Formula = "=VLOOKUP(C" & ar & ",'Deal Numbers 2015'!$A$2:$B$85,2,FALSE)"
        .Range("Q" & ar).Formula = "=VLOOKUP(H" & ar & ", Lists!$A$18:$B$25, 2, FALSE)"
        .Range("R" & ar).Formula = "=WORKDAY(I" & ar & ", -Q" & ar & ")"
    End With

    'Bi.Activate
    With Bi
        .Rows(ar & ":" & ar).EntireRow.Insert

        .Range("B" & ar).Formula = "=Booking!B" & ar
        .Range("C" & ar).Formula = "=Booking!C" & ar
        .Range("D" & ar).Formula = "=Booking!D" & ar
        .Range("E" & ar).Formula = "=Booking!I" & ar
        .Range("F" & ar).Formula = "=Booking!J" & ar
        .Range("G" & ar).Formula = "=Booking!P" & ar
        .Range("H" & ar).Formula = "=Booking!F" & ar
        .Range("I" & ar).Formula = "=Booking!G" & ar
        .Range("M" & ar).Formula = "=IF(AND(L" & ar & "=""Y"", N" & ar & " = """"), ""Y"", ""N"")"
    End With

    'SU.Activate
    With SU
        .Rows(ar & ":" & ar).EntireRow.Insert

        .Range("B" & ar).Formula = "=Booking!B" & ar
        .Range("C" & ar).Formula = "=Booking!C" & ar
        .Range("D" & ar).Formula = "=Booking!D" & ar
        .Range("E" & ar).Formula = "=Booking!I" & ar
        .Range("F" & ar).Formula = "=Booking!J" & ar
        .Range("G" & ar).Formula = "=Booking!P" & ar
        .Range("L" & ar).Formula = "=WORKDAY(Booking!I" & ar & ", -8)"
        .Range("N" & ar).Formula = "=IF(AND(COUNTA(O" & ar & ")=1, ISBLANK(M" & ar & ")), ""Y"", ""N"")"
    End With

    'Co.Activate
    With Co
        .Rows(ar & ":" & ar).EntireRow.Insert

        .Range("B" & ar).Formula = "=Booking!B" & ar
        .Range("C" & ar).Formula = "=Booking!C" & ar
        .Range("D" & ar).Formula = "=Booking!D" & ar
        .Range("E" & ar).Formula = "=Booking!I" & ar
        .Range("F" & ar).Formula = "=Booking!J" & ar
        .Range("G" & ar).Formula = "='Set Up'!K" & ar
        .Range("H" & ar).Formula = "='Set Up'!O" & ar
        .Range("J" & ar).Formula = "=WORKDAY(Booking!I" & ar & ", -7)"
        .Range("L" & ar).Formula = "=IF(AND(ISNUMBER(SEARCH(""Copy Attached"", M" & ar & ")), ISBLANK(K" & ar & ")), ""Y"", ""N"")"
        .Range("N" & ar).Formula = "=IF(AND(M" & ar & "=""Copy Attached"", OR(O" & ar & "=""N"", O" & ar & " = """")), ""Y"", ""N"")"

        .Range("I" & ar).Value = "Awaiting Set Up"
        .Range("M" & ar).Value = "Copy Not Attached"
    End With

    'PF.Activate
    With PF
        .Rows(ar & ":" & ar).EntireRow.Insert
        .Range("B" & ar).Formula = "=Booking!B" & ar
        .Range("C" & ar).Formula = "=Booking!C" & ar
        .Range("D" & ar).Formula = "=Booking!D" & ar
        .Range("E" & ar).Formula = "=Booking!J" & ar
        .Range("F" & ar).Formula = "=WORKDAY(Booking!J" & ar & ", 8)"
        .Range("H" & ar).Formula = "=IF(AND(G" & ar & "=""Y"", I" & ar & "=""""), ""Y"", ""N"")"
        .Range("M" & ar).Formula = "=WORKDAY(F" & ar & ", 10)"
        .Range("P" & ar).Formula = "=WORKDAY(O" & ar & ", 10)"
    End With

      'Adding Row to Sheet
    'Ov.Activate

    With Ov

        .Rows(ar & ":" & ar).EntireRow.Insert

        'Adding formulas to Sheet
        .Range("B" & ar).Formula = "=Booking!B" & ar
        .Range("C" & ar).Formula = "=Booking!C" & ar
        .Range("D" & ar).Formula = "=IF(Booking!D" & ar & "=0, """", Booking!D" & ar & "&""-""&Booking!K" & ar & ")"
        .Range("E" & ar).Formula = "=Booking!F" & ar
        .Range("F" & ar).Formula = "=Booking!I" & ar
        .Range("G" & ar).Formula = "=Booking!J" & ar
        .Range("H" & ar).Formula = "=Booking!H" & ar
        .Range("I" & ar).Formula = "=ISBLANK(Booking!P" & ar & ")"
        .Range("J" & ar).Formula = "=IF(D" & ar & "="""", """", IF(Booking!M" & ar & "=""Y"", ""On SF"", ""Not on SF""))"
        .Range("K" & ar).Formula = "=IF(D" & ar & "="""", """", IF(I" & ar & "=TRUE, J" & ar & ", Booking!P" & ar & "))"
        .Range("L" & ar).Formula = "=ISBLANK('Set Up'!K" & ar & ")"
        .Range("M" & ar).Formula = "=Booking!R" & ar
        .Range("N" & ar).Formula = "=IF(Booking!G" & ar & "=""Y"", 1, 0)"
        .Range("O" & ar).Formula = "=IF(Booking!N" & ar & "=""Closed Won"", 1, 0)"
        .Range("P" & ar).Formula = "=IF(D" & ar & "="""", """", IF(SUM(N" & ar & ":O" & ar & ")<2, ""N"", IF(SUM(N" & ar & ":O" & ar & ")=2, ""Y"")))"
        .Range("Q" & ar).Formula = "=IF(D" & ar & "="""", """", IF(L" & ar & "=TRUE, ""Requested"", 'Set Up'!K" & ar & "))"
        .Range("R" & ar).Formula = "=IF(D" & ar & "="""", """", IF(Copy!M" & ar & "=""Copy Not Attached"", Copy!I" & ar & ", Copy!M" & ar & "))"
        .Range("S" & ar).Formula = "=Copy!J" & ar
        .Range("T" & ar).Formula = "='PCA & Feedback'!I" & ar
        .Range("U" & ar).Formula = "=IF('PCA & Feedback'!Q" & ar & "=""Y"", 'PCA & Feedback'!R" & ar & ", IF('PCA & Feedback'!N" & ar & "="""", 'PCA & Feedback'!M" & ar & ", 'PCA & Feedback'!N" & ar & "))"
        .Range("V" & ar).Formula = "=IF(COUNTBLANK(Booking!S" & ar & ")+COUNTBLANK('Set Up'!R" & ar & ")+COUNTBLANK(Copy!P" & ar & ")=3, """", Booking!S" & ar & "&""; ""&'Set Up'!R" & ar & "&""; ""&Copy!P" & ar & ")"

    End With

    For Each ws In Worksheets
        ws.Protect , DrawingObjects:=False, AllowFiltering:=True
    Next

    Bo.Activate
    Bo.Range("B" & ar).Activate

    'Application.ScreenUpdating = True

End Sub

【讨论】:

  • 啊,太棒了,非常感谢!我整个早上都在看代码,我一定是睁大眼睛错过了!也感谢所有格式 - 刚刚用 excel 文档尝试过,现在速度快了 100 倍,我肯定会在未来使用更多的语句。
  • 我知道那种感觉。尤其是当它过去一直在工作时——你一定是在没有注意到的情况下不小心删除了这个角色。很容易做到。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多