获取增强函数输入
Take augmented function inputs
我声明了以下内容:
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal X0_Y1 As Long) As Long
它抓取显示器分辨率。
以便将来我记得为 x 分辨率键入 0,为 y 分辨率键入 1 我命名了参数变量以说明这一点 (X0_Y1
)。 (因此用户可以使用 ctrl+a 或 ctrl+Shift+a 进入函数时显示其参数)
但我真正想要的是键入 "x" 以获得 x 分辨率,键入 "y" 以获得 y 分辨率(即 =GetSystemMetrics("x")
给出 x 分辨率)。有没有办法在函数 decleration 中做到这一点?喜欢 (ByVal iif(X0_Y1 ="x",0,1) As Long)
以指定如何处理输入。
我不想只这样做:
Function GetRes(letter As String) As Long
Dim i As Long
i = IIf(letter = "x", 0, 1)
GetRes = GetSystemMetrics(i)
End Function
因为它涉及创建一个全新的功能,它比仅使用基本功能更笨拙。
也许有一些方法可以将 x/y 指定为常量,这样如果用户输入它们,它们就会被读取为数字而不是字符串?另一个不错的选择是像 Cell
函数那样显示输入选项。 (类似于 this question, but not the same)
您可以为此使用 Enum Statement。
像这样声明一个枚举和你的函数
Public Enum MetricsType
xMetrics = 0
yMetrics = 1
End Enum
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal xy As MetricsType) As Long
你可以这样使用它
Dim x As Long, y As Long
x = GetSystemMetrics(xMetrics)
y = GetSystemMetrics(yMetrics)
这还将在 VBA 编辑器中启用自动完成功能。
为了增强工作表中的可用性,您可以 register/unregister 您的函数作为 UDF(用户定义的函数)。注册后,您可以从功能菜单中 select 您的功能,并在此对话框中看到评论。
Sub RegisterUDF()
Dim s As String
s = "Some description here" & vbLf _
& "GetSystemMetrics(<Metrics>)"
Application.MacroOptions Macro:="GetSystemMetrics", Description:=s, Category:="My Category"
End Sub
Sub UnregisterUDF()
Application.MacroOptions Macro:="GetSystemMetrics", Description:=Empty, Category:=Empty
End Sub
要使枚举在工作表中正常工作,只有可行的解决方法。因此,您添加一个引用 =0
或 =1
的命名范围,如下所示:
Sub RegisterEnum()
ActiveWorkbook.Names.Add Name:="xMetrics", RefersToR1C1:="=0"
ActiveWorkbook.Names.Add Name:="yMetrics", RefersToR1C1:="=1"
'NOTE: don't use x or y as names here as these refer to the column names.
'That's why I used xMetrics instead.
End Sub
然后您就可以在您的工作表中使用该函数,例如 =GetSystemMetrics(xMetrics)
。
据我所知,创建与内置函数完全相同的行为是不可能的。
我声明了以下内容:
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal X0_Y1 As Long) As Long
它抓取显示器分辨率。
以便将来我记得为 x 分辨率键入 0,为 y 分辨率键入 1 我命名了参数变量以说明这一点 (X0_Y1
)。 (因此用户可以使用 ctrl+a 或 ctrl+Shift+a 进入函数时显示其参数)
但我真正想要的是键入 "x" 以获得 x 分辨率,键入 "y" 以获得 y 分辨率(即 =GetSystemMetrics("x")
给出 x 分辨率)。有没有办法在函数 decleration 中做到这一点?喜欢 (ByVal iif(X0_Y1 ="x",0,1) As Long)
以指定如何处理输入。
我不想只这样做:
Function GetRes(letter As String) As Long
Dim i As Long
i = IIf(letter = "x", 0, 1)
GetRes = GetSystemMetrics(i)
End Function
因为它涉及创建一个全新的功能,它比仅使用基本功能更笨拙。
也许有一些方法可以将 x/y 指定为常量,这样如果用户输入它们,它们就会被读取为数字而不是字符串?另一个不错的选择是像 Cell
函数那样显示输入选项。 (类似于 this question, but not the same)
您可以为此使用 Enum Statement。
像这样声明一个枚举和你的函数
Public Enum MetricsType
xMetrics = 0
yMetrics = 1
End Enum
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal xy As MetricsType) As Long
你可以这样使用它
Dim x As Long, y As Long
x = GetSystemMetrics(xMetrics)
y = GetSystemMetrics(yMetrics)
这还将在 VBA 编辑器中启用自动完成功能。
为了增强工作表中的可用性,您可以 register/unregister 您的函数作为 UDF(用户定义的函数)。注册后,您可以从功能菜单中 select 您的功能,并在此对话框中看到评论。
Sub RegisterUDF()
Dim s As String
s = "Some description here" & vbLf _
& "GetSystemMetrics(<Metrics>)"
Application.MacroOptions Macro:="GetSystemMetrics", Description:=s, Category:="My Category"
End Sub
Sub UnregisterUDF()
Application.MacroOptions Macro:="GetSystemMetrics", Description:=Empty, Category:=Empty
End Sub
要使枚举在工作表中正常工作,只有可行的解决方法。因此,您添加一个引用 =0
或 =1
的命名范围,如下所示:
Sub RegisterEnum()
ActiveWorkbook.Names.Add Name:="xMetrics", RefersToR1C1:="=0"
ActiveWorkbook.Names.Add Name:="yMetrics", RefersToR1C1:="=1"
'NOTE: don't use x or y as names here as these refer to the column names.
'That's why I used xMetrics instead.
End Sub
然后您就可以在您的工作表中使用该函数,例如 =GetSystemMetrics(xMetrics)
。
据我所知,创建与内置函数完全相同的行为是不可能的。