【问题标题】:Mapping sheet names via Dictionary通过字典映射工作表名称
【发布时间】:2014-03-21 21:28:25
【问题描述】:

第一篇文章 - 刚开始使用 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

最后检查以确保它确实有效(确实有效)。

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

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"

我的输出仍然是“is the value”。

很明显,当涉及到从字典中调用值时,我在这里做错了。任何人都可以帮助我吗?提前致谢!

编辑 2014-03-21 - 感谢 Simoco!就是这样!作为一个新手,仍在研究为什么,但又让它运行起来了!

【问题讨论】:

    标签: vba excel


    【解决方案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 对象),但在第二个代码中 vstring

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多