5

さまざまなモジュールから呼び出したい関数があります。VB(Excel)でこれを行うための最良の方法は何ですか。

モジュール「SheetExists」

Function Name(SheetName As String) As Boolean
' returns TRUE if the sheet exists in the active workbook
    SheetExists = False
    On Error GoTo NoSuchSheet
    If Len(Sheets(SheetName).Name) > 0 Then
        SheetExists = True
        Exit Function
    End If
NoSuchSheet:
End Function

モジュール「メイン」

If Not SheetExists.Name("mySheet") Then
    'do this
Else
    ' else do this
End If

私はこれをする必要はありませんか?

Call SheetExists.Name("mySheet")

それが別のモジュールから関数を呼び出す唯一の方法ですか?パブリック関数などとして宣言する必要がありますか?

4

4 に答える 4

8

いいえ、その必要はありません。どこからでも関数を呼び出すことができます。

これを試して:

このコードをModule1に入れます:

Sub TestSheetExists()
    If SheetExists("Sheet1") Then
        MsgBox "I exist!"
    End If
End Sub

そしてこれはModule2で:

Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

     If wb Is Nothing Then Set wb = ThisWorkbook
     On Error Resume Next
     Set sht = wb.Sheets(shtName)
     On Error GoTo 0
     SheetExists = Not sht Is Nothing
 End Function

もちろん、モジュールには任意の名前を使用できます。


編集:別のモジュールからの呼び出しはまだ機能していないようです。これらの手順を正確に実行して、問題の理解に役立つテストワークブックを設定してください。

  1. 新しいExcelブックを作成する
  2. VBAエディターを開きます(Alt-F11)
  3. プロジェクトを右クリックして、[モジュールの挿入]を選択します。この4回を繰り返して、4つのモジュールを取得します。
  4. まだ開いていない場合は、F4キーを押してプロパティウィンドウを開きます
  5. モジュール名を次のように変更します:CallMe、CallMeAgain、CallMeBack、Validation モジュールの名前を変更
  6. 検証モジュールで、次の関数を貼り付けます。

    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        Dim sht As Worksheet
    
         If wb Is Nothing Then Set wb = ThisWorkbook
         On Error Resume Next
         Set sht = wb.Sheets(shtName)
         On Error GoTo 0
         SheetExists = Not sht Is Nothing
    End Function
    
  7. このサブをCallMeに貼り付けます。

    Sub TestSheetExistsFromCallMe()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMe!"
        End If
    End Sub
    
  8. これをCallMeBackに貼り付けます。

    Sub TestSheetExistsFromCallMeBack()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMeBack!"
        End If
    End Sub
    
  9. これをCallMeAgainに貼り付けます。

    Sub TestSheetExistsFromCallMeAgain()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMeAgain!"
        End If
    End Sub
    
  10. F5キーを押して、CallMe内からコードを実行します。次のメッセージボックスが表示されます。 ここに画像の説明を入力してください

  11. 3つの「呼び出し」モジュールのいずれかからコードを実行すると、対応するメッセージボックスが表示されます。

SheetExists関数をTimWilliams(https://stackoverflow.com/a/6688482/138938)から入手し、常に使用しています。

于 2012-07-12T20:11:45.580 に答える
1

クラスモジュールで宣言された関数の前には、class.functionなどのクラス名を付ける必要があります。通常のモジュールで宣言された関数には、一般的なスコープがあります。

于 2013-01-07T13:35:39.470 に答える
1

また、サブにアンダースコアを付けた場合、VBAはそれを好みません。

「Subroutine_Name」は機能しませんが、

「SubroutineName」は機能します。

于 2013-10-17T17:07:36.800 に答える
0

問題は、Excelが関数がグローバルスコープを持っていることを明確にしないことです。

ANDモジュール名を関数名と同じにすることはできません(明らかに)。

モジュール名が他の関数名と類似していない限り、Excel VBを使用すると、他のモジュールから関数を呼び出すことができ、すべての関数にグローバルスコープが効果的に与えられるようです...?!?通常、function()だけでなく、モジュール(またはクラス).function()を呼び出すため、これはほとんどのプログラミング言語とは大きく異なります。Excelのすべての関数がグローバルスコープを持っているというのは本当に本当ですか?それはちょっと違う...

モジュール「SheetChecker」(および名前を関数名と同じにすることはできません)

Function SheetExists(SheetName As String) As Boolean
' returns TRUE if the sheet exists in the active workbook
    SheetExists = False
    On Error GoTo NoSuchSheet
    If Len(Sheets(SheetName).Name) > 0 Then
        SheetExists = True
        Exit Function
    End If
NoSuchSheet:
End Function

モジュール「anyOtherModule」

SheetExists("mysheet")

モジュール(サブブロック以外)で宣言された関数は、VB Excelでグローバルスコープを持っています(そうです)。

于 2012-07-13T15:27:55.890 に答える