第一篇文章 - 刚刚开始在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!就是这样!作为一个新手仍然在努力,但让它再次运行!
答案 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)
因为在第一个代码中v
是Range
个对象(并且使用密钥 - Item
对象获得Range
),但在第二个代码中v
是{ {1}}