使用Excel作为Access数据库的前端(使用VBA)

时间:2009-03-10 15:23:25

标签: excel ms-access vba

我正在为朋友构建一个小应用程序,他们希望能够使用Excel作为前端。 (UI基本上是Excel中的用户表单)。他们在Excel中有一堆数据,他们希望能够查询,但我不想将excel用作数据库,因为我认为它不适合这个目的,我正在考虑使用Access。 [顺便说一句,我知道Access有它的缺点,但没有可用的预算和已经在朋友的PC上访问]

总结一下,我正在考虑将一堆数据转储到Access中,然后使用Excel作为前端来查询数据库并在用户表单样式环境中显示结果。

问题:

  1. 使用ADO / DAO从Excel链接到Access有多容易?它在功能方面是非常有限的还是我可以发挥创意?
  2. 我是否支付了性能损失(相对于在Access中使用表单作为用户界面)?
  3. 假设数据库将始终使用Excel VBA中的ADO / DAO命令进行更新,这是否意味着我可以让多个Excel用户使用该单个Access数据库而不会遇到任何并发问题等。
  4. 我应该注意的任何其他事情?
  5. 我有很强的Excel VBA技能,并认为我可以很快克服Access VBA但从未真正完成过Excel / Access链接。我可以把数据塞进Excel并用作准数据库,但这似乎比它的价值更痛苦(而不是一个强大的长期解决方案)

    任何建议表示赞赏。

    亚历

12 个答案:

答案 0 :(得分:41)

我相信你会得到很多“不要这样做”的答案,我必须说,有充分的理由。这不是一个理想的解决方案......

话虽如此,我之前已经走过这条路(和类似的路),主要是因为这项工作将其指定为一项艰难的要求,我无法谈论它。

以下是一些需要考虑的事项:

  

使用ADO / DAO从Excel链接到Access有多容易?它在功能方面是非常有限的还是我可以发挥创意?

这是相当直截了当的。你比使用其他工具做的事情更有限,因为VBA和Excel表单比大多数完整的编程语言更有限,但没有任何东西会成为一个显示阻止。它有效 - 有时它有点难看,但确实有效。在我上一家公司,我经常不得不这样做 - 偶尔也会通过Excel中的VBA从Access和Oracle中提取数据。

  

我是否支付了性能损失(与在Access中使用表单作为用户界面相比)?

我的经验是肯定有一个性能。这样做会受到惩罚。我从不关心(在我的用例中,事情足够小以至于合理),但是Excel< - > Access比直接在Access中工作要慢得多。部分取决于你想做什么....

就我而言,似乎绝对最慢(最痛苦)的事情是尝试根据Access数据填写Excel电子表格。这不好玩,而且往往很慢。如果你必须沿着这条路前进,请确保使用隐藏/隐藏的Excel做任何事情,否则重绘将绝对会杀死你。

  

假设数据库将始终使用Excel VBA中的ADO / DAO命令进行更新,这是否意味着我可以让多个Excel用户使用该单个Access数据库而不会遇到任何并发问题等。

您几乎使用Excel作为客户端 - 与使用WinForms应用程序或任何其他工具的方式相同。用于Access的ADO / DAO客户端非常好,因此您可能不会遇到任何并发问题。

话虽如此,Access不能很好地扩展。如果您有2个或3个(甚至10个)用户,这非常有用。如果你要100,你可能会遇到问题。此外,我倾向于发现Access需要定期维护才能避免出现腐败问题。必须定期备份Access DB。根据我的经验,定期压缩访问数据库有助于防止数据库损坏。

  

我应该注意的任何其他事情?

你这么做很难。使用Excel来访问Access将比直接使用Access要多得多。

我建议您查看Access VBA API - 其中大部分与Excel相同,因此您将拥有一个小的学习曲线。不同的部件使这更容易。您还将拥有Access报告和表单的所有优点,它们比Excel中的数据更加面向数据。报告对于这样的事情来说非常有用,从长远来看,拥有宏和报告将使生活更轻松。如果用户将使用表单来管理所有内容,那么在Access中执行表单将非常非常类似于在Excel中执行这些表单,并且看起来几乎相同,但会使所有内容更快更顺畅。

答案 1 :(得分:15)

我一直这样做。如果您正在使用ADO,那么您实际上并不是使用Access,而是基础数据库Jet。这意味着任何使用Excel的人都可以使用该应用程序 - 不需要访问。哦,我应该提一下,我工作的地方买了一堆Office Small Business许可证 - 没有Access。在这里工作之前,我会假设任何拥有Excel的人也会拥有Access。不是这样。

我为Access中的每个表创建一个类。我很少通过ADO运行查询,而是将该逻辑保留在类模块中。我使用SELECT语句读入并使用ADODB.Connection对象的Execute方法使用和UPDATE或INSERT写出。

请参阅http://www.dailydoseofexcel.com/archives/2008/12/21/vba-framework-ii/

如果你想看看我如何设置我的代码。

回答你的问题:如果你已经了解Excel VBA,那将是一个很小的学习曲线,但是会有一些学习要做;你会在Access中支付一个性能惩罚,但这并不是那么糟糕,只有你能决定它是否值得;并且您可以让多个人访问数据库。

答案 2 :(得分:9)

跳过excel部分 - excel用户表单只是一个穷人的版本,更强大的Access形式。 Access VBA也与Excel VBA完全相同 - 您只需学习Access'对象模型。使用简单的应用程序,您无需编写更多VBA,因为在Access中您可以非常轻松地将事物连接在一起。

答案 3 :(得分:8)

