Как добавить объект с элементом по умолчанию в Scripting.Dictionary как ссылку на объект, а не как значение элемента по умолчанию?
Эта проблема VBA также может относиться к Microsoft Office, хотя я сталкиваюсь с ней с объектом autodesk -ventor Inventor.Sheet
, Так что не стесняйтесь ответить также с опытом VBA+Office.
Initialized Inventor.Sheet
можно использовать как:
Debug.Print oSheet.TitleBlock.Name ' prints "Title Block 1"
а также как
Debug.Print oSheet ' prints 11234869 long integer, value of default member
Такое дуалистическое поведение обусловлено свойством объекта по умолчанию.
Проблема в том, что всякий раз, когда я использую
Dim TitleBlocksLargestSheet As Scripting.Dictionary
TitleBlocksLargestSheet.Add oTitleBlock, oSheet
затем добавление в словарь вставляет длинное целое значение вместо ссылки на объект oSheet
,
Как ссылку на объект можно вставить в словарь?
Я подозреваю, что словарь Add
метод предпочитает =
операция до Set
операция, когда оба возможны.
Поэтому в следующих примерах я всегда получаю целые числа в словарных элементах вместо объектов:
'*** get a dictionary of used title blocks (corner stamps) with largest sheet size for each
For Each oSheet In oDrawingDocument.Sheets
'** get title block of active sheet
Dim oTitleBlock As Inventor.TitleBlock
Set oTitleBlock = oSheet.TitleBlock
If Not oTitleBlock Is Nothing Then
'** add or update title block usage
If Not TitleBlocksLargestSheet.Exists(oTitleBlock) Then
TitleBlocksLargestSheet.Add oTitleBlock, cobj(oSheet)
Else
Dim oLargestSheetSeen As Inventor.Sheet
Set oLargestSheetSeen = TitleBlocksLargestSheet(oTitleBlock)
If oSheet.Width * oSheet.Height > oLargestSheetSeen.Width * oLargestSheetSeen.Height Then
TitleBlocksLargestSheet.Item(oTitleBlock) = oSheet
End If
End If
End If
Next oSheet
-- *** usage - retrieval from the dictionary
For Each oSheet In TitleBlocksLargestSheet.Items 'ERROR 424: Object required.
Set oTitleBlock = oSheet.TitleBlock
'...some other code
Next oSheet
ОБНОВИТЬ:
Debug.Print TypeName(TitleBlocksLargestSheet.Item(oTitleBlock))
IRxSheet ' perhaps there's no problem with storage but with retrieval?
Debug.Print VarType(TitleBlocksLargestSheet.Item(oTitleBlock))
3 ' (Long Integer)
1 ответ
Dictionary.Items()
это метод, возвращающий Array of Variant
[*]. Вы можете перебрать с For Each ...
только если итерационная переменная также Variant
или вы можете использовать For ... To ...
состав.
Dim oSheet as Inventor.Sheet
Dim vSheet as Variant
Dim iSheet as long
'Use this way
For Each vSheet In TitleBlocksLargestSheet.Items
Set oSheet = vSheet ' you may want to check that vSheet is really a Sheet before
Set oTitleBlock = oSheet.TitleBlock
'...some other code
Next vSheet
'or this one
For iSheet = 0 to TitleBlocksLargestSheet.Count - 1
Set oSheet = TitleBlocksLargestSheet.Item(iSheet)
Set oTitleBlock = oSheet.TitleBlock
'...some other code
Next iSheet
[*] Вы можете проверить это с Debug.Print TypeName(TitleBlocksLargestSheet.Items)
который печатает Variant()