如何使用Excel读写外部数据库

立即分享:

Excel 几乎可以做任何事情; 是否应该让它做所有事情是另一回事。 虽然电子表格在处理数据方面非常强大,但它在存储规范化数据方面并不是太好。 将 Excel 用于关系数据库,例如 SQL Server 增强应用程序的功能。

首先,您需要 MS Access 或更稳定且免费的软件—— SQL Server 表达。 假定读者已显示 Excel Developer 功能区,并且熟悉 VBA 编辑器和结构化查询语言 (SQL)。 本文采用 SQL Server 连接字符串。 对于 MS-Access,请参阅 Google。

虽然 Excel 有自己的内置例程来从 SQL Server 到(比方说)一个数据透视表中,我们的示例将在数据选择方面提供更大的灵活性。

连接字符串

我将使用私有数据库; 在 ConnectDatabase 子例程中插入您自己的驱动程序信息代替我的信息。 然后我们使用 连接数据库 作为我们数据库的通信渠道——在我的例子中是从存储过程返回结果。 您可能会使用更标准的 SQL 语句,例如“Select * from …”

业务订单

首先,我们将从加载组合框选项 SQL Server 工作簿打开时,使用 Auto_open 宏将其导入到“ComboData”工作表中。无论服务器位于云端还是本地,只要工作站可以访问数据库,启动 Excel 就不会有明显的延迟。

接下来,我们将从数据库中提取过滤后的数据并将其放入 Excel,从 F 到 K 列。

界面

我的有下拉框来过滤数据库中的信息。 这 职位 组合框触发搜索以填充右侧的表格。角色组合框触发搜索以填充表格

将“Sheet1”重命名为“Main”。 添加至少一个组合框。

守则

Public connDB As New ADODB.Connection
Public rstNew As New ADODB.Recordset
Public rs As New ADODB.Recordset
Public strSQL As String
Public nID As Integer

Sub auto_Open()
    Call PopulateComboData     'kicks off the first process  on Open
End Sub

Sub PopulateComboData()
    Sheets("ComboData").Range("A3:C100").ClearContents
    Call ConnectDatabase      'use the ConnectDatabase routine
    strSQL = "Select DeptID, Department, Phase from tblDept Order by Department"
    Set rs = connDB.Execute(strSQL)
    ActiveSheet.Range("A3").CopyFromRecordset rs      'copies the recordset in bulk
End Sub

Sub ReadData()
    intRole = Sheets("main").Range("D7")
    Sheets("Main").Range("F4:L100").ClearContents
    Call ConnectDatabase
    strSQL = "EXEC DBTest " & intRole    'calls a stored proc with parameter
    Set rs = connDB.Execute(strSQL)
    ActiveSheet.Range("F4").CopyFromRecordset rs      'copies the recordset in bulk
End Sub

Sub ConnectDatabase()
    On Error GoTo ErrConnect
    If connDB.State = 1 Then connDB.Close     'closes connection if already open
    strServer = "197.200.28.164" 
    strDBase = "Qcrew_sql"
    strUser = "joesoap_sql"
    strPWD = "frU6ra!@"
    If strPWD > "" Then 
        strConnectionstring = "DRIVER={SQL Server};Server=" & strServer & _
        ";Database=" & strDBase & ";Uid=" & strUser & ";Pwd=" & strPWD & _
        ";Connection Timeout=30;"
    Else        'Use windows authentication
        strConnectionstring = "DRIVER={SQL Server};SERVER=" & strServer & _
        ";Trusted_Connection=yes;DATABASE=" & strDBase
    End If
    connDB.Open strConnectionstring
Exit Sub
ErrConnect:
    MsgBox Err.Description
End Sub

格式化组合框控件以读取工作表“ComboData”。 然后右键单击组合框以将 ReadData 子过程分配给它。 在组合框中选择一个项目时,将其键写入工作表“Main”的单元格 D7。 VBA 代码将使用此键作为过滤器(请参阅上面的 intRole)。

引用 DLL 库

在代码窗口中使用“工具”>“引用”来引用 Microsoft ActiveX 数据对象库。这将使 Excel 能够使用代码中声明的 ADODB 对象。参考 Microsoft ActiveX 数据对象库

上面的ReadData子例程使用了如下图所示的关系数据结构,这很难单独在Excel中实现。ReadData 子例程使用关系数据结构

进一步的数据更改可能会触发对数据库的写回,适当的 SQL Update 语句后跟 connDB.执行(strSQL)。

最后,保护您的代码不被查看或更改:  工具>属性>保护.

处理Excel问题:

有时,尤其是当它包含复杂的程序时,Excel 可能会崩溃并且无法正确恢复。 如果发生 损坏的 xlsx 如果手边有有效的恢复工具,就能解决大部分文件问题。

作者简介:

Felix Hooker 是一位数据恢复专家 DataNumen, Inc.,它是数据恢复技术领域的世界领先者,包括 修复 rar 错误 和sql恢复软件产品。 欲了解更多信息,请访问 datanumen.com

立即分享:

评论被关闭。