如果最终用户具有Access,则可能更容易在Access中开发整个内容。 Access内置了一些WYSIWYG表单设计工具。

答案 4 :(得分:7)

除非在Excel中运行用户表单有很大的优势,否则我会使用100%Access解决方案,将解决方案和数据导出到Excel中。

根据您的描述,Access似乎是更强大的竞争者,因为它是为使用数据而构建的:
您可以使用更多工具来解决任何数据问题,而不必绕过Excel的限制并将其变为成为Access ...

关于你的问题:

  1. 很简单。关于该主题还有其他一些问题 例如,请参阅this onethat one

  2. 不知道,但我猜可能会有一个小小的惩罚 我看到的最大困难是尝试获取Access提供的所有功能,并在Excel中重新创建其中一些功能。

  3. 是的,您可以拥有多个Excel用户和一个Access数据库 在这里,使用Access作为前端并将数据保存在网络上的链接Access数据库中会更有意义,并且很容易就像馅饼一样,Access中甚至还有一个向导可以帮助您实现这一点:it's just 1 click away

  4. 真的,正如其他大多数人所说的那样,花一点时间熟悉Access,它会为您节省大量时间和麻烦。
    如果您了解VBA并且熟悉Office对象模型,那么您可能会更好地了解Excel,但如果您已经完成了80%的工作。

    在Access中执行此操作的其他优点:Access 2007 runtime is free,这意味着如果您要将应用程序部署到1或30台PC,则会花费相同的成本:
    您只需要一个完整版本的Access用于开发工作(Runtime没有设计人员)。

答案 5 :(得分:3)

这实际上取决于应用程序。对于普通项目,我建议仅使用Access,但有时需求是特定的,Excel电子表格可能更合适。

例如,在我必须为前雇主开发的项目中,需要在表格上提供对不同人员的访问(预先填写一些数据,每个人不同)并让他们完成它们,然后重新 - 导入数据。

由于表单使用了大数字运算,因此在Excel中构建它更有意义。

不同人员的Excel工作簿是使用VBA从模板构建的,然后保存在适当的位置,并具有该文件夹的访问权限。

使用命名范围将所有工作簿作为外部表附加到工作簿。然后,我可以从Access应用程序查询工作簿。所有管理内容都是从db创建的,但最终用户只能访问他们各自的工作簿。

以这种方式开发Excel / Access应用程序是一种愉快的体验,并且U​​I比使用Access时更加用户友好。

我不得不说,在这种情况下,在Access中使用Excel需要花费更多的时间。此外,应用程序对象模型在Excel中似乎比在Access中更好。

如果您打算使用Excel作为前端,请不要忘记锁定所有单元格,但是可编辑的单元格并且不要害怕使用屏蔽的行和列(为访问数据库构造输出表,执行中间计算等)。

您还应该在导入数据时关闭自动计算。

答案 6 :(得分:2)

使用Excel作为Access数据的报告工具非常简单有效。 快速“非编程”方法是设置链接到外部数据源的列表或数据透视表。但这超出了Stackoverflow的范围 程序化方法可以非常简单:

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

就是这样!

答案 7 :(得分:1)

鉴于Access的易用性,除了导出数据进行数字运算之外,我没有看到使用Excel的令人信服的理由。 Access旨在轻松构建数据表单,在我看来,与使用Excel相比,它将更容易,更省时。学习Access对象模型几个小时就会花费很多时间和精力。

答案 8 :(得分:1)

我在我的一个项目中做过。我使用MDB存储有关账单的数据,并使用Excel对其进行渲染,使用户可以对其进行调整。

在这种情况下,最好的解决方案是:

  1. 不在Excel中使用任何ADO / DAO 。我在MDB模块中将所有内容实现为公共函数,并直接从Excel调用它们。您可以通过使用必要的参数调用MDB函数来返回复杂的数据对象,如字符串数组等。这类似于现代Web应用程序的客户端/服务器体系结构:Web应用程序只是进行呈现和用户交互,数据库和中间层就在服务器端。

  2. 使用Excel表单进行用户交互和数据可视化。

  3. 我通常有一张最后一张表,其中包含一些名称设置区域:MDB文件的路径,一些设置(当前用户,密码,如果需要等等) - 这样您就可以轻松地将Excel实现调整为不同的您“后端”数据的位置。

答案 9 :(得分:0)

使用VBA将Excel连接到Access非常有用,我每天都在我的专业中使用它。我使用的连接字符串是根据以下链接中的程序。程序可以自动执行多个连接或任务,但基本连接代码看起来相同。祝你好运!

http://vbaexcel.eu/vba-macro-code/database-connection-retrieve-data-from-database-querying-data-into-excel-using-vba-dao

答案 10 :(得分:0)

它取决于Excel< - > Acess解决方案所期望的功能。在许多情况下,如果您没有预算来获得完整的应用程序解决方案,那么这些小实用程序就能正常运行如果项目范围有限,那么我会选择这个解决方案,因为excel确实可以根据您的需要灵活地设计电子表格,然后您可以使用这些预先设计的表单供用户使用。在Access中设计类似于表单的电子表格更耗时且更困难,并且需要一些ActiveX。它的对象可能不仅处理数据,而且像电子表格一样呈现在格式表中,那么这个解决方案应该在有限的范围内工作。

答案 11 :(得分:-1)

您可以尝试XLLoop之类的内容。这使您可以在外部服务器上实现Excel功能(UDF)(提供了许多不同语言的服务器实现)。

例如,您可以使用MySQL数据库和Apache Web服务器,然后使用PHP编写函数以向用户提供数据。

顺便说一句,我参与了这个项目,如果您有任何问题,请告诉我。