Excel应用程序的体系结构

时间:2010-11-30 22:16:22

标签: excel architecture excel-vba excel-2007 vba

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

现在我必须实现一个与SQLServer对话的Excel应用程序(在我创建的专用数据库上),典型的CRUD内容,但我在任何书籍上都看不到的内容(Excel Bible,Excel Power Programming等...)我应该如何构建应用程序。

  • 我可以为我的列命名并在将数据发送回SQLServer时将它们用作数据库列

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

  • 如果我想使用LookupTable(ID,Country)之类的标准化数据,我应该将ID,Country信息存储在Range中吗?如果是,我该如何强制用户从该Range中选择一个值( ID,国家/地区)没有使用合适的Combobox?

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

我确信有很多人了解我的情况,因为他们一直在我的鞋子里,请帮助我做一些有助于我理解电子表格应用世界的跳转。指向网络资源的指针也非常受欢迎。

感谢。

1 个答案:

答案 0 :(得分:8)

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

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

当然,为什么不这样做,您可以将列名添加为Excel工作表的第一行,并使用单元格保护功能来防止最终用户篡改。您需要以某种方式将excel中的数据列与SQL Server中的基础字段相关联,这与任何方式一样好。

•如果我想使用像LookupTable(ID,Country)这样的标准化数据,我应该将ID,国家/地区信息存储在一个范围中,如果是这样,我该如何强制用户从该范围中选择一个值(ID,国家)没有使用合适的Combobox?

您可以为每个查找表创建单独的(隐藏)工作表,并使用类似的代码强制选择(基于宏录制,以便可以清理)


    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

这将为您提供单元格中的组合框,验证失败时的错误消息以及单元格的标题。

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

无论哪种方式都可以。我可能会根据数据的复杂程度来决定。如果您需要在VBA中构建大量验证代码,我很想将非规范化数据拉入SQL Server中的临时表,然后在将数据移动到主表之前使用存储过程进行非规范化。 YMMV。

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

我会避免使用复制和粘贴,因为它使用系统范围的剪贴板,如果您同时使用PC,可能会发生奇怪的事情。 excel中的range对象具有CopyFromRecordset方法,可用于将数据从ADO推送到工作表。它比手动分配迭代记录集要快得多。唯一的缺点是你必须事先自己创建标题列。