如何使用 VBA 在 Excel 中添加连接(到外部数据源)并将其保存到该 Excel 电子表格的连接列表
Posted
技术标签:
【中文标题】如何使用 VBA 在 Excel 中添加连接(到外部数据源)并将其保存到该 Excel 电子表格的连接列表【英文标题】:How can I use VBA to add a Connection (to an External Data Source) in Excel and Save it to that Excel spreadsheet's list of Connections 【发布时间】:2013-06-28 05:26:01 【问题描述】:我可以使用 VBA 创建一个新的 ADODB.Connection 以及关联的 ADODB.Command 和 ADOBD.Parameter,然后创建一个 PivotCache 和一个 PivotTable
Sub CreatePivotTable()
'Declare variables
Dim objMyConn As ADODB.Connection
Dim objMyCmd As ADODB.Command
Dim objMyParam As ADODB.Parameter
Dim objMyRecordset As ADODB.Recordset
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=myMIS;Data Source=localhost;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=WKSTN101;Use Encryption for Data=False;Tag with column collation when possible=False"
objMyConn.Open
'Set and Excecute SQL Command'
Set objMyCmd.ActiveConnection = objMyConn
objMyCmd.CommandText = "select a.col1, a.col2, b.col3, b.col4" & _
"from TableA a, TableB b " & _
"where a.col3=b.col5 " & _
"and a.col1=?"
objMyCmd.CommandType = adCmdText
Set objMyParam = objMyCmd.CreateParameter("COLUMN1", adChar, adParamInput, 20, Range("AnotherSheet!A3").Value)
objMyCmd.Parameters.Append objMyParam
'Open Recordset'
Set objMyRecordset.Source = objMyCmd
objMyRecordset.Open
'Create a PivotTable cache and report.
Set objPivotCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
Set objPivotCache.Recordset = objMyRecordset
objPivotCache.CreatePivotTable TableDestination:=Range("A11"), TableName:="PivotTable1"
With ActiveSheet.PivotTables("PivotTable1")
.SmallGrid = False
With .PivotFields("Col3")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields("Col4")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields("Col1")
.Orientation = xlColumnField
.Position = 1
End With
With .PivotFields("Col2")
.Orientation = xlDataField
.Position = 1
End With
End With
...但是在我运行此宏之后,如果我检查连接列表中的连接属性(在功能区的数据选项卡中),它们会显示为禁用(灰显)并且 SQL 命令不会出现在那里(仅通过 VBA 限制进一步的更改)。
我怎样才能创建这些相同的对象,但让它们与 Excel UI 集成,这样未来的用户就不需要使用 VBA?有什么想法吗?
【问题讨论】:
【参考方案1】:您可以使用 macro recorder 生成 VBA 代码,该代码将添加到您的 excel 实例的连接。
我已在此答案的末尾添加了代码,但是如果您按照以下步骤操作,您可以生成自己的代码:
1) 启动宏记录器
2) 在功能区上,单击 Data
选项卡。点击Connections
,然后选择Add
按钮,如下图所示
3) 在下一个屏幕上,选择您现有的数据库连接,然后按照接下来 2 或 3 个屏幕上的步骤配置您的连接。
4) 建立连接并显示在连接列表中后,单击 Properties
按钮并在下一个屏幕上 Export Connection File
5) 停止宏记录器并打开 VBE
(alt+F11)
并编辑您的 Module1
中的代码
6) 从您的宏代码中删除这些行
.ServerFillColor = False
.ServerFontStyle = False
.ServerNumberFormat = False
.ServerTextColor = False
7) 立即保存并关闭文件
请注意,当您重新打开文件并运行宏时,应将连接添加到您的连接列表中
您现在可以使用此代码从导出的文件添加连接
Workbooks("Book1").Connections.AddFromFile _
"C:\Users\...\exported_file_name.odc"
或者可以运行录制的代码,让宏帮你添加
【讨论】:
您的意思是连接没有保存在 xls 文件中,但可以导出到 .odc 文件,下次打开 xls 文件时会加载该文件? 如果您一直丢失连接字符串,那么这是从保存的文件中检索它的一种解决方法。如果您按原样重新分配它,那么所有使用您的 Excel 电子表格的人都将能够导出/导入他们自己的连接字符串。以上是关于如何使用 VBA 在 Excel 中添加连接(到外部数据源)并将其保存到该 Excel 电子表格的连接列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 VBA 将事件添加到运行时在 Excel 中创建的控件
如何从访问数据库中的左连接中选择excel表 - EXCEL VBA