ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 三级下拉菜单让死表变活

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-11-30 21:20 | 显示全部楼层
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.      If Application.Intersect(Target, [b3:c5]) Is Nothing Then Exit Sub
  3.      Set ds = CreateObject("scripting.dictionary")
  4.      Set dj = CreateObject("scripting.dictionary")
  5.      crr = [a6:o13]
  6.     arr = Sheets("销售数据源").[a1].CurrentRegion
  7.     For j = 2 To UBound(arr)
  8.         If arr(j, 4) = [b3] And InStr(arr(j, 5), [b4]) > 0 And InStr(arr(j, 6), [b5]) > 0 Then
  9.             ds(arr(j, 1) & arr(j, 7)) = ds(arr(j, 1) & arr(j, 7)) + arr(j, 9)
  10.             dj(arr(j, 1) & arr(j, 7)) = dj(arr(j, 1) & arr(j, 7)) + arr(j, 10)
  11.         End If
  12.     Next j
  13.     arr = Sheets("库存数据源").[a1].CurrentRegion
  14.     For j = 2 To UBound(arr)
  15.         If arr(j, 4) = [b3] And InStr(arr(j, 5), [b4]) > 0 And InStr(arr(j, 6), [b5]) > 0 Then
  16.             ds(arr(j, 1) & arr(j, 7)) = ds(arr(j, 1) & arr(j, 7)) + arr(j, 9)
  17.             dj(arr(j, 1) & arr(j, 7)) = dj(arr(j, 1) & arr(j, 7)) + arr(j, 10)
  18.         End If
  19.     Next j
  20.     For j = 3 To UBound(crr)
  21.         sm = 0
  22.         jm = 0
  23.         For i = 2 To 7
  24.             
  25.             If ds.exists(crr(j, 1) & crr(2, i)) Then
  26.                 crr(j, i) = ds(crr(j, 1) & crr(2, i))
  27.                 crr(j, i + 7) = dj(crr(j, 1) & crr(2, i))
  28.             Else
  29.                 crr(j, i) = 0
  30.                 crr(j, i + 7) = 0
  31.             End If
  32.             sm = crr(j, i) + sm
  33.             jm = crr(j, i + 7) + jm
  34.         Next i
  35.         
  36.         crr(j, 8) = sm
  37.         crr(j, 15) = jm
  38.         
  39.     Next j
  40.     For j = 2 To UBound(crr, 2)
  41.         crr(5, j) = crr(4, j) + crr(3, j)
  42.         crr(8, j) = crr(6, j) + crr(7, j)
  43.     Next j
  44.     [a6:o13] = crr
  45. End Sub

  46. Private Sub Worksheet_SelectionChange(ByVal Target As Range) '三级下拉菜单
  47.     On Error Resume Next
  48.     If Target.Address <> "$B$3:$C$3" And Target.Address <> "$B$4:$C$4" And Target.Address <> "$B$5:$C$5" Then Exit Sub
  49.     Dim arr, d As Object, i&, x$
  50.     Set d = CreateObject("scripting.dictionary")
  51.     arr = Sheets("销售数据源").[a1].CurrentRegion
  52.     For i = 2 To UBound(arr)
  53.         x = arr(i, 4)
  54.         If Not d.exists(x) Then
  55.             Set d(x) = CreateObject("Scripting.Dictionary")
  56.             d(x)(arr(i, 5) & "") = arr(i, 6)
  57.         ElseIf InStr("," & d(x)(arr(i, 5) & "") & ",", "," & arr(i, 6) & ",") = 0 Then
  58.             d(x)(arr(i, 5) & "") = d(x)(arr(i, 5) & "") & "," & arr(i, 6)
  59.         End If
  60.     Next
  61. '    Sheet11.Unprotect
  62.     With Target.Validation
  63.         .Delete
  64.         Select Case Target.Address
  65.             Case "$B$3:$C$3"
  66.                 .Add xlValidateList, , , Join(d.keys, ",")
  67.                 [b4:b5] = ""
  68.             Case "$B$4:$C$4"
  69.                 .Add xlValidateList, , , Join(d([b3].Value).keys, ",")
  70.                 [b5] = ""
  71.             Case "$B$5:$C$5"
  72.                 .Add xlValidateList, , , d([b3].Value)([b4].Value)
  73.         End Select
  74.     End With
  75. '    Sheet11.Protect UserInterfaceOnly:=True
  76. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-11-30 21:20 | 显示全部楼层
