ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关键字有多个不同项,怎么同时写入字典

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-6 11:56 | 显示全部楼层 |阅读模式
本求助从http://club.excelhome.net/thread-1037119-1-1.html扩展而来。
如果订单中同时满足多个条件的相同数据有多条,这些多条数据怎么同时写入字典,而不是新数据替换旧数据,又怎么返回最大数量及所在行号?

VBA多条件查询0717 - 副本.rar

17.76 KB, 下载次数: 85

TA的精华主题

TA的得分主题

发表于 2017-3-6 12:38 | 显示全部楼层
Sub lqxs()
Dim Arr, i&, Brr, Crr, d
    Set d = CreateObject("Scripting.Dictionary")
    Sheets("校对").Activate

Arr = Sheets("订单").[a1].CurrentRegion

For i = 2 To UBound(Arr)
    x = Arr(i, 1) & "|" & Arr(i, 2) & "|" & Arr(i, 3) & "|" & Arr(i, 4)
    If Not d.exists(x) Then
        d(x) = i
    ElseIf Arr(i, 5) > d(x) Then
        d(x) = i
    End If
Next
Brr = [a1].CurrentRegion

ReDim Crr(1 To UBound(Brr) - 1, 1 To 2)

For i = 2 To UBound(Brr)
    x = Brr(i, 1) & "|" & Brr(i, 2) & "|" & Brr(i, 3) & "|" & Brr(i, 4)
    Crr(i - 1, 1) = Arr(d(x), 5)
    Crr(i - 1, 2) = d(x)
Next

Range("E2").Resize(UBound(Crr), 2) = Crr

Set d = Nothing
End Sub

TA的精华主题

TA的得分主题

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

VBA多条件查询0717 - 副本.zip

19.58 KB, 下载次数: 60

TA的精华主题

TA的得分主题

发表于 2017-3-6 12:56 | 显示全部楼层
改一点蓝版的代码:

Sub lqxs()
    Dim Arr, i&, Brr, d
    Set d = CreateObject("Scripting.Dictionary")
    Sheet2.Activate
    Arr = Sheet1.[a1].CurrentRegion
    For i = 2 To UBound(Arr)
        s = Arr(i, 1) & "|" & Arr(i, 2) & "|" & Arr(i, 3) & "|" & Arr(i, 4)
        If Not d.exists(s) Then
            d(s) = Array(Arr(i, 5), i)
        Else
            a = d(s)
            If Arr(i, 5) > a(0) Then
                a(0) = Arr(i, 5): a(1) = i: d(s) = a
            End If
        End If
    Next
    Brr = [a1].CurrentRegion
    For i = 2 To UBound(Brr)
        x = Brr(i, 1) & "|" & Brr(i, 2) & "|" & Brr(i, 3) & "|" & Brr(i, 4)
        If d.exists(x) Then Cells(i, 5).Resize(1, 2) = d(x)
    Next
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-3-6 12:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
try this:
Sub zz()
Dim a, d As Object, k, t, b()
Set d = CreateObject("scripting.dictionary")
a = Sheets(1).[a1].CurrentRegion.Value
For i = 2 To UBound(a)
    k = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4)
    If d.exists(k) Then
        t = d(k): t(0) = IIf(t(0) > a(i, 5), t(0), a(i, 5))
        d(k) = Array(t(0), i)
    Else
        d(k) = Array(a(i, 5), i)
    End If
Next
a = Sheets(2).[a1].CurrentRegion.Value
ReDim b(1 To UBound(a) - 1, 1 To 2)
For i = 2 To UBound(a)
    k = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4)
    b(i - 1, 1) = d(k)(0): b(i - 1, 2) = d(k)(1)
Next
Sheets(2).[e2].Resize(UBound(b), 2) = b
End Sub

TA的精华主题

TA的得分主题

发表于 2017-3-6 12:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 15:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhangzhang 发表于 2017-3-6 12:42
详见附件〉〉〉〉〉〉〉〉〉〉

谢谢,但当最大值在符合条件的所有行上方时,返回错误数据

VBA多条件查询0717 - zhangzhang.rar

17.67 KB, 下载次数: 10

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 15:58 | 显示全部楼层
本帖最后由 bosao 于 2017-3-6 16:03 编辑
VBA多条件查询-Chip_Kenny - 副本.rar (19.37 KB, 下载次数: 8) Chip_Kenny 发表于 2017-3-6 12:58
try this:
Sub zz()
Dim a, d As Object, k, t, b()

谢谢,返回最大值正确,但行号有错误

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-6 16:30 | 显示全部楼层
本帖最后由 bosao 于 2017-3-7 11:46 编辑

谢谢,看不太懂局部,能否再次劳驾讲解
Private Sub CommandButton1_Click()
    Dim Arr, i&, Brr, d
    Set d = CreateObject("Scripting.Dictionary")    '创建字典,并赋予对象d
    Sheet3.Activate                                 '激活表3
    Arr = Sheet1.[a1].CurrentRegion                 'A1所在区域赋予数组Arr
    For i = 2 To UBound(Arr)
        s = Arr(i, 1) & "|" & Arr(i, 2) & "|" & Arr(i, 3) & "|" & Arr(i, 4)     '数组中1~4列文本连接,结果赋值于变量s
        If Not d.exists(s) Then                     '如果字典中不存在变量s则
            d(s) = Array(Arr(i, 5), i)              '变量s写入字典,其项为数组(区域第5列的值和行号)
        Else                                        '如果变量存在于字典中则
            a = d(s)                                '将字典中变量s的项赋予变量a
            If Arr(i, 5) > a(0) Then                '如果变量s所在行的第5列值大于变量a(字典中已存在的项)
                a(0) = Arr(i, 5): a(1) = i: d(s) = a       '?
            End If
        End If
    Next
    Brr = [a1].CurrentRegion                        '条件区域赋予数组Brr
    For i = 2 To UBound(Brr)
        x = Brr(i, 1) & "|" & Brr(i, 2) & "|" & Brr(i, 3) & "|" & Brr(i, 4)       '条件数组中1~4列文本连接,结果赋值于变量x
        If d.exists(x) Then Cells(i, 5).Resize(1, 2) = d(x)          '如果变量x存在于字典中则调整该行第5列区域大小并赋值该变量对应的项(数组)
    Next
End Sub


TA的精华主题

TA的得分主题

发表于 2017-3-6 16:31 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("订单")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a1:e" & r)
  9.     For i = 2 To UBound(arr)
  10.       xm = arr(i, 1) & "+" & arr(i, 2) & "+" & arr(i, 3) & "+" & arr(i, 4)
  11.       If Not d.exists(xm) Then
  12.         ReDim brr(1 To 6)
  13.         For j = 1 To 5
  14.           brr(j) = arr(i, j)
  15.         Next
  16.         brr(6) = i
  17.       Else
  18.         brr = d(xm)
  19.         If arr(i, 5) > brr(5) Then
  20.           brr(5) = arr(i, 5)
  21.           brr(6) = i
  22.         End If
  23.       End If
  24.       d(xm) = brr
  25.     Next
  26.   End With
  27.   With Worksheets("校对")
  28.     .UsedRange.Offset(1, 0).Clear
  29.     .Range("a2").Resize(d.Count, UBound(brr)) = Application.Transpose(Application.Transpose(d.items))
  30.   End With
  31. End Sub
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-9 16:06 , Processed in 0.040423 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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