vba怎么通过字典的key来确定数据?

想通过字典实现个功能,就是在sheet1里将两列数据加入字典,A列当KEY,B列当ITEM,然后在sheet2里的A列查找是否存在字典里的关键字,有就在B列输出对应的IT... 想通过字典实现个功能,就是在sheet1里将两列数据加入字典,A列当KEY,B列当ITEM,然后在sheet2里的A列查找是否存在字典里的关键字,有就在B列输出对应的ITEM,没有就留空,我自己写了一个,可是报错,说是不支持这种属性或方法,求高手指教,万分感谢。
贴上我的代码:

Option Explicit

Sub dic()
Dim d, i%, j%, temp
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To Sheet1.[a66].End(3).Row
d.Add Sheet1.Cells(i, 1), Sheet1.Cells(i, 2).Value
Next

For j = 1 To Sheet2.[a66].End(3).Row
If d.exist(Sheet2.Cells(j, 1)) Then
Sheet2.Cells(j, 2).Value = d.Item(Sheet2.Cells(j, 1))
End If
Next
End Sub
展开
 我来答
阳光上的桥
推荐于2017-12-16 · 知道合伙人软件行家
阳光上的桥
知道合伙人软件行家
采纳数:21423 获赞数:65813
网盘是个好东东,可以对话和传文件

向TA提问 私信TA
展开全部

不要使用对象作为KEY,应该使用简单类型,判断存在的方法是Exists,最好使用赋值语句代替.Add,可以避免重复导致的问题。修改后的代码:



Option Explicit
Sub dic()
    Dim d, i%, j%, temp
    Dim k, v
    Set d = CreateObject("Scripting.Dictionary")
    For i = 1 To Sheet1.[a66].End(3).Row
        k = Trim(Sheet1.Cells(i, 1))
        v = Sheet1.Cells(i, 2).Value
        d(k) = v
    Next i
    
    For j = 1 To Sheet2.[a66].End(3).Row
        k = Trim(Sheet2.Cells(j, 1))
        If d.Exists(k) Then
            Sheet2.Cells(j, 2).Value = d(k)
        End If
    Next
End Sub
满意请采纳哟
推荐于2016-03-13 · 知道合伙人教育行家
满意请采纳哟
知道合伙人教育行家
采纳数:30594 获赞数:373503
2010年本科毕业于安徽工业大学高分子材料与工程专业,并取得工科学士学位证书。

向TA提问 私信TA
展开全部
简化
'key是某个字典的keys,因为需要通过这个key来找到这列数据的最开始的行号a和最后的行号b
For i = 0 To UBound(key)
If Names.Count > 0 Then
For Each nm In Names
nm.Delete
Next
End If
a = Range("g3:g" & lr4).Find(what:=key(i), SearchDirection:=xlNext).Row 'key中某元素在g列中对应的第一个行号
b = Range("g3:g" & lr4).Find(what:=key(i), SearchDirection:=xlPrevious).Row 'key中某元素在g列中对应的最后一个行号
Range(Range("b" & a), Range("b" & b - 1)).Name = "zone1" '将b列的对应区域写入名称
Range(Range("b" & a + 1), Range("b" & b)).Name = "zone2" '将b列的对应区域写入名称
Range("i2").FormulaArray = "=average(abs(zone1-zone2))" '用数组公式求极差
js = Range("i2") '再将该值写入变量js
Range("i2").Clear '清除i2单元格内容
...........
Visual Basic 的应用程序版(VBA)是Microsoft 公司长期追求的目标,使可编程应用软件得到完美的实现,它作为一种通用的宏语言可被所有的Microsoft 可编程应用软件所共享。在没有VBA 以前,一些应用软件如Excel、Word、Access、Project 等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
skyzxh

2014-07-31 · 知道合伙人软件行家
skyzxh
知道合伙人软件行家
采纳数:2623 获赞数:8344
毕业于中科院,硕士,30年工程从业经验。现任公司技术负责。

向TA提问 私信TA
展开全部
d.Add Sheet1.Cells(i, 1).Value, Sheet1.Cells(i, 2).Value

一定要加上.Value
后面的也一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天蝎神经侠侣
高粉答主

2015-09-02 · 关注我不会让你失望
知道大有可为答主
回答量:7533
采纳率:67%
帮助的人:718万
展开全部
背景:在g列中,某值对应的行号为从4到20,那么针对b4:b20,需要知道这列数据的移动极差。
求移动极差公式,{average(abs(b4:b19-b5:b20))}'这是做控制图需要用到的移动极差
说明下:数据的位置是不固定的,所以需要用变量来确定数据的位置。ps:如果位置已知,貌似在坛子里看到高手是采用evaluate直接写数组公式的。
可以实现该目的,但是代码较多,采用的是先通过对要求极差的单元格定义名称,再通过在某单元格写入数组公式求极差,然后将该单元格内容写入变量,再清除该单元格内容,求简化
'key是某个字典的keys,因为需要通过这个key来找到这列数据的最开始的行号a和最后的行号b
For i = 0 To UBound(key)
If Names.Count > 0 Then
For Each nm In Names
nm.Delete
Next
End If
a = Range("g3:g" & lr4).Find(what:=key(i), SearchDirection:=xlNext).Row 'key中某元素在g列中对应的第一个行号
b = Range("g3:g" & lr4).Find(what:=key(i), SearchDirection:=xlPrevious).Row 'key中某元素在g列中对应的最后一个行号
Range(Range("b" & a), Range("b" & b - 1)).Name = "zone1" '将b列的对应区域写入名称
Range(Range("b" & a + 1), Range("b" & b)).Name = "zone2" '将b列的对应区域写入名称
Range("i2").FormulaArray = "=average(abs(zone1-zone2))" '用数组公式求极差
js = Range("i2") '再将该值写入变量js
Range("i2").Clear '清除i2单元格内容
...........
next i
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式