VBA模块和传递参数

时间:2014-06-16 13:48:58

标签: vba ms-access

我有一个模块可以从我的应用程序的任何部分调用,以检查用户系统上是否安装了特定字体,如果没有 - 安装字体并在继续之前再次检查

主要适用

if RequiredFont.Run(strFontName) = FALSE Then '(error message and exit sub)

模块" RequiredFont"

Public Function Run(Font As String) As Boolean
    if check(Font) = FALSE Then
        Run = FALSE
        Install(Font)
        if check(Font) = TRUE Then Run = TRUE
    Else
        Run = TRUE
    End If


Private Function Check(Font as String) as Boolean
'code to check the font exists on the users localmachine, returns true/false
End Sub

Private Sub Install(Font as String)
'code to install the font on the users localmachine,
End Sub

我的第一个问题是:

最好的方法是让所有函数和子函数都可以使用参数,并在每次调用时传递它们吗? (如上所示)....还是有一种简单的方法可以在调用Run()时将参数声明为整个模块的变量?

我的第二个问题是:

有没有办法可以完全避免Run(),只需调用模块名称" RequiredFont"直接,我记得在其他语言中,通过某个名称调用sub会在调用模块时自动运行该子

谢谢

编辑 - 这就是我的代码现在的样子:

Private FontName As String
Private FontFile As String


Public Function Run(strFontName As String, strFontFile As String) As Boolean

    FontName = strFontName
    FontFile = strFontFile
    Run = False

    If CheckFont() = False Then InstallFont
    If CheckFont() = True Then
        Run = True
    Else
        'message error"
    End If

End Function


Private Function CheckFont() As Boolean
    'code to check if the font is installed
    On Error Resume Next
    'Create a temporary StdFont object
    With New StdFont
        ' Assign the proposed font name
        .Name = FontName
        ' Return true if font assignment succeded
        If (StrComp(FontName, .Name, vbTextCompare) = 0) = False Then
            CheckFont = False
        Else
            CheckFont = True
        End If
    End With
End Function

Private Sub InstallFont()
' code to install the font
    MsgBox "You need the following font installed to continue." _
    & vbNewLine _
    & vbNewLine & "'" & FontName & "'" _
    & vbNewLine _
    & vbNewLine & "Click OK to launch the font. Please click the INSTALL button at the top"
    OpenFile (PATH_TO_FONTS & FontFile)

End Sub

3 个答案:

答案 0 :(得分:1)

使用函数参数是一种很好的编码实践,这样你就可以准确地知道函数的内容和函数。

但是,您可以使用全局变量,该变量在调用Run时设置一次,并且其他函数仍可访问。

'could also be Private to hide it from other modules
Public myFont As String

Public Function Run(Font As String) As Boolean
    myFont = Font
    '...
End Sub


Private Function Check() as Boolean
' you can access myFont here
End Sub

Private Sub Install()
'idem
End Sub

关于你的第二个问题,我认为你不能。

答案 1 :(得分:1)

您可以声明可选功能,并设置默认值:

Public Function fxMyFunction _
    (Optional lngProj As Variant, _
     Optional strFruit As Variant = "banana", _
     Optional booTest As Boolean = False) As String

   '' IsMissing requires that lngProj be a Variant
   booNoProject = IsMissing(lngProj)  

   fxMyFunction = strFruit

End Function

Optional参数必须遵循非可选参数。

关于"在包含"

上运行的功能

您必须按名称调用函数和subs。没有"自运行功能" VBA标准模块的功能。 VBA"包括"编译时的所有模块。

您可以在VBA类模块中找到构造函数的等价物。投资VBA的面向对象版本似乎对您当前的需求没有帮助。如果你朝那个方向前进,某些方面将开始让你熟悉(尽管可能只是让人感到沮丧,因为OO仍然是一个后来添加的功能并且看起来很像。)

答案 2 :(得分:1)

正如@z所说,你可以使用全局变量,虽然这是不好的做法。

关于问题2,您可以为您的函数指定一个唯一的名称,并省略命名模块以运行它,例如。

findOrInstallFont(Fontname)