Vba 采用增广函数输入
本人声明如下:Vba 采用增广函数输入,vba,excel,user-defined-functions,Vba,Excel,User Defined Functions,本人声明如下: Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal X0_Y1 As Long) As Long 它获取监视器分辨率 因此,在将来,我记得键入0表示x分辨率,键入1表示y分辨率,我命名了参数变量来说明这一点(X0_Y1)。(因此用户可以在输入函数时使用ctrl+a或ctrl+Shift+a来显示其参数) 但我真正想要的是键入“x”以获得x分辨率,键入“y”以获得y分辨率(即,=GetSystemMet
Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal X0_Y1 As Long) As Long
它获取监视器分辨率
因此,在将来,我记得键入0表示x分辨率,键入1表示y分辨率,我命名了参数变量来说明这一点(X0_Y1
)。(因此用户可以在输入函数时使用ctrl+a或ctrl+Shift+a来显示其参数)
但我真正想要的是键入“x”以获得x分辨率,键入“y”以获得y分辨率(即,=GetSystemMetrics(“x”)
给出x分辨率)。有没有一种方法可以在功能丧失的情况下做到这一点?像(ByVal iif(X0_Y1=“x”,0,1)一样长)
来指定如何处理输入
我不想这样做:
Function GetRes(letter As String) As Long
Dim i As Long
i = IIf(letter = "x", 0, 1)
GetRes = GetSystemMetrics(i)
End Function
因为它涉及到创建一个全新的函数,这比只使用基本函数更不合适。
也许有某种方法可以将x/y指定为常量,这样,如果用户输入它们,它们将被读取为数字而不是字符串?另一个不错的选择是像单元格
函数那样显示输入选项。(类似于)
您可以使用
像这样声明一个枚举和你的函数
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编辑器中启用自动完成
为了增强工作表中的可用性,可以将函数注册/注销为UDF(用户定义函数)。注册后,您可以从功能菜单中选择您的功能,并在此对话框中看到注释
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
然后您可以在工作表中使用函数,如=GetSystemMetrics(xMetrics)
据我所知,创建与内置函数完全相同的行为是不可能的。如您所述,当使用
Sub
调用时,这是可行的,但当从工作表本身(作为单元格公式)调用时则不行。有没有办法做到这一点?据我所知,只有一个解决办法,就像我在上面的答案中添加的那样。因此,您可以获得类似的功能,但并不完全相同。
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