【问题标题】:What is the proper syntax when sorting? 1004 Error排序时正确的语法是什么? 1004 错误
【发布时间】:2019-09-07 04:47:02
【问题描述】:

我正在尝试使用 VBA 对动态范围进行排序,但遇到错误。我是 VBA 新手,所以我认为这可能是语法问题,但我一直无法在此站点或其他站点上找到解决方案。

我已经:

  1. 对我使用的每个范围都使用了工作表对象引用。
  2. 复制了一个早期有效的代码块,只是将工作表引用更改为正确的工作表。
  3. 添加了每次排序后清除排序字段的代码。
  4. 我已将.Apply 移到End With 之后。

这些都不起作用。

问题代码如下:

With Worksheets("Shipping").Sort
    .SortFields.Add Key:=Worksheets("Shipping").Range("A1"), Order:=xlAscending
    .SortFields.Add Key:=Worksheets("Shipping").Range("C1"), Order:=xlAscending
    .SortFields.Add Key:=Worksheets("Shipping").Range("D1"), Order:=xlAscending
    .SetRange Worksheets("Shipping").Range("A1:J" & Worksheets("Shipping").Range("B2").End(xlDown).Row)
    .Header = xlYes
End With

Worksheets("Shipping").Sort.Apply
Worksheets("Shipping").SortFields.Clear

这是有效的代码,位于问题代码之前:

With Worksheets("Backorders").Sort
    .SortFields.Add Key:=Worksheets("Backorders").Range("J1"),Order:=xlAscending
    .SortFields.Add Key:=Worksheets("Backorders").Range("A1"),Order:=xlAscending
    .SortFields.Add Key:=Worksheets("Backorders").Range("C1"),Order:=xlAscending
    .SortFields.Add Key:=Worksheets("Backorders").Range("D1"),Order:=xlAscending
    .SetRange Worksheets("Backorders").Range("A1:J" & Worksheets("Backorders").Range("B2").End(xlDown).Row)
    .Header = xlYes
    .Apply
    .SortFields.Clear
End With

每次尝试调试,我都会收到以下错误:

运行时错误“1004”:
应用程序定义或对象定义的错误

【问题讨论】:

  • 错误在哪一行?
  • 会遍历整个block,但是尝试.Apply时会弹出错误
  • 尝试清除块前的排序字段。
  • 也尝试过。它“有效”,因为它不会出错,但它会在有机会应用排序之前清除排序字段,这意味着实际上没有排序。
  • 在开始添加字段之前清除,而不是之后。

标签: excel vba


【解决方案1】:

@GSerg 在添加字段之前清除排序似乎有效。

这是最终代码:

 With Worksheets("Shipping").Sort
     .SortFields.Clear
     .SortFields.Add Key:=Worksheets("Shipping").Range("A1"), Order:=xlAscending
     .SortFields.Add Key:=Worksheets("Shipping").Range("C1"), Order:=xlAscending
     .SortFields.Add Key:=Worksheets("Shipping").Range("D1"), Order:=xlAscending    
     .SetRange Worksheets("Shipping").Range("A1:J" & Worksheets("Shipping").Range("B2").End(xlDown).Row)
      .Header = xlYes
      .Apply
      .SortFields.Clear
 End With

我不知道为什么我需要在我的代码的其他部分执行此操作,但出于某种原因这是必要的。

【讨论】:

  • 这意味着您已经为该工作表指定了一些冲突的排序选项。您可以只调用一次 Clear 并保存文件,然后在排序之前不需要再次调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多