【问题标题】:VBA sorting run time error 438VBA排序运行时错误438
【发布时间】:2015-08-06 22:45:23
【问题描述】:

我在 Access 中使用 VBA 宏将数据放入 Excel。到目前为止一切进展顺利,但现在我在 Excel 中有数据,我想根据我创建的这个新列对数据进行排序。我搜索了不同的排序语法示例,但没有任何效果。最接近的是这个,它给了我一个运行时错误 438“对象不支持这个属性或方法”。我要做的就是根据第一列的数据(只是数字)对整个工作表中的数据进行排序。

Set xlApp = CreateObject("Excel.Application")
With xlApp
.Visible = True
.Workbooks.Add
.Sheets("Sheet1").Select
End With

'More code is here in between that gets data into Excel file
'This code not shown works as expected 

With xlApp
.Range("A1").EntireColumn.Insert
.Cells(1, 1).Value = "DayOfWeek"
For i = 2 To 10000
    .Cells(i, 1).Value = Weekday(xlApp.Cells(i, 2).Value, vbMonday)
Next i
'Works as expected up to here, next line is problem
.Sort Key1:=.Range("A2"), Order1:=xlAscending
End With

编辑:在我初始化 xlApp 的部分中添加,并修复了 Order1 并将 Value 添加到 Cells 调用以使代码更清晰,如建议的那样。另外,应该注意的是,在调试过程中,我可以看到直到排序调用的所有内容都在 Excel 工作簿中给出了正确的输出。

【问题讨论】:

  • 您能否使用 F8 键跟踪您的过程并告诉错误发生在哪一行?
  • 它出现在 .Sort 行。抱歉,我试图将其评论为问题行
  • Sort() 不是 Excel 应用程序对象的方法。也许试试.Range("A1").CurrentRegion.Sort Key1:=.Range("A2"), Order:=xlAscending
  • 尝试出现运行时错误 1004“应用程序定义或对象定义错误”
  • 你能展示更多你的代码吗?特别是xlApp 是如何声明和分配的?

标签: excel vba sorting syntax


【解决方案1】:
    With xlApp
        .Range("A1").EntireColumn.Insert
        .Cells(1, 1).Value = "DayOfWeek"
        For i = 2 To 10000
            .Cells(i, 1) = Weekday(.Cells(i, 2), vbMonday)
        Next i
        'Works as expected up to here, next line is problem
        .Cells.Sort Header:=xlYes, Key1:=.Range("A2"), Order1:=xlAscending
    End With

【讨论】:

  • 试过了,但运行时错误 1004,“范围类的排序方法失败”
  • 你能再试试上面的方法吗?
  • 如果我尝试将它放在一个单独的子目录中,那么它将很难找到我之前制作的 Excel 工作簿。尽管如此,我还是尝试了,它在第三行 (.Range("A1").EntireColumn.Insert) 上给了我一个运行时错误 424 "Object required"
  • 很抱歉给您带来了困惑。将上面的代码放在你之前使用它的地方并删除你创建的单独的子。
【解决方案2】:

我认为这里有很多问题:-

  1. 我怀疑 xlApp 是 Application 对象,您正在尝试对 Worksheet 对象运行操作。将xlApp 替换为声明并分配给Worksheet 的另一个变量,或者直接使用Activesheet

  2. 作为一种好的做法,您应该始终参考Cell 对象的.Value 属性,而不是依赖默认属性。这使得阅读和维护变得更加容易。

  3. Sort 方法不在Worksheet 级别上运行,而是在Range 对象上运行。

  4. 参数Order 不存在。它是Order1,是Key1 的补充。

  5. 据我所知,第 1 行有标题。您需要修改 Sort 语句以跳过对标题进行排序。

这是最后的代码块:

With xlApp.ActiveSheet
  .Range("A1").EntireColumn.Insert
  .Cells(1, 1).Value = "DayOfWeek"
  For i = 2 To 10000
    .Cells(i, 1).Value = Weekday(.Cells(i, 2).Value, vbMonday)
  Next i
  'Works as expected up to here, next line is problem
  .Range("A1").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes
End With

【讨论】:

  • 这些 tid 位非常有用,但不幸的是代码仍然无法正常工作。当我运行此代码时,我收到 1004 错误,因为前几行需要引用 xlApp。即使我只取出最后一行并将其放入自己的 With Active Sheet 块中,我仍然会收到 424“需要对象”错误。如果我将它放在 With xlApp.ActiveSheet 块中,则会收到 1004“范围类的排序方法失败”错误。我不知道语法还有什么问题。
  • 我给你的代码对我来说 100% 有效——我测试了它。此块中是否还有更多您为发布而省略的代码?如果是这样,请把它放上来,这样我就可以得到大图了。您发布的代码显示不依赖于 Worksheet 对象以外的任何内容。
  • 它只是点击了你正在从 Excel 外部运行它。如果您不在 Excel 中,则需要在 Activesheet 前加上 xlApp。我已经更新了我的答案。
【解决方案3】:

您必须在排序之前选择范围:

Dim RngRange As Range
Set RngRange = Sheet.Range("A1:A999")
RngRange.Select
RngRange.Sort Key1:=RngRange, Order1:=xlAscending

如果要对一列进行排序并在结果中包含另一列,则 RngRange 是要排序的所有列,关键是要排序的列

网上的大部分例子其实都是错的,快把我逼疯了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多