VBA Excel - 如何在两个粗体单元格之间进行排序

时间:2016-03-29 10:55:01

标签: excel vba excel-vba sorting

在Excel中,我们有一个项目管理文件,其中不同的任务分配给不同的项目和日期。

每个项目的第一项任务是粗体字母,同一项目的每个其他条目都是常规的。然后,当添加另一个任务时,第一个条目再次为粗体,其余条件为常规。

问题是到目前为止,完全忽略了任务的日期。它们几乎只是按项目和它们添加到数据库的顺序排序。

现在我可以明确地按日期对它进行排序,但之后我会失去按项目排序,这也非常重要。我需要找到一种方法来保持按项目排序的任务,除此之外,按日期排序。

在excel中,条目如下所示:

enter image description here

(由于显而易见的原因,无法向您展示其余部分。在此示例中,行已订购,但这仅仅是因为员工手动添加它们。其他员工大多忽略其中的日期他们做了一个特定的任务,只是添加他们记忆的方式)

所以我想要做的就是浏览每个工作表并按照"开始"的内容对行进行排序。柱。首先,我想在两个包含粗体字母的单元格之间对所有内容进行排序。之后,我想重新排列"组"按日期排序的行也。因此,整个项目也按日期排序。

我之前的所有尝试都是对所有内容进行了排序并丢失了项目顺序,或者他们根本没有做任何事情。我是一个完整的编程初学者。

我喜欢任何提示或帮助。

提前致谢

修改

这是一个更大的样本。遗憾的是我无法发布任何文件。列已修复,行数因员工而异。有些是两排短,有些继续排到第50行。

问题再一次是对项目STACKOVERFLOW111下的任务进行排序,然后对项目STACKOVERFLOW222下的任务进行排序,然后对大型"组进行排序。再次,没有混合他们。

[enter image description here

1 个答案:

答案 0 :(得分:0)

在最后一个屏幕截图示例

之后

已编辑

你可以试试这个

Option Explicit

Sub main()
Dim dataRng As Range
Dim sortCol As Long, helperCol As Long

Set dataRng = ActiveSheet.Range("B4:H11") '.SpecialCells(xlCellTypeConstants)
sortCol = 6 '<<==  "Start" dates column is column "F" -> column index 6
With dataRng
    helperCol = .Columns(.Columns.Count).Column + 1
    Names.Add name:="bolds", refersTo:="=GET.CELL(20,OFFSET(INDIRECT(""RC"",FALSE),0,-" & helperCol - sortCol & "))"
    With .Offset(, helperCol - .Columns(1).Column).Resize(, 1)
        .FormulaR1C1 = "=if(bolds,RC" & sortCol & ","""")"
        .Offset(, 1).FormulaR1C1 = "=if(RC[-1]<>"""", RC[-1] + countif(R1C[-1]:R[-1]C[-1],RC[-1])*0.01,R[-1]C+0.0001)"
    End With
    .Resize(, .Columns.Count + 2).Sort key1:=.Columns(.Columns.Count + 2), order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlNo
    .Columns(.Columns.Count + 1).Resize(, 2).Clear
End With

End Sub

以下警告

  • 它使用了Names集合。所以第一次运行时会设置一个名为“bolds”的“名称”,然后在整个工作簿中显示该名称。

  • 它使用“GET.CELL”函数,这是一个来自“旧”Excel 4.0宏语言的宏函数。在我的Excel 2013中它可以工作!

  • 我假设您有少于100个相等的“开始”日期,并且每个“开始”日期少于100个“子”日期。 如果不是这样,你可以通过编辑0.01

  • 行的最后一部分0.0001.Offset(, 1).FormulaR1C1 =...来轻松扩大“容量”。
  • 正如您可以看到在执行时逐步执行代码,它使用两个“帮助”列来构建排序索引,这些列最终会被删除。