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