从两个不同的VB(excel)模块调用子功能/模块

Ash*_*her 4 excel vba excel-vba

我有一个功能,我想从各种模块调用.什么是在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
Run Code Online (Sandbox Code Playgroud)

模块"主"

If Not SheetExists.Name("mySheet") Then
    'do this
Else
    ' else do this
End If
Run Code Online (Sandbox Code Playgroud)

希望有这样做还是我?

Call SheetExists.Name("mySheet")
Run Code Online (Sandbox Code Playgroud)

这是从另一个模块调用函数的唯一方法吗?我是否必须将其声明为Public函数或其他内容?

Jon*_*ell 8

不,你不必这样做,你可以从任何地方调用你的功能.

试试这个:

将此代码放在Module1中:

Sub TestSheetExists()
    If SheetExists("Sheet1") Then
        MsgBox "I exist!"
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

这在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
Run Code Online (Sandbox Code Playgroud)

显然,您可以使用您想要的模块的任何名称.


编辑:我看到从不同的模块调用仍然不适合你.请严格按照以下步骤设置可帮助您了解问题的测试工作簿.

  1. 创建一个新的Excel工作簿
  2. 打开VBA编辑器(Alt-F11)
  3. 右键单击项目,然后选择插入模块.重复此4x以获得4个模块.
  4. 按F4打开属性窗口(如果尚未打开)
  5. 将模块名称更改为以下内容:CallMe,CallMeAgain,CallMeBack,验证 重命名模块
  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
    
    Run Code Online (Sandbox Code Playgroud)
  7. 将此子句粘贴到CallMe中:

    Sub TestSheetExistsFromCallMe()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMe!"
        End If
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  8. 将其粘贴到CallMeBack中:

    Sub TestSheetExistsFromCallMeBack()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMeBack!"
        End If
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  9. 将其粘贴到CallMeAgain中:

    Sub TestSheetExistsFromCallMeAgain()
        If SheetExists("Sheet1") Then
            MsgBox "I exist, and I was called from CallMeAgain!"
        End If
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  10. 按F5键从CallMe中运行代码.您应该看到以下消息框: 在此输入图像描述

  11. 从任何3个"呼叫"模块运行代码,您应该看到相应的消息框.

我从Tim Williams(/sf/answers/468193771/)获得了SheetExists功能,并且一直使用它.