Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 采用增广函数输入_Vba_Excel_User Defined Functions - Fatal编程技术网

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