【问题标题】:import sql data into excel using vba使用vba将sql数据导入excel
【发布时间】:2012-11-16 22:54:26
【问题描述】:

我正在尝试将数据从 SQL 表中提取到 Excel 中。我已经使用数据源工具记录了一个宏。但是,我要提取的数据量通常会使 Excel 崩溃。有没有办法在我的 vba 脚本中添加一个变量来限制从 sql 表中提取的数据?本质上是在 sql 中的 select 语句中添加 where 子句。

谢谢!

-肖恩

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`

【问题讨论】:

    标签: sql vba excel


    【解决方案1】:

    尝试连接到数据库并进行查询,而不是尝试将整个数据库拉入工作表。这应该可以帮助您入门:
    确保添加“Microsoft ActiveX Data Objects 6.0 Library”参考或运行此行一次:
    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
    

    【讨论】:

    • 感谢@whytheq - 添加了关于参考的说明
    • @KevinPope - 添加引用的那行代码;我在哪里可以找到更多相关信息?
    • @whytheq - 老实说,我是在 this thread 上了解到的。它对于只传递.bas 文件很有用,而不必提供有关如何添加对非技术用户的引用的详细说明。它在 Outlook 中不起作用,但在其他 Office 应用中,您可以在信任中心的宏设置中启用它。
    【解决方案2】:

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

    此外,由于我经常使用连接字符串,因此最好将其贴在模块顶部...节省了在未来挖掘这个硬代码:

    (p.s. 这只是 Kevin 的代码,有一些更改;不一定是改进,而更多只是替代)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多