通过Dictionary映射工作表名称

时间:2014-03-20 19:40:49

标签: excel vba excel-vba

第一篇文章 - 刚刚开始在VBA工作,我做的最后一次编程是在Fortran ...几年前......我会尽我所能尽可能清楚地描述我的问题。如果需要更多信息,请询问。

我正在努力转换为许多设施提供的数据,每个设施都有自己的工作表。需要将数据(以及其他内容)转移到新表格中,使其适合数据透视表,并在第一列中使用设施名称。由于工作表名称本身相对难以理解,我想使用“词典”将工作表名称映射到更有用的工具名称。

我的第一步是生成工作表名称列表:

Sub SheetNames()
    Columns(1).Insert
    For i = 1 To Sheets.Count - 1
        Cells(i, 1) = Sheets(i).name
    Next i
End Sub

一旦我有一个工作表名称列表,我在他们旁边的列中填写了我希望他们映射到的名称。

然后我用

填充了字典
Set sites = New Dictionary

more = True
rw = 4 

While more
    sites.Add Worksheets("SiteMapping").Cells(rw, 1), Worksheets("SiteMapping").Cells(rw, 2)
    rw = rw + 1
   If Len(Worksheets("SiteMapping").Cells(rw, 1)) = 0 Then more = False
Wend

For Each v In sites.Keys
    Debug.Print "Sheet: " & v & " Site: "; sites.Item(v)
Next

最后检查以确保它确实起作用(确实如此)。

然后,在子程序的后面,我想使用sites字典在新工作表的第一列(存储在变量“SheetName”中的名称)中填充一系列x单元格,使用以下内容:

i = 1
For n = 1 To Worksheets.Count - 2
    v = Worksheets(n).Name
    Worksheets(SheetName).Cells(i, 1).Value = sites.Item(v)
    Debug.Print v & ", " & sites.Item(v)
    i = i + 1
Next n

(最后两张纸被故意忽略。) 任务没有任何作用,所以我想也许我只是在那里搞乱一些事情(仍然完全可能!),所以我添加了调试声明,但我得到的只是:“表单名称”, 所以我担心我的映射表(“SiteMapping”)的单元格中的值实际上并不匹配站点词典的键中的值。所以,我做了一次手动检查:

k = Worksheets(2).Name
h = sites.Keys(42)
Debug.Print "Sites key is " & h
If Worksheets(2).Name = sites.Keys(42) Then
    Debug.Print "Yay!"
Else
    Debug.Print "Boo!"
End If

回应是肯定的(“耶!”),但当我尝试时:

Debug.Print sites.Item(h) & " is the value"

我的输出仍然是“值”。

显然,在调用字典中的值时,我在做错了。任何人都可以帮助我吗?提前谢谢!

编辑2014-03-21 - 谢谢Simoco!就是这样!作为一个新手仍然在努力,但让它再次运行!

1 个答案:

答案 0 :(得分:1)

更改

sites.Add Worksheets("SiteMapping").Cells(rw, 1), Worksheets("SiteMapping").Cells(rw, 2)

sites.Add Worksheets("SiteMapping").Cells(rw, 1).Value, Worksheets("SiteMapping").Cells(rw, 2).Value

请注意,我使用.Cells(rw, 1).Value代替.Cells(rw, 1),因为在这种情况下,您的字典项不是字符串,而是Range对象。

实际上,在您的代码中,您使用Range对象作为字典键。这就是为什么当你在那里打印价值时它起作用的原因:

For Each v In sites.Keys
    Debug.Print "Sheet: " & v & " Site: "; sites.Item(v)
Next

但不在这里工作:

v = Worksheets(n).Name
Worksheets(SheetName).Cells(i, 1).Value = sites.Item(v)

因为在第一个代码中vRange个对象(并且使用密钥 - Item对象获得Range),但在第二个代码中v是{ {1}}