Excel VBA 中的现代表单和表单控件
Posted
技术标签:
【中文标题】Excel VBA 中的现代表单和表单控件【英文标题】:Modern forms and form controls in Excel VBA 【发布时间】:2014-11-06 02:43:32 【问题描述】:Excel VBA 的窗体和控件的外观自 Excel 97 以来一直没有更新。它们看起来像 Windows 95。它已成为一种非常老式的外观。
某些控件(例如复选框、单选按钮和编辑框)具有可以使它们看起来是二维的属性。早在 1997 年,这让它们看起来像 Windows 3x 一样过时,但具有讽刺意味的是(?*)它使这些控件看起来更现代。我一直在这样做,但它不适用于其他一些控件,尤其是命令按钮和下拉菜单。
是否可以直接调用 Windows API 来获得更现代的表单和表单控件?如果是这样,是否有人为他们制作了一些样板 VBA 模块?
另外,Macintosh 上的 Excel 也可以这样做吗?
*我曾经认为我理解讽刺,但我再也不确定了。
【问题讨论】:
【参考方案1】:这不一定是访问其他控件,但我发现这对于控制 VBA 不提供访问权限的事物非常有用(遗憾的是)。您可以使用此处提供的类:http://www.oaltd.co.uk/Spreads/FormFun.zip 来访问表单上的某些 Windows API 功能。
假设类被称为 cWindowsAPI:
private sub UserForm_Initialize()
Dim formVar as cWindowAPI
Set formVar = new cWindowAPI
Set formVar.Form = Me
' Now you have access to the different options available via the api
' that were exposed within the cWindowAPI class of course
formVar.ShowCaption = false
formVar.ShowMaximizeBtn = false
' Etc...
End Sub
也许可以使用您遇到的有用 API 对此进行扩展。
【讨论】:
【参考方案2】:也许构建一个 Dictator 应用程序并使用 Excel 形状作为前端控件。使用 3D 效果会很漂亮和有光泽。但是根据我的经验,这也需要大量的编码,因为每个形状对象的每个状态都必须自己编码。
【讨论】:
虽然在输入这篇文章时有好处,但我只是在 Excel 中使用椭圆形创建了一个切换/单选按钮替换 - 带发光的灰色到绿色。我只花了 4-5 分钟,所以一旦你掌握了窍门,它是可行的【参考方案3】:从 VBA 调用 Windows API 是可能的,但这是一个大量的工作,容易出错并且相当难以调试 - 我不推荐它。
或者,您可以使用 C# 或 VB.Net 创建 ActiveX 控件,然后在您的项目中使用这些控件 - 这样做要简单得多。这个question / answer有更多细节。
【讨论】:
这需要分发每个用户都必须安装的 DLL。很少有客户愿意这样做,而我的客户打算将自动 Excel 工作簿分发给他的客户,每个客户都在自己的公司环境中,有自己的规则和限制,需要分发 DLL 通常会破坏交易.我已经在许多项目中调用了 Windows API。你的意思是你觉得一般来说很难,还是很难做到创建表单控件,我猜这是一个复杂的项目? @GregLovern 好吧,您在问题中没有提到这一点。另外,它并没有太大的改变——您可以从 VBA 调用 API 函数,但要让简单的控件正常工作也需要做很多工作。 @GregLovern 通过来自 VBA 的 API 调用实现完整的自定义控件是一个非常复杂的项目 - 必须从 windows.h 重新声明所有相关的类型/API 函数声明,然后使用它们编写代码。这是一项庞大的工作,而且很容易出错。还有其他问题:我不确定您是否可以轻松获得电子表格的窗口句柄等。 获取各种 Excel 元素的窗口句柄并不难;我已经为几个 Excel VBA 项目做到了这一点。 @Rory 没错。我假设 OP 知道这一点,看看他已经如何使用低级窗口句柄。以上是关于Excel VBA 中的现代表单和表单控件的主要内容,如果未能解决你的问题,请参考以下文章
动态添加基于工作表名称的新表单控件复选框(Excel VBA)
Excel 2010 中的“表单控件”和“ActiveX 控件”有啥区别?
VB任务实例,VB向WebBrowser控件提交表单自动登录