增加了另外一个事件,用于统计数量,楼主这次看看是不是这个需求吧

三级下拉菜单汇总.zip

28.74 KB, 下载次数: 455

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 09:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liulang0808 发表于 2018-11-30 21:20
增加了另外一个事件,用于统计数量,楼主这次看看是不是这个需求吧

是!就是这样的,谢谢您了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-1 09:44 | 显示全部楼层
学习再进步 发表于 2018-12-1 09:40
是!就是这样的,谢谢您了!

你没有把A2:F2R的起止时间作为一个条件

TA的精华主题

TA的得分主题

发表于 2018-12-1 13:10 | 显示全部楼层
学习再进步 发表于 2018-12-1 09:44
你没有把A2:F2R的起止时间作为一个条件

用这个替换原来那代码,增加了日期条件。


Private Sub Worksheet_Change(ByVal Target As Range)
     If Application.Intersect(Target, [c2,f2,b3:c5]) Is Nothing Then Exit Sub
     Set ds = CreateObject("scripting.dictionary")
     Set dj = CreateObject("scripting.dictionary")
     crr = [a6:o13]
    arr = Sheets("销售数据源").[a1].CurrentRegion
    For j = 2 To UBound(arr)
        If arr(j, 2) >= [c2] And arr(j, 2) <= [f2] And arr(j, 4) = [b3] And InStr(arr(j, 5), [b4]) > 0 And InStr(arr(j, 6), [b5]) > 0 Then
            ds(arr(j, 1) & arr(j, 7)) = ds(arr(j, 1) & arr(j, 7)) + arr(j, 9)
            dj(arr(j, 1) & arr(j, 7)) = dj(arr(j, 1) & arr(j, 7)) + arr(j, 10)
        End If
    Next j
    arr = Sheets("库存数据源").[a1].CurrentRegion
    For j = 2 To UBound(arr)
        If arr(j, 2) >= [c2] And arr(j, 2) <= [f2] And arr(j, 4) = [b3] And InStr(arr(j, 5), [b4]) > 0 And InStr(arr(j, 6), [b5]) > 0 Then
            ds(arr(j, 1) & arr(j, 7)) = ds(arr(j, 1) & arr(j, 7)) + arr(j, 9)
            dj(arr(j, 1) & arr(j, 7)) = dj(arr(j, 1) & arr(j, 7)) + arr(j, 10)
        End If
    Next j
    For j = 3 To UBound(crr)
        sm = 0
        jm = 0
        For i = 2 To 7
            
            If ds.exists(crr(j, 1) & crr(2, i)) Then
                crr(j, i) = ds(crr(j, 1) & crr(2, i))
                crr(j, i + 7) = dj(crr(j, 1) & crr(2, i))
            Else
                crr(j, i) = 0
                crr(j, i + 7) = 0
            End If
            sm = crr(j, i) + sm
            jm = crr(j, i + 7) + jm
        Next i
        
        crr(j, 8) = sm
        crr(j, 15) = jm
        
    Next j
    For j = 2 To UBound(crr, 2)
        crr(5, j) = crr(4, j) + crr(3, j)
        crr(8, j) = crr(6, j) + crr(7, j)
    Next j
    [a6:o13] = crr
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-12 17:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
大师!能把我这个表解决吗?是跨文件夹的,代码写在查询表,

经营数据查询.rar

66.13 KB, 下载次数: 41

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-12 17:26 | 显示全部楼层
jevenjiang 发表于 2018-12-1 13:10
用这个替换原来那代码,增加了日期条件。

大师!能把我下面的表解决吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-12 17:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liulang0808 发表于 2018-11-30 21:20
增加了另外一个事件,用于统计数量,楼主这次看看是不是这个需求吧

大师,能帮我解决下面的表吗?有一个案例

TA的精华主题

TA的得分主题

发表于 2024-2-21 15:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏学习!!

TA的精华主题

TA的得分主题

发表于 2024-2-21 16:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如果是Office,使用SQL是最好的解决方案。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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