Excel VBA UDF自动完成参数

我意识到有数以千计的评论和数百个与本网站UDF工具提示有关的问题,外部论坛和各种讨论小组。 我真的是新来的VBA和Excel,但最近学到了很多。 有了这段时间,我已经学习了,我也看到了这些论坛,所以请不要给我链接到Excel-DNA等第三方解决方法。这不是同一个问题。 我不想填充工具提示,我想自动完成UDF参数到单元格中。


简而言之,标题说明了一切,有没有办法自主地将UDF参数填充到string中。

我已经search了文档网站的任何相关的东西,但没有成功。 所以下一步就是find一个对用户来说比较容易的解决scheme,对用户的计算机内存非常友好,更不用说开发人员友好,不需要花费很多时间,而是build立在跨平台兼容性和简单自定义。

由于我是Excel新手,我不确定加载项是如何在Workbook对象中工作的。 我可以通过试验和错误发现,但是在文档网站上发现的类似于我所期望的结果的最接近的事情是强制自动更正:

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

FIGA

这很快,完成工作! ……..但就是这样。

这有效的原因有两个:

  • 公式/ UDF是唯一启动的,带有一个=符号,所以我不必做太多的编码来弄清楚用户打字的原因是什么
  • 减less代码和错误的可能性。 特别是对于需要不同语法的Win 64bit版本和32位版本,以及在使用API​​时Mac用户可能

有一个很好的理由,有10个坏的。 我将强调一些:

  1. 它允许你按下input,标签等去到下一个单元格,下单元格等
  2. 光标会移到string的末尾,这对于自动更正是正常的,但是对于要填写的强制性参数来说是不可取的。
  3. 我将不得不手动策划一个'AddReplacement'数组
  4. 这在嵌套函数的公式中是无用的

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

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

这里发生的是如果用户按下input,Excel将自动包括右括号,但是,在这种情况下会出现错误, “Excel认为这是公式错误:1 + 1 = 2” ,因为Excel认为它不是由于<>符号的公式。 所以用户现在是100%肯定他们需要审查。

Butttttt …..说了所有的话,一个巨大的障碍仍然存在,用户必须按此空间来填充。 哎哟。 只要我用过excel,select函数后我从来没有按过空格,我无法想象这对任何人来说都是自然的事情。

所以我尝试了一些方法来规避这种行为。 到目前为止没有工作。 我尝试使用Autocorrect对象内的Application.SendKeys

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

接下来,我尝试使用Application.OnKey事件来处理Tab键被按下,所以我可以解码,如果它是一个函数/ UDF后,我不断收到一个错误,指出macros可能由于某种原因不可用。 我觉得现在反正好了,想想这个选项可能是维护的一个噩梦(用户目前在做什么?用户在哪里?用户是否按下了一个用户窗体控件上的选项卡等等)。不要以为这是可行的,除非在那个文档站点找不到我已经build好的东西,那我就难住了。

任何人有一个坚实的解决scheme的核心问题? 我现在不喜欢设置光标位置等技巧,只是基本的自动完成发生而不按空格。 基本上,我想仿效CTRL + SHIFT + A在单元格中inputUDF之后所做的


更新1

好吧,在玩了这些之后,我有更多的信息可以帮助分享。

我确实玩过与选项卡有关的Application.OnKey事件,并得出结论,Microsoft有一个特殊的事件处理程序,用于在公式列表中select公式选项。 如果有人能帮我弄清楚如何访问,我认为我们可以继续这样做。 我的Debug.Printstring“按下Tab”没有执行在第一个Tab按从公式的build议列表中select公式时按下。 应用程序对象不能识别它作为一个标签按下,因为它是从列表中select的东西,使我相信他们有自己的事件处理程序。 只是要抓住我认为我们会很好去。

同时,我find了一个难得的方法来使这个工作,而不必按空格,在Excel>选项>公式中将Formula Autocomplete设置为false。 该列表不会填充,如果用户只是键入`= EPP(“它将填写其余的只是希望!但这是一个用户特定的设置,所以这不是最佳的缩放。