通过词典映射表名称
第一篇文章 – 刚从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
最后检查一下,确保它确实工作(做了)。
那么,在子程序的后面,我想使用站点字典来填充新工作表的第一列(存储在variables“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
(最后两张纸被故意忽略了)这个任务没有任何作用,所以我想也许我只是搞乱了那些东西(还是完全可能的!),所以我添加了debugging语句,但是我得到的结果是:“name工作表“,所以后来我担心我的映射表(”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! 那就是它! 仍然努力通过作为一个新手,但得到它再次运行!
更改
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)
,因为在这种情况下,您的字典项目不是string,而是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)
因为在第一个代码中v
是Range
对象(并且你使用key – Range
对象得到Item
),但是在第二个代码中v
是string