在Excel中,我们有一个项目管理文件,其中不同的任务分配给不同的项目和日期。
每个项目的第一项任务是粗体字母,同一项目的每个其他条目都是常规的。然后,当添加另一个任务时,第一个条目再次为粗体,其余条件为常规。
问题是到目前为止,完全忽略了任务的日期。它们几乎只是按项目和它们添加到数据库的顺序排序。
现在我可以明确地按日期对它进行排序,但之后我会失去按项目排序,这也非常重要。我需要找到一种方法来保持按项目排序的任务,除此之外,按日期排序。
在excel中,条目如下所示:
(由于显而易见的原因,无法向您展示其余部分。在此示例中,行已订购,但这仅仅是因为员工手动添加它们。其他员工大多忽略其中的日期他们做了一个特定的任务,只是添加他们记忆的方式)
所以我想要做的就是浏览每个工作表并按照"开始"的内容对行进行排序。柱。首先,我想在两个包含粗体字母的单元格之间对所有内容进行排序。之后,我想重新排列"组"按日期排序的行也。因此,整个项目也按日期排序。
我之前的所有尝试都是对所有内容进行了排序并丢失了项目顺序,或者他们根本没有做任何事情。我是一个完整的编程初学者。
我喜欢任何提示或帮助。
提前致谢
修改
这是一个更大的样本。遗憾的是我无法发布任何文件。列已修复,行数因员工而异。有些是两排短,有些继续排到第50行。
问题再一次是对项目STACKOVERFLOW111下的任务进行排序,然后对项目STACKOVERFLOW222下的任务进行排序,然后对大型"组进行排序。再次,没有混合他们。
[
答案 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 =...
来轻松扩大“容量”。
正如您可以看到在执行时逐步执行代码,它使用两个“帮助”列来构建排序索引,这些列最终会被删除。