Excel VBA UDF 自动完成参数

Posted

技术标签:

【中文标题】Excel VBA UDF 自动完成参数【英文标题】:Excel VBA UDF autocomplete parameters 【发布时间】:2017-05-30 19:55:05 【问题描述】:

我知道在本网站、外部论坛和各种讨论组上存在与 UDF 工具提示相关的数千个 cmets 和数百个问题。我真的是 VBA 和 Excel 的新手,但最近学到了很多东西。随着我投入学习的时间,我也看过那些论坛,所以请不要向我发送 Excel-DNA 等第三方解决方法的链接。这是不是同一个问题.我不想填充工具提示,我想将 UDF 参数自动填充到单元格中。


简而言之,标题说明了一切,有没有办法自动将 UDF 参数填充到字符串中。

我在Documentation site 上搜索了与此相关的任何内容,但均未成功。所以下一步是找到一个对用户来说相对容易,对用户计算机内存非常友好的解决方案,更不用说对开发人员友好,不需要花费很多时间,内置跨平台兼容性和简单自定义。

由于我是 Excel 新手,我不确定加载项在 Workbook 对象方面的工作方式。我可以通过反复试验找到答案,但我在文档网站上找到的最接近我想要的结果的方法是强制自动更正:

With Application.AutoCorrect
  .AddReplacement "=EPP(", "=EPP(payrate,hrs)"
End With

这很快就能完成工作!!! ........ 仅此而已。

这有两个原因:

公式/UDF 是唯一启动的,带有 = 符号,所以我不 必须进行过多的编码才能弄清楚用户输入的内容以及其他原因 减少代码和错误的可能性。尤其是对于需要不同语法的 Win 64 位版本和 32 位版本,Mac 用户在使用 API 时可能

每一个好的理由,都有 10 个坏的。我会强调一些:

    它允许您按 Enter、Tab 等键转到下一个单元格、下一个单元格等。 光标移动到字符串的末尾,这对于自动更正来说是正常的,但对于必须填写的参数来说是不可取的。 我将不得不手动管理一个“AddReplacement”数组 这在带有嵌套函数的公式中没有用

通过将其更改为以下内容,我能够解决其中的一些问题:

With Application.AutoCorrect
  .AddReplacement "=EPP(", "=EPP(<payrate>,<hrs>"
End With

这里发生的情况是,如果用户按下回车,Excel 将自动包含右括号,但是,在这种情况下会抛出一个错误,'Excel 认为这是一个公式错误:1+1 = 2' ,因为由于&lt;&gt; 符号,Excel 认为它不是公式。所以用户现在 100% 确定他们需要审查。

Butttttt.....说了这么多,还有一个巨大的障碍,用户必须按下空间来填充。哎哟。只要我用过excel,我从来没有在选择一个函数后按空格,我无法想象这对任何人来说都是一件很自然的事情。

所以我尝试了一些方法来规避这种行为。到目前为止没有任何效果。我尝试在自动更正对象中使用Application.SendKeys

With Application.AutoCorrect
  .AddReplacement "=EPP(", "=EPP("
  .Application.SendKeys "^+A" 'CTRL + SHIFT + A also tried " " for space
End With

接下来我尝试使用Application.OnKey 事件来处理按下 Tab 键时的情况,因此我可以破译它是否在函数/UDF 之后,我不断收到错误消息,指出宏可能由于某种原因不可用.无论如何,我认为现在这很好,考虑该选项可能是维护的噩梦(用户当前在做什么?用户在哪里?用户是否在用户窗体控件上按下标签?等等)不要认为这是可行的,除非我在那个文档站点中找不到已经内置的东西,否则我很难过。

有人对核心问题有可靠的解决方法吗?我现在不关心设置光标位置等技术细节,只是在不按空格的情况下发生基本的自动完成。基本上,我想模拟在单元格中输入 UDF 后 CTRL + SHIFT + A 的作用


更新 1

好的,在玩了这个之后,我有更多的信息可以分享,这可能会有所帮助。

我确实玩过与选项卡相关的Application.OnKey 事件,并得出结论,当在公式列表中选择公式选项时,Microsoft 有一个特殊的事件处理程序。如果有人可以帮助我弄清楚如何访问它,我认为我们可以继续前进。从建议的公式列表中选择公式时,我的 Debug.Print 字符串“Tab was press”没有在第一次按 Tab 时执行。 Application 对象不会将其识别为制表符,因为它正在从该列表中选择某些内容,这使我相信他们有自己的事件处理程序。只需要抓住我认为我们会很好的去。

同时,我发现了一种丑陋的方法来让它工作,而不必按空格,方法是在 Excel > 选项 > 公式中将 Formula Autocomplete 设置为 false。该列表不会填充,如果用户只键入 `=EPP(" 它将根据需要填写其余部分!但这是用户特定的设置,因此这不是缩放的最佳选择。

【问题讨论】:

这太酷了! 您可以使用 VBA 设置 Formula Autocomplete 【参考方案1】:

这可能对https://msdn.microsoft.com/en-us/library/ms178786(v=vs.100).aspx智能标签有帮助

【讨论】:

显然你误解了我的问题。它不是创新的声明。我在问是否有人有任何不是第 3 方解决方案的解决方法,并且简单地说,我尝试过的事情(其中之一是使用自动更正,正如我在我的问题中所说的那样,这是我发现的最接近的事情) .我完全知道按 control + shift + a 是否可以做到这一点,但这不适合我。它适用于所有不了解 CTL+SHFT+A 并模拟原生体验的普通用户。对不起,如果我的标题具有误导性,我并不是说自动完成 UDF 名称,更重要的是参数 如果您不明白为什么要发布问题作为答案?我的问题在 OP 中概述了我尝试过的事情和我描述的最终目标(所有这些都遵循 SO 的良好问题形式)我认为免责声明下的第一句话很好地总结了它。 好吧,伙计,我已经把我的回答搞砸了,很抱歉让你不高兴了。现在小心点。

以上是关于Excel VBA UDF 自动完成参数的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA在IE11中使用自动完成填充文本框

对于第一个句点之后的参数,自动完成/下拉框

VBA Excel UDF保留原始值

Excel自动计算设置

excelvba不能匹配自动补齐

如何在 VBA Excel UDF 参数中使用比较运算符?