1

特に、Visioの下位バージョンには存在しないプロパティに書き込んでいるため、Visio2003で動作するマクロが下位バージョンのVisioで問題を引き起こさないようにする必要があります。現在、私はこれを行っています:

...

On Error GoTo NoComplexScriptFont:

Set cellObject = shapeObject.Cells("Char.ComplexScriptFont")

On Error GoTo ErrHandler

...

NoComplexScriptFont:

    Rem MSGBOX only for debug

    MsgBox "No Such Property"

    GoTo endsub



ErrHandler:

    Rem put in general error handling here

    GoTo endsub



endsub:

End Sub





...

これは機能しますが、少し面倒だと思います。'Application.version'(Visio 2003では'11'を返す)を使用するというアイデアをいじくりまわしましたが、特定のリリースで使用できるプロパティについての仮定を避け、プロパティ自体をテストするだけです。

VBAでこれを行うための適切なイディオムは何ですか?

ありがとう

---以下のいくつかの答えを得ました、私の好ましい解決策はこれでした:

If shapeObject.CellExists("Char.ComplexScriptFont", 0) Then

    msgbox "Property exists"

else

    msgbox "Property does not exist"

end if
4

2 に答える 2

2

次のように、通常のエラー処理を台無しにしないように、プロパティにアクセスするためにラッパー関数を使用します。

...
Set cellObject = GetCellObject(shapeObject)
If Not cellObject Is Nothing Then
   ' Do something with cellObject
End If
...

Private Function GetCellObject(ByVal shapeObject As Object) As Object
    On Error Resume Next
    Set GetCellObject = shapeObject.Cells("Char.ComplexScriptFont")
End Function

(注:タイプなどがObjectわからないため、上記のみを使用しています)cellObject

存在することがわかっているプロパティでも同じ手法を使用することがよくありますが、特定の状況ではエラーが発生します。たとえば(Excel)、名前でワークシートにアクセスする場合(そのようなワークシートが存在しない場合はエラーが発生します)、オブジェクトを呼び出しWorksheets(name)て返すラッパー関数があります。WorksheetNothing

Private Function GetWorksheet(ByVal strName as String) As Worksheet
    On Error Resume Next
    Set GetWorksheet = Worksheets(strName)
End Function

これにより、エラー処理を気にすることなく戻り値をテストできるため、呼び出しコードがはるかにクリーンになります。

于 2009-11-05T14:38:24.847 に答える
0

図形オブジェクトのCellExistsプロパティを使用して、特定のセルが存在するかどうかを確認できます。すでに使用していると思われるlocaleSpecificCellNameを渡す必要があります。次に、セルの検索範囲を指定する整数fExistsLocallyを渡します。0を指定すると、セルが継承されているかどうかにかかわらず、CellExistsはtrueを返します... 1の場合、セルが継承されている場合、CellExistsはfalseを返します。

于 2009-11-06T13:57:09.417 に答える