采用增强函数输入

时间:2017-05-02 12:14:16

标签: vba excel-vba user-defined-functions excel

我声明了以下内容:

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 res和“y”获得y res(即=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

CELL function

1 个答案:

答案 0 :(得分:2)

您可以使用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编辑器中启用AutoComplete。

为了增强工作表中的可用性,您可以将您的功能注册/取消注册为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

要使工作表中的枚举工作,只能使用解决方法。因此,您可以添加引用=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)

据我所知,创建与内置函数完全相同的行为是不可能的。