|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
来看看我的 好不好理解
- Public Sub wang_way_VBA()
- Dim dic, d, d2, p, n, key, k, i, j, arr, r, eRow
- Set dic = CreateObject("Scripting.Dictionary")
- Dim wb As Workbook, sht As Worksheet, psht As Worksheet
- Set wb = Application.ThisWorkbook
- Set sht = wb.Worksheets("Sheet1")
- '三层嵌套关系为 船号 行 日期
- With sht
- eRow = .Cells(.Rows.Count, 1).End(xlUp).Row
- Set Rng = .Range("A2:C" & eRow)
- arr = Rng.Value
- For i = LBound(arr) To UBound(arr)
- key = CStr(arr(i, 1))
- key2 = Format(arr(i, 3), "m月d日")
- If Not dic.exists(key) Then '不存在船号
- '创建一个船号
- Set d = CreateObject("Scripting.Dictionary")
- '创建一行
- Set d2 = CreateObject("Scripting.Dictionary")
- For n = 1 To 31 '----------------添加所有日期 控制输出顺序
- d2("7月" & n & "日") = ""
- Next n '-------------------------------------------------------
- d2(key2) = arr(i, 2) '在行内按日期写数据
- Set d(1) = d2
- Else '存在船号
- Set d = dic(key) '取出船号
- '循环每一行
- newline = True
- For Each r In d
- Set d2 = d(r)
- If d2(key2) = "" Then '如果一行内不存在某个日期 则直接写入
- d2(key2) = arr(i, 2) '在行内按日期写数据
- newline = False
- Set d(r) = d2
- Exit For
- End If
- Next r
- If newline Then '如果一行内某个日期已经写过 新建一行
- Set d2 = CreateObject("Scripting.Dictionary")
- For n = 1 To 31 '----------------添加所有日期 控制输出顺序
- d2("7月" & n & "日") = ""
- Next n '-------------------------------------------------------
- d2(key2) = arr(i, 2) '在行内按日期写数据
- Set d(d.Count + 1) = d2 '把新行写入
- End If
- End If
- Set dic(key) = d
- 'Stop
- Next i
- i = 7 '起始行
- '循环每一个船号
- For Each key In dic
- '某个船号
- Set d = dic(key)
- '循环船号的每一行
- For Each r In d
- '某一行
- Set d2 = d(r)
- '输出位置 下移1行
- i = i + 1
- .Cells(i, "h").Value = key '船号
- .Cells(7, "i").Resize(1, d2.Count).Value = d2.keys '表头
- .Cells(i, "i").Resize(1, d2.Count).Value = d2.items '数据行
- Next r
- Next key
- End With
- Set dic = Nothing
- Set d = Nothing
- Set d2 = Nothing
- End Sub
复制代码 |
|