采用增强功能输入

Posted

技术标签:

【中文标题】采用增强功能输入【英文标题】:Take augmented function inputs 【发布时间】:2017-05-02 12:14:15 【问题描述】:

我声明了以下内容:

Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal X0_Y1 As Long) As Long

它获取显示器的分辨率。

所以以后我记得为 x 分辨率输入 0,为 y 分辨率输入 1,我已命名参数变量来说明这一点 (X0_Y1)。 (所以用户可以使用 ctrl+actrl+Shift+a输入函数以显示其参数)

但我真正想要的是输入“x”来获取 x res,输入“y”来获取 y res(即=GetSystemMetrics("x") 给出 x 分辨率)。有没有办法在函数声明中做到这一点?像(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)

【问题讨论】:

【参考方案1】:

您可以为此使用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 编辑器中启用自动完成。


为了提高工作表中的可用性,您可以将您的函数注册/取消注册为 UDF(用户定义函数)。注册后,您可以从功能菜单中选择您的功能,并在此对话框中看到 cmets。

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)

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

【讨论】:

这在使用Sub 调用时有效,但在从工作表本身调用时无效(作为单元格公式)。有没有办法做到这一点? 据我所知,只有我在上面的答案中添加的解决方法。所以你得到了类似的功能,但不完全相同。

以上是关于采用增强功能输入的主要内容,如果未能解决你的问题,请参考以下文章

virtualbox安装增强功能时未能加载虚拟光盘

02 - 安装VirtualBox增强功能并设置共享文件夹

第十部分:增强defer功能的客户端

魔众轻量论坛系统 v3.0.0 全新架构升级,多项功能增强

如何增强NetBeans的智能提示功能

Bootstrap 5.x/4.x./3.x的增强HTML 5文件输入,具有文件预览、多选和更多功能。