ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 增加条件,根据模板输出,字典数组

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-12-13 16:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-13 17:57 | 显示全部楼层

Sub sunTest()
Dim i, k, kk, kkk, s, ss, sss, ssss, arr, lr, sp
Dim col1, col2, rv, d
Set d = CreateObject("scripting.dictionary")
arr = Sheets("数据源").Range("a1").CurrentRegion
For i = 3 To UBound(arr)
s = arr(i, 6)
If Not d.exists(s) Then
Set d(s) = CreateObject("scripting.dictionary")
End If
ss = arr(i, 15)
If ss = "分类其他" Or ss = "分类-2-a" Then
ss = "分类-2"
End If
If Not d(s).exists(ss) Then
Set d(s)(ss) = CreateObject("scripting.dictionary")
End If
sss = arr(i, 13) & "|" & arr(i, 16) & arr(i, 17)
If Not d(s)(ss).exists(sss) Then
Set d(s)(ss)(sss) = CreateObject("scripting.dictionary")
End If
ssss = arr(i, 14)
d(s)(ss)(sss)(ssss) = d(s)(ss)(sss)(ssss) + Val(arr(i, 18))
Next i
For Each k In d.keys
Sheets("模板").Copy after:=Sheets(Sheets.Count)
With ActiveSheet
.Name = k
lr = .Cells(Rows.Count, 1).End(3).Row
.Range("a3") = .Range("a3").Value & "(" & k & ")"
For Each kk In d(k).keys
For i = 1 To lr
If InStr(.Cells(i, 1), kk) Then Exit For

Next i
If i = 3 Then
coll = 12: col2 = 14: w = 15
ElseIf i = 20 Then
col1 = 13: cl2 = 15: rw = 32
Else
col1 = 8: col2 = 11: rv = 45
End If
r = i + 2
For Each kkk In d(k)(kk).keys
r = r + 1
sp = Split(kkk, "|")
.Cells(r, 1) = sp(0)
.Cells(r, 2) = sp(1)
'.Cells(r, col1) = d(k)(kk)(kkk)("收入")
'.Cells(r, col2) = d(k)(kk)(kkk)("支出")
.Cells(rv + Val(sp(0)), "E") = .Cells(ry + Val(sp(0)), "g") + .Cells(r, col1)
.Cells(rv + Val(sp(0)), "I") = .Cells(rv + Val(sp(0)), "I") + Cells(r, col2)
Next kkk
Next kk

End With
Next k
Set d = Nothing
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 09:09 | 显示全部楼层
本帖最后由 h2016 于 2023-12-14 10:10 编辑
基础不牢大佬您的变量  ss,有三种分类的哦,

TA的精华主题

TA的得分主题

发表于 2023-12-14 09:24 | 显示全部楼层
楼主抄错了不少,如:rw -rv  w,col1-coll,col2-cl2
改好之后即可。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-12-14 09:47 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 10:25 | 显示全部楼层
yynrzwh 发表于 2023-12-14 09:47
昨天论坛似乎有点问题

大佬就是rw=15,rw=32等
但是内容超过了15行,想把多的都放在15行上怎么办

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 16:19 | 显示全部楼层
结合上面例子大家可能对字典嵌套就有一个直观的理解了,给两朵花哈哈
Sub TestSub()
    Dim i, k, kk, kkk, s, ss, sss, ssss, arr, lr, sp
    Dim col1, col2, rw, d
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets("数据源").Range("a1").CurrentRegion
        For i = 3 To UBound(arr)
            s = arr(i, 6)
            If Not d.exists(s) Then
                Set d(s) = CreateObject("scripting.dictionary")
            End If
            ss = arr(i, 15)
            If ss = "分类其他" Or ss = "分类-2-a" Then
                ss = "分类-2"
            End If
            If Not d(s).exists(ss) Then
                Set d(s)(ss) = CreateObject("scripting.dictionary")
            End If
            sss = arr(i, 13) & "|" & arr(i, 16) & arr(i, 17)
            If Not d(s)(ss).exists(sss) Then
                Set d(s)(ss)(sss) = CreateObject("scripting.dictionary")
            End If
            ssss = arr(i, 14)
            d(s)(ss)(sss)(ssss) = d(s)(ss)(sss)(ssss) + Val(arr(i, 18))
        Next i
Dim key1 As Variant
    Dim key2 As Variant
    Dim key3 As Variant
    Dim key4 As Variant
   
    Dim ws As Worksheet
    Set ws = Sheets("字典数值查看")
   
    ws.UsedRange.Clear
    ws.Range("2:10000").NumberFormat = "@"
   
    Dim rowNum As Long
    rowNum = 2
   
    For Each key1 In d.keys
        ws.Cells(rowNum, 1) = key1
        
        For Each key2 In d(key1).keys
            ws.Cells(rowNum, 2) = key2
            
            For Each key3 In d(key1)(key2).keys
                ws.Cells(rowNum, 3) = key3
               
                For Each key4 In d(key1)(key2)(key3).keys
                    ws.Cells(rowNum, 4) = key4
                    ws.Cells(rowNum, 5) = d(key1)(key2)(key3)(key4)
                    
                    rowNum = rowNum + 1
                Next key4
            Next key3
        Next key2
    Next key1
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 20:33 | 显示全部楼层
yynrzwh 发表于 2023-12-14 09:47
昨天论坛似乎有点问题

您好,我用的是另外一个表创建的字典,要如和你这个字典关联上呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 20:47 | 显示全部楼层

您好,我在这个代码前面就创建了字典d,要怎么和你这个代码的字典d关联啊
        Application.ScreenUpdating = True
    Dim d As Object, dc As Object
    Set d = CreateObject("scripting.dictionary")
For i = 2 To UBound(br)
If Trim(br(i, 9)) <> "" Then
            d(Trim(br(i, 9))) = ""  '所有市公司编号装入字典
           
        End If
    Next i

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-14 20:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
您好,我在这个代码前面就创建了字典d,要怎么和你这个代码的字典d关联啊
        Application.ScreenUpdating = True
    Dim d As Object, dc As Object
    Set d = CreateObject("scripting.dictionary")
For i = 2 To UBound(br)
If Trim(br(i, 9)) <> "" Then
            d(Trim(br(i, 9))) = ""  '所有市公司编号装入字典
           
        End If
    Next i
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-30 02:22 , Processed in 0.041192 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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