通过包含自定义对象项的字典循环

时间:2016-09-08 19:52:51

标签: excel vba excel-vba

我确定我错过了房间里那只巨大的大象,但我一直在弄错。我正在创建一个名为Prompts的公共字典,并在下面的子字段中填充自定义类对象。

Public Sub SetPromptControls()
Dim PromptsRange As Range
Dim PromptRow As Range

Set PromptsRange = Range("LookUpTablePrompts")
Dim NewPrompt As clsPrompt
For Each PromptRow In PromptsRange.Rows
    Set NewPrompt = New clsPrompt
    NewPrompt.Name = PromptRow.Cells(1, 1)
    NewPrompt.ControlType = PromptRow.Cells(1, 2)
    NewPrompt.ComboboxValues = PromptRow.Cells(1, 3)
    NewPrompt.HelpText = PromptRow.Cells(1, 4)
    NewPrompt.TabIndex = PromptRow.Cells(1, 5)
    NewPrompt.ColumnIndex = PromptRow.Cells(1, 6)
    NewPrompt.TableIndex = PromptRow.Cells(1, 7)
    NewPrompt.ControlName = PromptRow.Cells(1, 8)


    Me.Prompts.Add NewPrompt.ControlName, NewPrompt
Next
End Sub

现在我正在尝试遍历我刚刚在同一个类中的下一个sub中创建的字典。问题是每个循环都会给我一些对象错误

Public Sub SetProductPromptMapping()
Dim ProductPromptMappingRange As Range
Dim SKURange As Range
Dim SKUPromptMapRow As Integer
Dim MapRow As Range
Dim Key As Variant
Dim Prompt As clsPrompt
Set ProductPromptMappingRange = Range("LookUpTablePromptMap")
Set SKURange = ProductPromptMappingRange.Find(PromptsForm.SKU, LookIn:=xlValues)
SKUPromptMapRow = SKURange.Row - 2

For Each Key In Prompts.Keys
    Set Prompt = New clsPrompt
    Prompt = Key
    Me.ProductPromptMappingRow.Add Prompt.ControlName, ProductPromptMappingRange.Cells(SKUPromptMapRow, Prompt.TableIndex).Value
Next

End Sub

最后,我想循环遍历我的Prompts字典并将当前项目转发回我的clsPrompt类对象,以便我可以访问其属性。

1 个答案:

答案 0 :(得分:5)

作为Comintern correctly points out,您遇到了一个常见的错误 - 尝试在没有Set关键字的情况下分配对象引用。这是我能提出的最小的例子来说明问题:

Option Explicit

Public Sub DoSomething()
    Dim foo As MyClass
    foo = New MyClass
End Sub

这里有一个本地foo对象变量,它被分配了一个引用(= New MyClass),但是因为赋值是在没有Set关键字的情况下进行的,所以运行它会引发运行时错误91:

  

对象变量或未设置块变量

您的代码具有完全相同的问题:

Dim Prompt As clsPrompt
'...
'more code
'...
Prompt = Key

代码很高兴编译,但在执行时会一直提高运行时错误91。

这个错误已经足够普遍了(只需在Stack Overflow上查看how many questions involve runtime error 91),我决定在最新版本的Rubberduck(开源)中对它进行检查VBE的COM加载项可以帮助您清理代码(我正在管理项目):

Rubberduck code inspections

  

对象变量'foo'的分配没有'Set'关键字

     

就Rubberduck而言,这个变量是一个对象变量,没有'Set'关键字。这会导致运行时错误91'对象或With块变量未设置'。

Rubberduck会发现错误=)

不会捕获的是,为Prompt分配新引用没有多大意义,只是为了将它重新分配给某些{{1} }} 马上。再次Comintern correctly points out,您需要Variant这里。