循环使用自定义对象项目的字典

我确定我错过了房间里的那只巨大的大象,但是我一直在这里发现错误。 我正在创build一个名为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 

现在,我正在试图循环下一个在同一个类中的子字典。 问题是每个循环不断给我对象的错误

 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类对象,以便我可以访问其属性。

正如Comintern正确指出的那样 ,你已经遇到了一个常见的错误 – 试图分配一个没有Set关键字的对象引用。 这是我能想出的最小的例子,它演示了这个问题:

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

这里有一个本地的foo对象variables被分配了一个引用( = New MyClass ),但是因为赋值没有Set关键字,所以运行这个会产生一个运行时错误91:

对象variables或未设置块variables

你的代码有完全相同的问题:

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

代码愉快地编译 ,但执行时会一致地提高运行时错误91。

这个错误已经足够普遍了(只要看看有多less个问题涉及到运行时错误91就在堆栈溢出),我已经决定在最新版本的Rubberduck (一个开源的COM加载项VBE,可以帮助你清理你的代码(我pipe理项目):

Rubberduck代码检查

对象variables“foo”分配时没有“Set”关键字

至于Rubberduck可以告诉,这个variables是一个对象variables,分配没有“设置”关键字。 这会导致运行时错误91'对象或块variables未设置'。

Rubberduck会发现这个错误=)


但是,它不会被捕获的是,将Prompt分配给一个新的引用没什么意义,只是为了立即重新赋值给Variant 。 正如共同国际指出的那样 ,你需要在这里Set Prompt = Prompts(Key)