【问题标题】:VBA Custom Sorting with "Group-By"使用“分组依据”的 VBA 自定义排序
【发布时间】:2017-03-04 05:36:03
【问题描述】:

我是编写 VBA 的新手。我了解核心编程概念,因为我拥有编程学位,但我再次学习 VBA 语法、方法、它们的常量、限制,只是整个 9。

我的问题很瘦: 我正在尝试使用我拥有的自动排序方法。但是,我需要按三列之一分组。我使用 SQL 的经验让我寻找一种在包含日期的列上使用 group by 的方法。但没有骰子。

样本数据:(根据预期结果)

Column C        Column D    
02/1/2017      TRUCK   
02/1/2017      TRUCK  
02/1/2017      COLLECT  
02/1/2017      HOLLAND  
02/2/2017      TRUCK  
02/2/2017      TRUCK   
02/3/2017      TRUCK  
02/3/2017      COLLECT  
02/4/2017      COLLECT  
02/4/2017      HOLLAND  
02/4/2017      HOLLAND  
02/4/2017      HOLLAND

我一直在寻找解决问题的方法 - 无济于事。这是我遇到的一些问题,但我还没有找到解决方案。

以下链接中的此方法不起作用,因为它侧重于对要排序的行进行分组,我想按包含日期的列进行分组: excel vba: How to Sort Group of Row based on column value

这个链接中的这个方法看起来我可以得到我需要的东西,但还没有答案: Group and combine values in vba

此方法将在 Excel 中创建组。关闭,但我想分组...这个问题的标题应该是“使用 VBA 分组” Group By With VBA

我还找到了一些关于排名的信息,但我很难在这里找到适合它的方法。

我正在运行的代码可以正常排序,但不完全存在。我需要它对 D 列进行排序,同时仍保持 C 列升序。请注意,此代码是我编写的一个单独的模块,用于测试它是如何工作的。请不要指出我需要对 3 列进行排序,但以下仅引用 D 列。我可以将新想法与我必须展示的东西放在一起。

'method to sort values based on carriers defined in a custom list
'carriers are ordered by pickup times
'
Sub CustomSort()

ActiveWorkbook.Worksheets("Outbound Work Status").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Outbound Work Status").Sort.SortFields.Add  Key:=Range("D:D"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
    "Truck,Collect,Holland,LME,YRC", DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Outbound Work Status").Sort
    .SetRange Range("A3:Z9999")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub

非常感谢任何可以指导我解决难题的正确方向的提示!

抱歉,如果这已被询问并解决 - 我似乎找不到它。

谢谢!

【问题讨论】:

  • 样本数据会有所帮助。我们不知道您的数据现在是什么样子以及您希望它是什么样子
  • 我很抱歉 - 这是约会。例如:2/1/2017、2/2/2017、2/3/2017。每个日期有多个条目。我想将所有 2/1/2017 保留在顶部,然后使用提到的自定义排序值。然后是 2/2/2017 和自定义排序值。最终将所有最旧的日期列在最前面,并按照每组日期(例如所有 2017 年 2 月 1 日)的一致自定义排序。如果这没有意义,请告诉我。
  • 我仍然不认为您要实现的目标很明确。也许您可以在排序之前编辑您的问题以包含 D 列中的一些数据,以及您希望它如何处理分组。
  • J. Garth - 我已经编辑包含一个实际的数据样本。上面代码中提到的自定义排序是 TRUCK、COLLECT、HOLLAND 等。因此,示例显示我想使用此自定义顺序并保持日期升序。希望为大家澄清。
  • 我们仍然不知道这个问题。我们只知道“只是不完全存在”。如果您对问题的分析足以提供清晰的解释,那么您很可能会自己提出解决方案

标签: excel vba sorting group-by


【解决方案1】:

按照你的描述进行排序,宏记录器给了我这个:

ActiveWorkbook.Worksheets("Outbound Work Status").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Outbound Work Status").Sort.SortFields.Add _
       Key:= Range("C2:C13"), SortOn:=xlSortOnValues, _
       Order:=xlAscending, DataOption:= xlSortNormal

ActiveWorkbook.Worksheets("Outbound Work Status").Sort.SortFields.Add _
       Key:= Range("D2:D13"), SortOn:=xlSortOnValues, _
       Order:=xlAscending, CustomOrder :="Truck,Collect,Holland,LME,YRC", _
       DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Outbound Work Status").Sort
    .SetRange Range("A1:E13")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

【讨论】:

  • Tim - 这似乎按预期工作。谢谢你。我没有以这种方式尝试过,所以这是我的问题。我尝试使用另一种排序方法对日期和另一列进行排序,然后使用这种排序方法对承运人进行自定义排序(D 列)。只是无法将日期保持在一起-看起来我的原始方法一定是在调用自定义承运人分类时翻转了分类。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多