使用vba将sql数据导入到excel中

我试图从SQL表中拉入数据到Excel。 我已经使用数据源工具logging了一个macros。 然而,我拉的数据量一般崩溃excel。 有没有办法在我的vba脚本中添加一个variables来限制从sql表中提取的数据? 本质上添加一个where子句到sql中的select语句。

谢谢!

-Sean

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _ "OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=10.22.30.215;Use Procedure for Prepare=1;Aut" _ , _ "o Translate=True;Packet Size=4096;Workstation ID="FakeName";Use Encryption for Data=False;Tag with column collation when possible=Fa" _ , "lse;Initial Catalog=FakeCatelog"), Destination:=Range("$A$1")). _ QueryTable .CommandType = xlCmdTable .CommandText = Array( _ """FakeName""") .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .SourceConnectionFile = _ "C:\UFakeFilePathodc" .ListObject.DisplayName = "FakeName" .Refresh BackgroundQuery:=False End With End Sub` 

尝试连接到数据库,并进行查询,而不是试图将整个数据库拉到你的工作表。 这应该让你开始:
请确保添加“”Microsoft ActiveX数据对象6.0库“引用或运行此行一次:
ActiveWorkbook.VBProject.References.AddFromGuid "{B691E011-1797-432E-907A-4D8C69339129}", 6, 0

 Sub QueryDB() Dim dbName As ADODB.Connection Dim dbResults As ADODB.Recordset Set dbName = openDBConn("YOURDATABASE", "YourTable") Set dbResults = dbName.Execute("SELECT * FROM YOURDATABASE") While Not dbResults.EOF 'Do Something' dbResults.MoveNext Wend End Sub Function openDBConn(dataSource As String, table As String) As ADODB.Connection Dim newDBConn As ADODB.Connection Set newDBConn = New ADODB.Connection newDBConn.CommandTimeout = 60 Dim strConn As String strConn = "PROVIDER=SQLOLEDB;DATA SOURCE=" & dataSource & ";INITIAL CATALOG=" & table & ";INTEGRATED SECURITY=SSPI" newDBConn.Open strConn Set openDBConn = newDBConn End Function 

一旦您对代码感到满意,可能需要将其切换到late bindingEarly binding是很好的,因为在开发应用程序时,您可以获得完整的智能感知,但是随着时间的推移,应用程序升级到新版本,我发现后期绑定会稍微麻烦一点。

另外,因为我使用的连接string相当多,它可以很好地在模块的顶部decalred …保存挖掘这个硬编码在未来:

(ps这只是凯文的代码,有一些变化;不一定是改进,但更多的只是替代)

 Global Const strConn As String = "PROVIDER=SQLOLEDB;DATA SOURCE=" & dataSource & ";INITIAL CATALOG=" & table & ";INTEGRATED SECURITY=SSPI" Sub QueryDB() Dim dbName As Object Dim dbResults As Object Set dbName = CreateObject("ADODB.Connection") dbName = openDBConn("YOURDATABASE", "YourTable") Set dbResults = CreateObject("ADODB.Recordset") dbResults = dbName.Execute("SELECT * FROM YOURDATABASE") While Not dbResults.EOF 'Do Something' dbResults.MoveNext Wend End Sub Function openDBConn(dataSource As String, table As String) As ADODB.Connection Dim newDBConn As Object Set newDBConn = CreateObject("ADODB.Connection") newDBConn.CommandTimeout = 60 newDBConn.Open strConn Set openDBConn = newDBConn End Function