通过词典映射表名称

第一篇文章 – 刚从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) 

因为在第一个代码中vRange对象(并且你使用key – Range对象得到Item ),但是在第二个代码中vstring