2

最近、Excel マクロを作成しようとしていて、特定のワークシートが存在するかどうかを判断する必要がありました。スクリプトを作成するために私が選んだ武器は Python で、私の VBA スキルは明らかに貧弱です。だから、良いpythonicスタイルで、私は許可よりも許しを求める方が簡単なアプローチを取り、次のようなものを書きました:

Debug.Print MyWorkbook.Worksheets(TabName).Name  ''Check for an index error
If Err.Number <> 0 Then
    ''Code to add the sheet to the workbook

printステートメントを削除しようとするまで、これはうまくいきました。最初の行を次のように変更しました。

MyWorkbook.Worksheets(TabName).Name

そして突然、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーが発生し始めました。Python プログラマーとして、これは私を驚かせました。私は常に Python で同様のことを行っています。

気になったので少し読んでみました。Python では上記のような式ステートメントに関するドキュメントを見つけることができましたが、VBA では見つかりませんでした。式ステートメントは VBA では許可されていませんか? もしそうなら、そうでない理由はありますか?これについてどこで読めるか知っている人はいますか?

4

2 に答える 2

2

短い答えは「いいえ」です。VBA はずっと必須です。一般に、式は正当なスタンドアロンのステートメントではありません。多くの式が「コンパイル」さえしないことに気付くでしょう:

'Won't "compile"
(42+99)

あなたの特定の例では、もう少し進んでいます。VBA はMyWorkbook.Worksheets(TabName).Name、値を返す式として、意図したとおりにこの行を認識します。

'Fine: gets value of `Name` property
Debug.Print MyWorkbook.Worksheets(TabName).Name

VBA は、次の行に同じコードを表示します。

'Error: tries to call `Name` as method
MyWorkbook.Worksheets(TabName).Name

ワークシート オブジェクトで(存在しない)Nameメソッドを呼び出そうとしています。(Nameは のプロパティですWorksheet。) したがって、エラー メッセージは、何が起こっているかがわかったので、より意味のあるものになります。

これについてもっと読む限り、ここで見ることができます:

https://stackoverflow.com/a/1545024/58845

VBA言語仕様へのリンクがあり、おそらくこの種のことをより正確にカバーしていますが、私はチェックしませんでした:

http://msdn.microsoft.com/en-us/library/dd361851%28PROT.10%29.aspx

于 2012-04-18T12:26:29.637 に答える
0

VBA では、変数を実際に使用せずに行を書き込むことはできません。@Marcが言ったように、名前を別の変数に割り当てるだけです。

また、通常、次の関数を使用して確認します。

Public Function CheckWorksheetExists(wsNams As String) As Boolean

    Dim ws As Worksheet
    On Error Resume Next
    Set ws = Thisworkbook.Worksheets(wsName)
    CheckWorksheetExists = err.Number = 0

End Function
于 2012-04-18T22:10:48.637 に答える