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 展开
贴上我的代码:
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 展开
展开全部
不要使用对象作为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 · 知道合伙人教育行家
关注
展开全部
简化
'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 等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。
'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 等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-07-31 · 知道合伙人软件行家
关注
展开全部
d.Add Sheet1.Cells(i, 1).Value, Sheet1.Cells(i, 2).Value
一定要加上.Value
后面的也一样
一定要加上.Value
后面的也一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
背景:在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
求移动极差公式,{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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询