【问题标题】:What is this vba syntax?这个 vba 语法是什么?
【发布时间】:2017-11-24 12:26:27
【问题描述】:

一位同事给了我一个电子表格供我处理,在查看它后,我在一个宏中发现了这个

    ActiveWorkbook.Worksheets("Outstanding_Work_DB").ListObjects( _
    "BS_Outsanding_Work").Sort.SortFields.Add Key:=Range( _
    "BS_Outsanding_Work[[#All],[Date]]"), SortOn:=xlSortOnValues, Order:= _
    xlAscending, DataOption:=xlSortTextAsNumbers

这是真正的语法吗?我从未在 vba 中看到过类似的东西。

更具体地说,这部分让我感到困惑:

Add Key:=Range( _
    "BS_Outsanding_Work[[#All],[Date]]")

电子表格已经完成了他们想要的几乎所有事情,但是这段代码没有运行,它抛出“对象_global的方法范围失败”错误。

简而言之:方括号是真正的语法吗?如果是,他们想做什么?

【问题讨论】:

  • 我不确定括号,但也许你可以一步一步调试,看看代码在哪里停止运行......
  • 显然这并不完全错误,请参见此处:thespreadsheetguru.com/blog/2014/6/20/… (search for -> Set rng = Range("Table1[#All]").Resize)
  • 它似乎正在尝试对名为“BS_Outstanding_Work”的表进行排序,该对象是否存在于您的工作簿中?
  • @ChrisMack 是的。
  • 这是一个很长的方法链。要找出损坏的部分,请单独运行每个方法,并分配给一个变量。

标签: arrays vba excel sorting


【解决方案1】:

代码没有问题。它实际上是代码的一部分,它按升序对date 列上的表进行排序。

看这个例子。

  1. 假设您有一个名为Outstanding_Work_DB 的工作表
  2. 假设您有一个名为BS_Outsanding_Work 的表
  3. 假设您的表格如下所示

表格

如果您想按日期按升序对该表进行排序,那么您可以使用此代码

Sub Sample()
    '~~> PART 1
    ActiveWorkbook.Worksheets("Outstanding_Work_DB").ListObjects("BS_Outsanding_Work").Sort. _
        SortFields.Clear

    '~~> PART 2
    ActiveWorkbook.Worksheets("Outstanding_Work_DB").ListObjects("BS_Outsanding_Work").Sort. _
        SortFields.Add Key:=Range("BS_Outsanding_Work[[#All],[Date]]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    '~~> PART 3
    With ActiveWorkbook.Worksheets("Outstanding_Work_DB").ListObjects("BS_Outsanding_Work").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

说明

SortFields.Clear 清除所有 SortFields 对象。 SortFields 集合是 SortField 对象的集合。它允许开发人员在工作簿、列表和自动过滤器上存储排序状态。

ListObjects("Outstanding_Work_DB") 是您的 Excel 表格。

SortFields.Add 创建一个新的排序字段并返回一个 SortFields 对象。

Range("BS_Outsanding_Work[[#All],[Date]]") 表示按日期字段(包括标题)对所有表进行排序。在立即窗口中尝试这两行代码:)

?Range("BS_Outsanding_Work[[#All],[Date]]").Address

?Range("BS_Outsanding_Work[Date]").Address

Order:=xlAscending 是不言自明的。排序必须按升序排列。

代码的最后部分应用代码

总之

  • 第一部分:清除所有SortFields对象
  • 第二部分:创建一个新的排序字段
  • 第三部分:应用排序

代码运行后

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这段代码正在向表中添加排序描述。要执行排序,您可以使用:

    ActiveWorkbook.Worksheets("Outstanding_Work_DB").ListObjects("BS_Outsanding_Work").Sort.Apply
    

    由于 Range 部分失败,我想“日期”列要么不再存在,要么已被重命名。

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2012-07-25
      • 2011-11-13
      • 2014-03-31
      相关资源
      最近更新 更多