【问题标题】:save arrays in dictionary using for loop in VBA使用VBA中的for循环将数组保存在字典中
【发布时间】:2021-09-01 11:56:07
【问题描述】:

我有一张包含要保存在字典中的数据的数组的工作表。每个数组之间的列空间是恒定的,并且表的大小相似。我在每个数组(单元格 J3 中的第一个)上都有名称,它们应该是键,数据应该是项。如何创建一个循环来保存所有数组并在所选范围为空时停止?

 Sub Dictionary()

    Dim dictionary() As Dictionary
    
    Dim nCol As Integer, i As Integer
    nCol = 13
    
    Sheets("Sheet1").Activate
    Range(Cells(27, 11), Cells(36, 21)).Activate
   
    For i = 1 To nCol
'        dictionary(i) = Selection.Value
        Selection.Offset(RowOffset:=0, ColumnOffset:=nCol).Select
    Next i
   
    
 End Sub

谢谢

【问题讨论】:

  • "表格大小相似" 它们的大小是多少? “单元格 J3 中的第一个” 第二个和第三个在哪里,模式是什么?
  • 当你说“我有一张带数组的工作表”时,你指的是什么?你知道什么是 VBA 数组吗?实际上,您指的是范围吗?字典必须有一个键和一个值。如果值应该是这些“数组”之一,您打算如何从字典中识别每个这样的数组?你不喜欢使用那个名字(从“J3”开始)吗?如果是这样,请更好地描述“数组”的含义及其大小。当然,要能够识别下一个名字,也是。如何获得第二个,第三个等等?我的意思是,基于什么逻辑?
  • @CDP1802 我的第一个范围是从 K27:U36 然后跳转到 13 的 nCol。与名称(键)相同
  • @FaneDuru 想要使用名称作为键。第一个从 J3 开始,然后跳到下一个 13 col。当下一个单元格为空时,循环必须停止。数组/范围的大小相似,并且彼此相邻放置。范围也必须向右跳 13 列。我希望这是有道理的
  • @CDP 所以第二个表名在 W3 中,数据是 X27:AH36(即 11 列,10 行)。正确吗?

标签: excel vba loops dictionary


【解决方案1】:

请测试下一个代码。它需要引用“Microsoft Scripting Runtime”:

Sub RangesIndictionary()
    Dim sh As Worksheet, dict As New scripting.dictionary, nCol As Long
    Dim i As Long, rngInit As Range, rngKey As Range, keyName As String
    
    Set sh = Sheets("Sheet1")
    nCol = 13

    Set rngKey = sh.Range("J3")
    keyName = rngKey.Value
    Set rngInit = sh.Range(sh.cells(27, 11), sh.cells(36, 21))

    Do While keyName <> ""
        dict.Add keyName, rngInit
        Set rngKey = rngKey.Offset(0, nCol)
        keyName = rngKey.Value
        Set rngInit = rngInit.Offset(0, nCol)
    Loop
    Debug.Print dict.count & " ranges have been placed in the dictionary"
    Debug.Print "The first range is " & dict(sh.Range("J3").Value).Address
 End Sub

它可以使用后期绑定,但最好使用智能感知建议的参考和好处。

如果两个这样的范围的名称可能相同,则代码应初步检查键是否存在。并且您必须告诉我们如何处理这种情况。

为了自动添加必要的引用,请先运行下一段代码:

Sub addScrRunTimeRef()
  'Add a reference to 'Microsoft Scripting Runtime':
  'In case of error ('Programmatic access to Visual Basic Project not trusted'):
  'Options->Trust Center->Trust Center Settings->Macro Settings->Developer Macro Settings->
  '         check "Trust access to the VBA project object model"
  On Error Resume Next
  Application.VBE.ActiveVBProject.References.AddFromFile "C:\Windows\SysWOW64\scrrun.dll"
  If err.Number = 32813 Then
        err.Clear: On Error GoTo 0
        MsgBox "The reference already exists...": Exit Sub
  Else
        On Error GoTo 0
        MsgBox """Microsoft Scripting Runtime"" reference added successfully..."
  End If
End Sub

仅当您保存工作工作簿时才会保留...

【讨论】:

  • 谢谢@FaneDuru 我已经测试了代码并添加引用给我一个错误(名称与现有模块、项目或对象库冲突)。我仍然可以运行第一部分,并且名称被设置为项目而不是字典中的键。而且我没有得到字典中的数据。这是我第一次使用字典,所以也许我遗漏了什么
  • 我现在正在开车。几个小时后我会在家里回复。
  • @FrankOlsen 首先,错误仅表示引用已经存在。我可以调整代码来宣布它。其次,您是否按原样测试了代码?如果没有,请按原样尝试。如果不修改,上面的代码,名字肯定是字典键。使用 Dict(key) 会为相应的键返回字典 Value。如果按原样使用,代码是否引发任何错误?如果不是,它不是在Immediate Window 中返回字典中的范围数和第一个范围的地址吗?对于Immediate Window,请按Ctrl + G,在VBE...
猜你喜欢
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2018-12-24
  • 2022-11-17
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多