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 对象。
上面的ReadData子例程使用了如下图所示的关系数据结构,这很难单独在Excel中实现。
进一步的数据更改可能会触发对数据库的写回,适当的 SQL Update 语句后跟 connDB.执行(strSQL)。
最后,保护您的代码不被查看或更改: 工具>属性>保护.
处理Excel问题:
有时,尤其是当它包含复杂的程序时,Excel 可能会崩溃并且无法正确恢复。 如果发生 损坏的 xlsx 如果手边有有效的恢复工具,就能解决大部分文件问题。
作者简介:
Felix Hooker 是一位数据恢复专家 DataNumen, Inc.,它是数据恢复技术领域的世界领先者,包括 修复 rar 错误 和sql恢复软件产品。 欲了解更多信息,请访问 datanumen.com


