0

Microsoft Visio Professional 2010 では、この小さなコード スニペットで発生していたエラーを特定しました。ページには 2 つの図形を保持するコンテナーがあり、別のループ内でこれらの図形を反復処理したいと考えています。しかし、無効なパラメーター エラーが発生し続けます。

解決策の私の試みは一番上のブロックですが、内側のループの同じ定義でのみ機能します。外側のループの 2 回目の反復中に何かが変化しているようですが、よくわかりません。For Each ループの定義方法に関係があると思います。

Sub Nested_Loop_Error()

    Dim a As Variant
    Dim b As Variant
    Dim lngs() As Long

    'This Works
    lngs = ActiveDocument.Pages(1).Shapes.ItemFromID(1).ContainerProperties.GetMemberShapes(visContainerFlagsDefault)
    For a = 0 To 1
        For Each b In lngs
            'Do nothing
        Next b
    Next a


    'This does not work
    For a = 0 To 1
        For Each b In ActiveDocument.Pages(1).Shapes.ItemFromID(1).ContainerProperties.GetMemberShapes(visContainerFlagsDefault)
            MsgBox "In Loop for a=" & a
        Next b
    Next a

End Sub

編集:私はそれをいじって動作させましたが、私が本当に興味を持っているのは、それが機能する理由です. コードの 2 番目のブロックは、a=1 の場合に失敗し、docMyDoc.Pages... 行に無効なパラメーターが指定されます。

以下は、バリアントまたはドキュメント変数を使用してループ内で ActiveDocument を定義する場合の違いを示すコードです。デバッガーを使用しても、docMyDoc または varMyDoc の定義方法に違いは見られません。

Sub Nested_Loop_Error2()
    Dim a As Variant
    Dim b As Variant
    Dim docMyDoc As Visio.Document
    Dim varMyDoc As Variant

    'This works
    For a = 0 To 1
        Set varMyDoc = ActiveDocument
        For Each b In varMyDoc.Pages(1).Shapes.ItemFromID(1).ContainerProperties.GetMemberShapes(visContainerFlagsDefault)
            MsgBox "Using variant, a=" & a
        Next b
    Next a

    'This does not work
    For a = 0 To 1
        Set docMyDoc = ActiveDocument
        For Each b In docMyDoc.Pages(1).Shapes.ItemFromID(1).ContainerProperties.GetMemberShapes(visContainerFlagsDefault)
            MsgBox "Using document, a=" & a
        Next b
    Next a
End Sub
4

2 に答える 2