2016-09-08 2 views
0

Я уверен, что мне не хватает огромного слона в комнате, но я продолжаю получать ошибки. Я создаю открытый словарь под названием Prompts и заполняю его специальным объектом класса в нижеприведенном разделе.Looping Через словарь с пользовательскими объектами

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 объекту класса, так что я могу получить доступ к его свойствам.

+3

'Set Prompt = Prompts (Key)' и удалить строку '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Comintern

ответ

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, когда выполняется.

Эта ошибка достаточно распространена (просто посмотрите на how many questions involve runtime error 91 прямо здесь, на переполнение стека), что я решил провести проверку для нее в последней версии Rubberduck, надстройку COM с открытым исходным кодом для VBE которые могут помочь вам очистить ваш код (я управление проектом):

Rubberduck code inspections

объект переменной 'Foo' присваиваются без 'Set' ключевого слова

Насколько Rubberduck может сказать, эта переменная является переменной объекта, назначенной без ключевого слова «Установить». Это вызывает ошибку времени выполнения 91 'Объект или с заблокированной переменной блока.

Rubberduck поймали бы эту ошибку =)


Что не бы поймали, хотя, является то, что она не имеет особого смысла, чтобы назначить Prompt новый справочник, просто повторно назначьте его примерно Variant. Опять же, как Comintern correctly points out, вам нужно Set Prompt = Prompts(Key) здесь.

+0

Мне очень нравится читать ваши ответы, потому что вы делаете это очень детально и дидактично. Мне нечего добавить сюда, но я хотел бы отметить, что у вас есть небольшая опечатка в вашем последнем предложении. 'Propmts (Key)' должен быть 'подсказки (ключ)' –

+0

@VictorMoraes спасибо! Typo fixed =) –

Смежные вопросы