ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: cqjinxin

字典学习 输出表格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-25 13:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
来看看我的  好不好理解
  1. Public Sub wang_way_VBA()
  2.     Dim dic, d, d2, p, n, key, k, i, j, arr, r, eRow
  3.     Set dic = CreateObject("Scripting.Dictionary")
  4.     Dim wb As Workbook, sht As Worksheet, psht As Worksheet
  5.     Set wb = Application.ThisWorkbook
  6.     Set sht = wb.Worksheets("Sheet1")
  7.     '三层嵌套关系为  船号  行  日期
  8.     With sht
  9.         eRow = .Cells(.Rows.Count, 1).End(xlUp).Row
  10.         Set Rng = .Range("A2:C" & eRow)
  11.         arr = Rng.Value
  12.         For i = LBound(arr) To UBound(arr)
  13.             key = CStr(arr(i, 1))
  14.             key2 = Format(arr(i, 3), "m月d日")
  15.             If Not dic.exists(key) Then '不存在船号
  16.                 '创建一个船号
  17.                 Set d = CreateObject("Scripting.Dictionary")
  18.                 '创建一行
  19.                 Set d2 = CreateObject("Scripting.Dictionary")

  20.                 For n = 1 To 31 '----------------添加所有日期 控制输出顺序
  21.                     d2("7月" & n & "日") = ""
  22.                 Next n '-------------------------------------------------------

  23.                 d2(key2) = arr(i, 2)   '在行内按日期写数据
  24.                 Set d(1) = d2
  25.             Else '存在船号
  26.                 Set d = dic(key) '取出船号
  27.                 '循环每一行
  28.                 newline = True
  29.                 For Each r In d
  30.                     Set d2 = d(r)
  31.                     If d2(key2) = "" Then '如果一行内不存在某个日期 则直接写入
  32.                         d2(key2) = arr(i, 2)  '在行内按日期写数据
  33.                         newline = False
  34.                         Set d(r) = d2
  35.                         Exit For
  36.                     End If
  37.                 Next r
  38.                 If newline Then '如果一行内某个日期已经写过  新建一行
  39.                     Set d2 = CreateObject("Scripting.Dictionary")
  40.                     For n = 1 To 31 '----------------添加所有日期 控制输出顺序
  41.                         d2("7月" & n & "日") = ""
  42.                     Next n '-------------------------------------------------------
  43.                     d2(key2) = arr(i, 2) '在行内按日期写数据
  44.                     Set d(d.Count + 1) = d2 '把新行写入
  45.                 End If
  46.             End If
  47.             Set dic(key) = d
  48.             'Stop
  49.         Next i
  50.         i = 7 '起始行
  51.         '循环每一个船号
  52.         For Each key In dic
  53.             '某个船号
  54.             Set d = dic(key)
  55.             '循环船号的每一行
  56.             For Each r In d
  57.                 '某一行
  58.                 Set d2 = d(r)
  59.                 '输出位置 下移1行
  60.                 i = i + 1
  61.                 .Cells(i, "h").Value = key '船号
  62.                 .Cells(7, "i").Resize(1, d2.Count).Value = d2.keys '表头
  63.                 .Cells(i, "i").Resize(1, d2.Count).Value = d2.items '数据行
  64.             Next r
  65.         Next key
  66.     End With

  67.     Set dic = Nothing
  68.     Set d = Nothing
  69.     Set d2 = Nothing
  70. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-25 13:46 | 显示全部楼层
cqjinxin 发表于 2024-6-25 12:49
大佬好厉害 我得好好扣你的代码一个一个翻译 偷学

他用的就是棋盘法

TA的精华主题

TA的得分主题

发表于 2024-6-25 14:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-25 16:29 | 显示全部楼层
wang-way 发表于 2024-6-25 13:46
他用的就是棋盘法

好羡慕这逻辑思维  写的简单明了  我要学多久才能到这一步

TA的精华主题

TA的得分主题

发表于 2024-6-25 21:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参与一下,正在学习字典
问题是得到了解决,以后再做提升


image.jpg


Sub 填写船号()
Dim arr()
Dim i%, j%, k%
Dim d As Object
Set d = CreateObject("scripting.dictionary")
arr = Range("A1:D" & Range("A1").End(xlDown).Row) '源数据装入数组
k = 1
   
    For i = 2 To UBound(arr, 1)
        If Not d.exists(arr(i, 1) & "," & arr(i, 4)) Then '查找日期相同且船号相同
            d(arr(i, 1) & "," & arr(i, 4)) = k '通过字典,去掉船号相同但是日期不同的数据
            k = k + 1
        End If
    Next
   
Dim brr(), crr()
    Range("H8:AO2000").ClearContents '清空目标区域
    brr = d.keys
    crr = Range("G8").Resize(d.Count, 33) '设置写入的目标区域
   
For j = 1 To UBound(arr, 1) '循环源数据数组,写到目标区域数组
    For i = LBound(brr) To UBound(brr)
        crr(i + 1, 1) = i + 1
        crr(i + 1, 2) = Mid(brr(i), 1, InStr(brr(i), ",") - 1)
        If arr(j, 1) & "," & arr(j, 4) = brr(i) Then
            crr(i + 1, Day(arr(j, 3)) + 2) = arr(j, 2)
        End If
    Next
Next
   
    Range("G8").Resize(d.Count, 33) = crr '写到目标区域
     Debug.Print d.Count
    d.RemoveAll
    Set d = Nothing
End Sub



船号填写(单字典方式实现).rar

51.74 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-6-25 22:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

字典学习 输出表格
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-29 07:18 , Processed in 0.043344 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表