【问题标题】:VBA error: "Runtime Error 1004: Application defined or object defined error" [duplicate]VBA 错误:“运行时错误 1004:应用程序定义或对象定义错误”[重复]
【发布时间】:2016-02-21 22:06:47
【问题描述】:

我是 vba 和一般编码的新手,目前正在学习关于 udemy 的 vba 课程。在其中一项练习(动态排序)中,我不断收到上述错误。在完全跟随老师的同时被这样卡住是非常令人沮丧的。任何帮助都非常感谢。

Sub Sort()
'
' Sort Macro
'
ThisWorkbook.Activate

Range("a2").Select

'find last row

mylr = ThisWorkbook.Sheets("sheet1").Cells(Rows.Count, 1).End(x1up).Row


ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2:C5"),    _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("A1:C5")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub

【问题讨论】:

  • 哪一行报错了?我宁愿不猜。

标签: vba excel


【解决方案1】:

我不想让您脱离课程计划的流程,但这看起来像是手动排序操作中记录的代码,非常冗长。实际上,您只需要以下内容。

我建议您练习设置 VBE 的工具 ► 选项 ► 编辑器 ► Require variable declaration 或手动将 Option Explicit¹ 放在每个模块代码表的顶部。目前,x1up 常量拼写错误。

Sub mySort()
    ' Sort Macro

    'reference the workbook and worksheet
    With ThisWorkbook.Sheets("sheet1")
        'reference the range to receive the sorting method
        With .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp).Offset(0, 2))
            'sort the cells based on the third column in a descending order
            .Cells.Sort Key1:=.Columns(3), Order1:=xlDescending, _
                        Orientation:=xlTopToBottom, Header:=xlYes
        End With
    End With

End Sub

切勿将您的子过程命名为与保留字相同。这有效地覆盖了该命令或常量的功能,以支持较新的名称。通过将函数命名为Sub Sort(),然后尝试调用Range.Sort method,您的子过程可以有效地尝试调用自身。


¹ 在 VBE 的工具 ► 选项 ► 编辑器属性页面中设置 需要变量声明 会将 Option Explicit 语句放在每个新创建的代码的顶部床单。这个 将避免愚蠢的编码错误,如拼写错误,并影响您在变量中使用正确的变量类型 宣言。动态创建的没有声明的变量都是变体/对象类型。使用 Option Explicit 是 被广泛认为是“最佳实践”。

【讨论】:

  • 谢谢吉普!正如我所说,我是一个完整的初学者,所以感谢您的耐心和可以理解的回应。我应该提到我正在做的特定课程是介绍记录宏功能。无论如何,这不是整个课程的基础。
【解决方案2】:

线路错误?

mylr = ThisWorkbook.Sheets("sheet1").Cells(Rows.Count, 1).End(x1up).Row

对了,myLr 是做什么用的?

【讨论】:

  • 1l 问题的好眼力。代码本身还有其他重大问题。
  • 嗨。查找列中的最后一行。
  • Oke... 找到列中的最后一行。但是由于该值从未在您的函数中使用过,因此它没用。错误可能来自它。只需删除该行,您的功能就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多