使用 Excel 作为 Access 数据库的前端(使用 VBA)
Posted
技术标签:
【中文标题】使用 Excel 作为 Access 数据库的前端(使用 VBA)【英文标题】:Using Excel as front end to Access database (with VBA) 【发布时间】:2010-10-12 11:01:54 【问题描述】:我正在为朋友构建一个小型应用程序,他们希望能够使用 Excel 作为前端。 (用户界面基本上是 Excel 中的用户表单)。他们在 Excel 中有一堆数据,他们希望能够查询,但我不想将 excel 用作数据库,因为我认为它不适合该目的并且正在考虑使用 Access。 [顺便说一句,我知道 Access 有其缺点,但可用的预算为零,而且 Access 已经在朋友的 PC 上]
总而言之,我正在考虑将一堆数据转储到 Access 中,然后使用 Excel 作为前端来查询数据库并在用户窗体样式的环境中显示结果。
问题:
-
使用 ADO/DAO 从 Excel 链接到 Access 有多容易?它在功能方面是否非常有限,或者我可以发挥创意吗?
我是否需要支付性能损失(相对于使用 Access 中的表单作为 UI)?
假设数据库将始终使用 Excel VBA 中的 ADO/DAO 命令进行更新,这是否意味着我可以让多个 Excel 用户使用同一个 Access 数据库而不会遇到任何并发问题等?
还有什么我应该注意的吗?
我有很强的 Excel VBA 技能,我认为我可以很快克服 Access VBA,但以前从未真正完成过 Excel / Access 链接。我可以将数据硬塞到 Excel 中并用作准数据库,但这似乎比它的价值更痛苦(而且不是一个强大的长期解决方案)
任何建议表示赞赏。
亚历克斯
【问题讨论】:
我也想知道这次讨论的结果如何。我有一个为教师制作的类似项目(它是一个成绩簿 excel 应用程序)。我选择 Excel 的原因是因为需要显示大量计算字段,而电子表格 UI 是同时输入/查看学生成绩的最佳选择。然而,维护原始数据是一场噩梦。我正在考虑在前端仍在 Excel 中时将后端移植到 Access。我认为就我的目的而言,这是最好的设置,除非有一种简单的方法来编写电子表格 UI 【参考方案1】:如果最终用户拥有 Access,则在 Access 中开发整个项目可能会更容易。 Access 内置了一些所见即所得的表单设计工具。
【讨论】:
+1;如果您在 Access 中使用数据表视图,您可以获得电子表格的外观。我相信你可以用 Excel 做到这一点,但感觉这会带来很多麻烦而收效甚微。【参考方案2】:跳过 excel 部分 - excel 用户表单只是更强大的 Access 表单方式的穷人版本。此外,Access VBA 与 Excel VBA 相同——您只需学习 Access 的对象模型。使用简单的应用程序,您无论如何都不需要编写太多的 VBA,因为在 Access 中,您可以很容易地将事物连接在一起。
【讨论】:
【参考方案3】:我相信你会得到很多“不要这样做”的答案,我必须说,这是有充分理由的。这不是一个理想的解决方案......
话虽如此,我之前也曾走这条路(和类似的路),主要是因为这份工作将其指定为一项硬性要求,而我无法谈论它。
这里有几点需要考虑:
使用 ADO/DAO 从 Excel 链接到 Access 有多容易?它在功能方面是否非常有限,或者我可以发挥创意吗?
这是相当严格的。你比使用其他工具做事更受限制,因为 VBA 和 Excel 表单比大多数完整的编程语言更受限制,但没有任何东西可以阻止你。它有效 - 有时它有点难看,但它确实有效。在我上一家公司时,我经常不得不这样做 - 偶尔需要通过 Excel 中的 VBA 从 Access 和 Oracle 中提取数据。
我是否需要支付性能损失(相对于使用 Access 中的表单作为 UI)?
我的经验是肯定有一个性能。这样做的惩罚。我从不在乎(在我的用例中,事情足够小以至于它是合理的),但是使用 ExcelAccess 比直接在 Access 中工作要慢得多。部分取决于你想做什么......
就我而言,似乎绝对最慢(也是最痛苦)的事情是尝试根据 Access 数据填写 Excel 电子表格。这不好玩,而且通常很慢。如果您必须走这条路,请确保使用隐藏/不可见的 Excel 进行所有操作,否则重绘绝对会杀死您。
假设数据库将始终使用 Excel VBA 中的 ADO / DAO 命令进行更新,这是否意味着我可以让多个 Excel 用户使用同一个 Access 数据库而不会遇到任何并发问题等?
您几乎将 Excel 用作客户端 - 就像您使用 WinForms 应用程序或任何其他工具一样。 Access 的 ADO/DAO 客户端非常好,因此您可能不会遇到任何并发问题。
话虽如此,Access 不能很好地扩展。如果您有 2 个或 3 个(甚至 10 个)用户,这将非常有用。如果你打算有 100 个,你可能会遇到问题。此外,我倾向于发现 Access 需要定期维护才能避免出现损坏问题。 Access DB 的定期备份是必须的。根据我的经验,定期压缩 access 数据库将有助于防止数据库损坏。
还有什么需要注意的吗?
你这样做很困难。使用 Excel 来点击 Access 将比直接使用 Access 做更多的工作。
我建议您研究 Access VBA API - 其中大部分与 Excel 相同,因此您的学习曲线会很短。不同的部分只是让这更容易。您还将拥有 Access 报告和表单的所有优势,它们比 Excel 中的更面向数据。报告对于此类事情可能非常有用,从长远来看,拥有宏和报告将使生活更轻松。如果用户要使用表单来管理所有内容,那么在 Access 中执行表单将与在 Excel 中执行非常非常相似,并且看起来几乎相同,但会使一切变得更快、更顺畅。
【讨论】:
+1 好又详细的答案,但有时,根据应用程序的目的,Excel 界面更方便【参考方案4】:除非在 Excel 中运行用户表单有很大的优势,否则我会选择 100% Access 解决方案,该解决方案会临时将报告和数据导出到 Excel。
根据您的描述,Access 似乎是更强大的竞争者,因为它是为处理数据而构建的: 您可以使用更多工具来解决任何数据问题,而不必绕过 Excel 的限制并将其硬塞到 Access...
至于你的问题:
非常简单。关于这个主题还有其他一些关于 SO 的问题。 参见例如this one 和that one。
不知道,但我猜可能会有小额罚款。 我看到的最大困难是尝试获取 Access 为您提供的所有功能并在 Excel 中重新创建其中的一些功能。
是的,您可以拥有多个 Excel 用户和一个 Access 数据库。 同样,使用 Access 作为前端并将数据保存在网络上链接的 Access 数据库中会更有意义,而且非常简单,Access 中甚至还有一个向导可以帮助您做到这一点:it's just 1 click away。
真的,正如大多数其他人所说,花一点时间来熟悉 Access,它将为您节省大量时间和麻烦。 如果您了解 VBA 并熟悉 Office 对象模型,您可能更了解 Excel。
在 Access 中执行此操作的其他优势:Access 2007 runtime is free,这意味着如果您要将应用程序部署到 1 或 30 台 PC,您将花费相同的成本:没有。 您的开发工作只需要一个完整版本的 Access(运行时没有设计器)。
【讨论】:
【参考方案5】:我一直这样做。如果您使用的是 ADO,那么您实际上使用的不是 Access,而是底层数据库 Jet。这意味着任何拥有 Excel 的人都可以使用该应用程序 - 不需要 Access。哦,我应该提一下,我工作的地方买了一堆 Office 小型企业许可证 - 没有访问权限。在这里工作之前,我会假设任何拥有 Excel 的人也会拥有 Access。不是这样。
我为 Access 中的每个表创建一个类。我很少通过 ADO 运行查询,而是将逻辑保留在类模块中。我使用 SELECT 语句读入,并使用 ADODB.Connection 对象的 Execute 方法使用 UPDATE 或 INSERT 写出。
见http://www.dailydoseofexcel.com/archives/2008/12/21/vba-framework-ii/
如果你想看看我是如何设置我的代码的。
回答您的问题:如果您已经了解 Excel VBA,这对您来说将是一个小的学习曲线,但需要学习一些东西;您将在 Access 中完成所有操作会付出性能损失,但这并没有那么糟糕,只有您可以决定是否值得;并且您可以让多个人访问数据库。
【讨论】:
同意,如果您熟悉 Excel VBA 并熟悉 Access UI,那么坚持使用 Excel 的学习曲线会更小。没有理由假设性能绝对会比通过 Access Forms 慢得多。 您能否澄清该评论?使用 Jet 作为数据存储并在 Excel 中创建 UI 会比在 Access 中为 Jet 数据存储创建 UI 慢吗? 错字:我的意思是,“如果您熟悉 Excel VBA 并且不熟悉 Access UI...” 如果您不熟悉 Excel,在 Excel 中创建 UI 比在 Access 中创建 UI 慢。 我不知道它是否更慢,我只是一直假设。我什至不确定如何测试它 - 一个绑定到查询的 Access 表单与通过 ADO 或 DAO 运行 SQL 语句。【参考方案6】:鉴于 Access 的易用性,除了导出数据以进行数字运算之外,我认为使用 Excel 没有任何令人信服的理由。 Access 旨在轻松构建数据表单,并且在我看来,它比使用 Excel 更容易且耗时更少。学习 Access 对象模型的几个小时将在时间和精力上获得数倍的回报。
【讨论】:
【参考方案7】:这真的取决于应用程序。对于普通项目,我建议仅使用 Access,但有时,需求是特定的,Excel 电子表格可能更合适。
例如,在我必须为前雇主开发的一个项目中,需要在表格上授予不同人员的访问权限(预先填写了一些数据,每个人都不同)并让他们完成它们,然后重新- 导入数据。
由于表单使用繁重的数字运算,因此在 Excel 中构建它更有意义。
不同人员的 Excel 工作簿是使用 VBA 从模板构建的,然后保存在具有文件夹访问权限的适当位置。
所有工作簿都使用命名范围作为外部表附加到工作簿。然后我可以从 Access 应用程序中查询工作簿。所有管理工作都是从数据库中完成的,但最终用户只能访问他们各自的工作簿。
以这种方式开发 Excel/Access 应用程序是一种愉快的体验,并且 UI 比使用 Access 时更加用户友好。
我不得不说,在这种情况下,在 Access 中执行此操作要比使用 Excel 花费更多时间。此外,应用程序对象模型在 Excel 中似乎比在 Access 中更好。
如果您打算使用 Excel 作为前端,请不要忘记锁定所有单元格,但不要忘记锁定可编辑的单元格,并且不要害怕使用屏蔽的行和列(为 access 数据库构建输出表,执行中间计算等)。
您还应该在导入数据时关闭自动计算。
【讨论】:
【参考方案8】:使用 VBA 将 Excel 连接到 Access 非常有用,我每天都在我的职业中使用它。我使用的连接字符串是根据下面链接中的程序。该程序可以自动执行多个连接或任务,但基本连接代码看起来相同。祝你好运!
http://vbaexcel.eu/vba-macro-code/database-connection-retrieve-data-from-database-querying-data-into-excel-using-vba-dao
【讨论】:
【参考方案9】:这取决于您对 ExcelAcess 解决方案的期望功能。在许多情况下,如果您没有预算来获得完整的应用程序解决方案,这些小实用程序确实可以工作。如果项目范围有限,那么我会选择这个解决方案,因为 excel 确实为您提供了根据您的需要设计电子表格的灵活性,然后您可以使用这些预先设计的表格供用户使用。在 Access 中设计类似表单的电子表格更加耗时和困难,并且确实需要一些 ActiveX。它对象可能不仅处理数据,而且像甲酸盐一样在电子表格中呈现,那么这个解决方案应该在有限的范围内工作。
【讨论】:
【参考方案10】:你可以试试XLLoop。这使您可以在外部服务器上实现 excel 函数 (UDF)(提供了许多不同语言的服务器实现)。
例如,您可以使用 mysql 数据库和 Apache Web 服务器,然后用 php 编写函数来为您的用户提供数据。
顺便说一句,我在这个项目上工作,所以如果您有任何问题,请告诉我。
【讨论】:
这个答案和问题有什么关系? err,这是将动态数据导入excel的一种非常简单的方法。问题是关于使用 excel 作为前端来访问数据库中的数据。 有四个具体的子问题。为什么不帮您的项目一个忙,并详细解释它是如何依次解决这些问题的呢?也就是说,给我一个关注你的链接的理由。 您建议进行大量重大更改,即在取消 Access 之后,1. 安装/维护 MySQL,2. 安装/配置 Apache,3. 使用 PHP 编程。您应该在回答中澄清所有这些事情都远远超出了所问问题的隐含范围。除了 Excel,您的工具需要处理所有其他相关内容,在服务器上安装一堆软件,然后使用原始提问者可能不熟悉的语言进行编程。现在知道了,如果我能,我会再次投反对票。 实际上,它并不像你说的那么难——WampServer 是一个免费的 Windows 的一键式安装,并为您提供 MySQL、Apache 和 PHP。 wampserver.com/en 但这只是一个示例,XLLoop 还有许多其他语言选项,例如 Java、Ruby、Python。我只是强调,仅仅因为 Excel 需要作为前端,并不意味着您与 MS 产品绑定在后端。【参考方案11】:使用 Excel 作为 Access 数据的报告工具非常简单有效。 一种快速的“非编程”方法是设置链接到外部数据源的列表或数据透视表。但这超出了 *** 的范围。 编程方法可以非常简单:
strProv = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SourceFile & ";"
Set cnn = New ADODB.Connection
cnn.Open strProv
Set rst = New ADODB.Recordset
rst.Open strSql, cnn
myDestRange.CopyFromRecordset rst
就是这样!
【讨论】:
【参考方案12】:我在我的一个项目中做到了这一点。我使用 MDB 存储账单数据,并使用 Excel 呈现它们,让用户可以对其进行调整。
在这种情况下,最好的解决方案是:
不要在 Excel 中使用任何 ADO/DAO。我在 MDB 模块中将所有内容都实现为公共函数,并直接从 Excel 中调用它们。通过调用带有必要参数的 MDB 函数,您甚至可以返回复杂的数据对象,如字符串数组等。这类似于现代 Web 应用程序的客户端/服务器架构:您的 Web 应用程序只进行渲染和用户交互,然后数据库和中间层位于服务器端。
使用 Excel 表单进行用户交互和数据可视化。
我通常有最后一张表,其中包含一些用于设置的名称区域:MDB 文件的路径、一些设置(当前用户、需要的密码等)——因此您可以轻松地调整您的 Excel 实现以适应不同的您“后端”数据的位置。
【讨论】:
以上是关于使用 Excel 作为 Access 数据库的前端(使用 VBA)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Excel 中使用带查询的 Access 数据库作为数据透视表
使用 Access 作为前端从 Access 迁移到 MySQL