使用vba将sql数据导入excel
我正在尝试将SQL表中的数据拉入excel。我用数据源工具录制了一个宏。然而,我提取的数据量通常会使excel崩溃。有没有办法在我的vba脚本中添加一个变量来限制从sql表中提取的数据?本质上是将where子句添加到sql中的select语句中 谢谢 -肖恩使用vba将sql数据导入excel,sql,vba,excel,Sql,Vba,Excel,我正在尝试将SQL表中的数据拉入excel。我用数据源工具录制了一个宏。然而,我提取的数据量通常会使excel崩溃。有没有办法在我的vba脚本中添加一个变量来限制从sql表中提取的数据?本质上是将where子句添加到sql中的select语句中 谢谢 -肖恩 尝试连接到数据库并执行查询,而不是尝试将整个数据库拉入工作表。这应该让你开始: 请确保添加Microsoft ActiveX Data Objects 6.0库引用或运行此行一次: ActiveWorkbook.VBProject.Refe
尝试连接到数据库并执行查询,而不是尝试将整个数据库拉入工作表。这应该让你开始: 请确保添加Microsoft ActiveX Data Objects 6.0库引用或运行此行一次: ActiveWorkbook.VBProject.References.AddFromGuid{B691E011-1797-432E-907A-4D8C69339129},6,0
尝试连接到数据库并执行查询,而不是尝试将整个数据库拉入工作表。这应该让你开始: 请确保添加Microsoft ActiveX Data Objects 6.0库引用或运行此行一次: ActiveWorkbook.VBProject.References.AddFromGuid{B691E011-1797-432E-907A-4D8C69339129},6,0
一旦您对代码感到满意,就应该将其切换到后期绑定。早期绑定很好,因为在开发应用程序时您可以获得完全的智能感知,但随着时间的推移和应用程序升级到新版本,我发现后期绑定的麻烦会少一些 此外,由于我经常使用连接字符串,因此在模块顶部贴花也是一件好事……省去了以后对这段硬代码的挖掘: p、 这只是Kevin的代码,有一些改动;不一定是改进,但更多的只是替代方案
一旦您对代码感到满意,就应该将其切换到后期绑定。早期绑定很好,因为在开发应用程序时您可以获得完全的智能感知,但随着时间的推移和应用程序升级到新版本,我发现后期绑定的麻烦会少一些 此外,由于我经常使用连接字符串,因此在模块顶部贴花也是一件好事……省去了以后对这段硬代码的挖掘: p、 这只是Kevin的代码,有一些改动;不一定是改进,但更多的只是替代方案
谢谢@whytheq-参考资料说明added@KevinPope-添加引用的代码行;我从哪里可以找到更多的信息?@whytheq-老实说,我是从网上了解到的。它对于只传递一个.bas文件,而不必给出如何向不懂技术的用户添加引用的详细说明非常有用。它在Outlook中不起作用,但在其他Office应用程序中,您可以在信任中心的宏设置中启用它。谢谢@whytheq-参考说明added@KevinPope-添加引用的代码行;我从哪里可以找到更多的信息?@whytheq-老实说,我是从网上了解到的。它对于只传递一个.bas文件,而不必给出如何向不懂技术的用户添加引用的详细说明非常有用。它在Outlook中不起作用,但在其他Office应用程序中,您可以在信任中心的宏设置中启用它。
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`
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
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