Как добавить объект с элементом по умолчанию в 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()

Другие вопросы по тегам