Excel应用程序的体系结构

经过10年的编程,我发现自己在Excel 2007中创build我的第一个Excel应用程序是一项艰巨的任务。我之前在MS Access中编写过VBA,所以这对我来说不是一个真正的技术挑战,但是它是“范式”我敢说。

现在,我必须实现一个Excel应用程序,与SQLServer交谈(在我创build的专用数据库上),典型的CRUD东西,但是我不能在任何书上阅读(Excel,Excel Power Programming等)。应该构造应用程序。

  • 我可以给列指定名称,并在将数据发送回SQLServer时将它们用作数据库列

  • 当我检索回数据的时候,例如检索一个电子表格应用程序,例如检索ID,Description(隐藏ID在一个列中并显示Description),或者我应该只使用描述来存储非规范化的数据到SQLServer表中,使他们相当于服务器端的Excel工作表?

  • 如果我想使用像LookupTable(ID,国家)规范化的数据,我应该存储ID,国家信息在一个范围内,如果是这样,我如何强制用户从该范围(ID,国家)一个合适的combobox?

  • 当我从SQLServer中检索数据时,我应该将它build模为一个ADODB.Recordset(例如通过调用一个视图或一个存储过程)并将其复制到Sheet中,以确保Recordset中字段的顺序与Sheet中的相同或者,还有更好的方法?

我相信有很多人了解我的情况,因为他们一直在我的鞋子里,请帮助我跳跃,这将有助于我了解电子表格应用程序的世界。 指向networking资源也非常受欢迎。

谢谢。

我已经写了几个类似于你所描述的应用程序,虽然我不能假装提供最佳实践,我可以根据我的个人经验发表评论。

•在将数据发送回SQLServer时,可以将名称提供给我的列,并将它们用作数据库列

当然,为什么不呢,您可以添加列名作为Excel表格的第一行,并使用单元格保护function来防止最终用户的篡改。 您需要将excel中的数据列与SQL Server中的基础字段关联起来,这是一个很好的方法。

•如果我想使用像LookupTable(ID,国家)的规范化的数据,我应该存储ID,国家信息在一个范围内,如果是的话,我如何强制用户从该范围(ID,国家)使用适当的Combobox?

你可以为每个查找表创build单独的(隐藏的)工作表,并使用这样的代码强制select(基于macroslogging,这样可以清理)

With Sheet1.Range("E3").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=B2:B5" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "A sample" .ErrorTitle = "An error" .InputMessage = "Input message" .ErrorMessage = "Error message" .ShowInput = True .ShowError = True End With 

这会给你一个单元格的combobox,validation失败的错误消息和单元格的标题。

•当我检索回数据时,例如检索ID,Description(隐藏ID在列中并显示Description)的电子表格应用程序,或者我应该只使用Description的所有内容并将非规范化数据存储在SQLServer表中,使他们相当于服务器端的Excel工作表?

这将工作任何方式。 我可能会根据数据的复杂性来决定。 如果你需要在VBA中构build大量的validation代码,我会试图将非规范化的数据提取到SQL Server中的登台表中,然后在将数据移动到主表之前使用存储的procs进行非规范化处理。 因人而异。

•当我从SQLServer中检索数据时,应该将它build模成一个ADODB.Recordset(例如通过调用一个视图或一个存储过程)并将其复制到Sheet中,以确保Recordset中字段的顺序与表还是有更好的方法吗?

我会避免使用复制和粘贴,因为它使用系统范围的剪贴板和奇怪的事情可以开始发生,如果你在同一时间使用电脑。 在Excel中的范围对象有一个CopyFromRecordset方法,您可以用来将数据从ADO推送到工作表。 这比迭代手动分配logging集要快得多。 唯一的缺点是您必须事先自己创build标题列。