excel 如何创建可折叠的行或列表,并在折叠时显示优先级单元格?

mefy6pfw  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(112)

[模板][1]我需要创建Excel文件的时间表,将包含在某些时间段内所涉及的人的活动。
我想要一份格式如下的日程表:

Person 1     07:00    10:00     Activity 1    [Qualifications of said person]
Person 1     10:00    12:00     Activity 2    [Qualifications of said person]
Person 1     12:00    13:00     Break         [Qualifications of said person]
Person 1     13:00    15:00     Activity 3    [Qualifications of said person]
Person 1     15:00    17:00     Activity 4    [Qualifications of said person]

折叠时显示以下内容:

Person 1     07:00    17:00     Activity 1    [Qualifications of said person]

因此,大多数单元格实际上显示的与第一行相同,但完成时间(17:00)会以某种方式优先于10:00。
我还没有找到一种方法来实现可折叠行功能,它不起作用,因为它只显示第一行。这可能是我必须用VBA来完成的事情吗?
我附上了一个模板,解释我希望发生什么。
下面的“部门A”是我们的管理系统提供给我们的原始数据,现在我希望能够将这些数据复制并粘贴到我们的部门下面,无论是作为一个整体还是逐个人。然后将其轻松地折叠到上面的“部门A”以获得更好的可见性,然后在您需要更多信息时将其展开到下面的部门。我希望能够为每个人都这样做,因此,例如仅用于人1,或者用于两个或更多人。
[模板][1] [1]:https://i.stack.imgur.com/dBk1O.png

kkbh8khc

kkbh8khc1#

请测试下一个代码。它应该非常快,使用数组,提取唯一的人(使用字典),组的第一个范围,最后一个和它的最后一个结束时间,然后处理获得的字典/数组:

Sub groupPersons()
  Dim sh As Worksheet, lastR As Long, arr, arrInt, i As Long, j As Long
  Dim rngIns As Range, k As Long, dict As Object
  
  Set sh = ActiveSheet
  lastR = sh.Range("A" & sh.rows.count).End(xlUp).Row
  
  Set dict = CreateObject("Scripting.Dictionary")
  arr = sh.Range("A1:C" & lastR).Value2
  For i = 2 To UBound(arr)
        If Not dict.Exists(arr(i, 1)) Then
            dict.Add arr(i, 1), Array(i, i, arr(i, 3))
        Else
            arrInt = dict(arr(i, 1))
            arrInt(1) = i: arrInt(2) = arr(i, 3)
            dict(arr(i, 1)) = arrInt
        End If
  Next i
  'Stop
  For i = 0 To dict.count - 1
        addToRange rngIns, sh.Range("A" & dict.Items()(i)(0))
  Next i
  
  rngIns.EntireRow.insert xlDown
  arr = sh.Range("A1:E" & lastR + dict.count).Value2
  Dim ar: ar = arr
  For i = 2 To UBound(arr)
        If arr(i, 1) = "" Then
            ar(i, 1) = arr(i + 1, 1): ar(i, 2) = arr(i + 1, 2)
            ar(i, 3) = dict(ar(i, 1))(2): ar(i, 4) = arr(i + 1, 4)
            ar(i, 5) = arr(i + 1, 5)
        End If
  Next i
  Stop
  sh.Range("A1").Resize(UBound(ar), 5).Value2 = ar: Stop
  'Group rows:
  For i = 2 To UBound(arr)
     If arr(i, 1) = "" Then
        sh.rows(i + 1 & ":" & i + (dict(ar(i, 1))(1) - dict(ar(i, 1))(0) + 1)).group
      End If
  Next i  
End Sub

Sub addToRange(rngU As Range, rng As Range)
    If rngU Is Nothing Then
        Set rngU = rng
    Else
        Set rngU = Union(rngU, rng)
    End If
End Sub

我没有注解代码,因为我现在需要离开我的办公室。如果它按照你的需要工作,想要更好地理解它,我也会在回家后(几个小时后)注解它
请在测试后发送一些反馈。

相关问题