我有一个模块可以从我的应用程序的任何部分调用,以检查用户系统上是否安装了特定字体,如果没有 - 安装字体并在继续之前再次检查
主要适用
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
答案 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)