【问题标题】:Broken Excel VBA Macro Run-time error '1004': Method 'Range' of object '_Global' failed损坏的 Excel VBA 宏运行时错误“1004”:对象“_Global”的方法“范围”失败
【发布时间】:2015-02-10 06:46:07
【问题描述】:

我有一个宏,名为“隐藏已完成”,自 4 月以来一直有效。该宏应该按完成日期对项目进行排序,然后隐藏在完成日期字段中包含数据的行。出于某种原因,它上周失败了,我无法确定出了什么问题。一个相同的宏正在另一个选项卡上运行(表和字段名称的不同名称),它工作正常。我在 Stack Overflow(或其他站点)上没有找到任何与我的问题足够接近的线程来提供帮助。这是宏:

    Sub hideCompleted()
'

' showCompleted Macro
'
    Application.ScreenUpdating = False
'
    Range("A1").Select
    ActiveSheet.ListObjects("Table2").Range.AutoFilter Field:=1

' sortDataByDate Macro
'
    ActiveWorkbook.Worksheets("Project List").ListObjects("Table2").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Project List").ListObjects("Table2").Sort.SortFields.Add _
        Key:=Range("Table2[[#All],[Complete" & Chr(10) & "Date]]"), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Project List").ListObjects("Table1").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
'

' hideCompleted Macro
'

'
    Range("A2").Select
    ActiveSheet.ListObjects("Table2").Range.AutoFilter Field:=1, Criteria1:="="

    Application.ScreenUpdating = True

End Sub

Excel 提请注意:运行时错误“1004”:对象“_Global”的方法“范围”失败。

但调试器中突出显示的代码是:

我检查了单个单元格中的字符数,看看我是否超过了 911 个字符的限制(尤其是评论列中的单元格 - F 列)。事实并非如此。我还附上了一张 Excel 工作表的图片,以说明它是如何使用的。任何帮助表示赞赏。

【问题讨论】:

  • 我在 Stack Overflow(或其他站点)上没有找到任何足够接近的线程 哪些线程?此错误有一个非常常见的原因...
  • 您最近是否将第一列的标签从“Complete & Chr(10) & Date”更改为“Complete & Chr(10) & Date/closed”?您的代码引用了前者,而您的表格图像包含后者。
  • 大卫,我在问题框中输入了文本“运行时错误'1004':对象'_Global'的方法'范围'失败”并查看了建议问题中的所有链接以确认那个我的还没有被覆盖。
  • Excel 开发人员,这就是问题所在。谢谢你。如此简单的事情怎么会被忽视,这总是让我感到惊讶。我进行了 3 个多小时的追逐,试图在代码中找到问题,而实际上它一直是电子表格(操作员错误)。

标签: vba excel


【解决方案1】:

如果您的问题是我认为的那样,那么许多其他答案都会解决它。

您为 Key 参数提供的参数不是完全限定的,因此它是隐式执行的:

ActiveWorkbook.Worksheets("Project List").ListObjects("Table2").Sort.SortFields.Add _
    Key:=ActiveSheet.Range("Table2[[#All],[Complete" & Chr(10) & "Date]]"), SortOn:=xlSortOnValues, _
    Order:=xlAscending, DataOption:=xlSortTextAsNumbers

当然,如果 ActiveSheet 在运行时是 "Project List" 以外的任何工作表,这当然可能会失败。

通过将 Range 对象限定为适当的工作表来解决它:

Dim wsProjectList as Worksheet
Set wsProjectList = ActiveWorkbook.Worksheets("Project List")

wsProjectList.ListObjects("Table2").Sort.SortFields.Add _
    Key:=wsProjectList.Range("Table2[[#All],[Complete" & Chr(10) & "Date]]"), _
    SortOn:=xlSortOnValues, _
    Order:=xlAscending, DataOption:=xlSortTextAsNumbers

【讨论】:

  • 大卫,谢谢你的建议。我已将其添加到代码中以使其更加健壮。我想补充一点,激活此宏的按钮仅在项目列表工作表上。下次我尝试使用这个宏时,我仍然希望有一个更健壮的代码可用(如果它在“家庭”电子表格上,而不是包含数据的电子表格上)。我不能用你的建议将它标记为已解决,但我一定会投赞成票。
  • 干杯!我没有达到@ExcelDevelopers 所做的那样,但这将是另一个常见原因。 1004 通常意味着您正在尝试引用不存在的集合的成员(即,不存在的工作表名称,不存在的命名范围等)。最常见的原因是未能限定对象(我的猜测),并且可能“错别字”紧随其后。很高兴您能够解决问题!
【解决方案2】:

答案是错误所在行的引用字段已更改。如果您将此公式中的字段名称更新为正确的名称,则代码将毫无问题地执行。

但是,在未来,除非您 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
    相关资源
    最近更新 更多