访问VBA - 在Excel中搜索Excel Sheet1列A并在B列中放置相应的值?

时间:2013-04-25 14:59:23

标签: vba ms-access

在VBA中,我创建了一个名为C的Collection,如下所示:

Key      Item
Thing1   12
Thing2   15
Thing4   7
Thing6   3

在我的Excel文件中,Sheet1如下所示:

A        B
Thing1
Thing2
Thing3
Thing4
Thing5
Thing6

我想查看C中的每个Key,搜索A列,如果找到则将Item放在B列中。结果将是:

A        B
Thing1   12
Thing2   15
Thing3
Thing4   7
Thing5
Thing6   3

我最初认为我会通过循环收集,获取密钥,在“A:A”中搜索匹配,然后将“B#”设置为Item值来做到这一点。只是不确定语法。阅读更多内容后,我认为无法访问Key值。

Dim Count as Integer
Dim ItemToFind as String
Dim i as Integer

For Count = 1 to C.Count
    ItemToFind = C.Key(count) 'I don't think C.Key is a valid thing
    for i = 1 to 50 'there are less than 50 rows in Sheet1 to look thru        
        If Cells("A" & i).Value = ItemToFind Then
            Cells("B" & i).Value = C.Key(count)
        End If
    Next i
Next Count

我想也许我需要创建一个新的Class而不是Collection?任何帮助将不胜感激!

编辑:我正在尝试使用Dictionary对象。我能够向Dictionary添加内容并能够检索Key,但在检查Excel单元格值= Dictionary Key时是否会出现运行时错误。

我有一个名为“dict”的词典,并用以下词加载了键和值:

dict.Add Key:=Thing, Item:=TotalThings

我正在使用此代码循环通过Dictionary项,并查看它们是否存在于工作表的A列中:

Dim Count as Integer
Dim KeyToFind as String
Dim i as Integer

For Count = 1 to dict.Count
    KeyToFind = dict.Keys(count)

    For i = 1 To 50
        If oExcel.Worksheets(1).Cells("A" & i).Value = KeyToFind Then
            oExcel.Worksheets(1).Cells("B" & i).Value = dict.Item(Count)
        End If
    Next i
Next Count

On If oExcel.Worksheets(1).Cells("A" & i).Value = KeyToFind Then我收到运行时错误1004:应用程序定义错误或对象定义错误。如果我在调试模式下将鼠标悬停在KeyToFind上,它确实包含字典中的第一个键。

1 个答案:

答案 0 :(得分:3)

我认为您通过从集合切换到字典来做出明智的选择。字典有一个.Exists方法,应该是有用的。请考虑这个片段。

Dim dct As Object
Set dct = CreateObject("Scripting.Dictionary")
dct.Add "Thing1", 12
dct.Add "Thing2", 15
dct.Add "Thing4", 7
dct.Add "Thing6", 3
Debug.Print dct.Exists("BogusThing") ' returns False

然后您可以对工作表中的每列A值使用dct.Exists ...如果该键存在于字典中,则将匹配值存储到B列。

这可能不完全正确,但希望它足够接近让你开始。

Const lngRows As Long = 50
Dim objSheet As Object
Dim strKey As String

Set objSheet = oExcel.Worksheets(1) ' you know where oExcel comes from
Dim i As Long
For i = 1 To lngRows
    'strKey = objSheet.Cells("A" & i).value ' oops
    strKey = objSheet.Cells(i, 1).value
    If dct.Exists(strKey) Then
        'objSheet.Cells("B" & i).value = dct(strKey) ' oops again
        objSheet.Cells(i, 2).value = dct(strKey)
    End If
Next i