【问题标题】:Query Large Excel File using VBA/SQL使用 VBA/SQL 查询大型 Excel 文件
【发布时间】:2016-12-28 08:29:43
【问题描述】:

我正在尝试在 VBA 中编写一些 SQL 代码来对相对较大的 excel 文件(500,000 行)执行查询,我想在其中找到这些给定子类别的总销售额:

我的数据如下所示:

Order ID|Sales|ProductSubCategory|Region
234324   3400  BookCases          South 
234345   2700  Tables             North

这是 SQL 查询的主要标准:

  • 书柜椅
  • 椅垫
  • 办公家具
  • 表格

我对使用 VBA,尤其是 VBA 中的 SQL 比较陌生,因此我们将不胜感激。感谢您的宝贵时间。

【问题讨论】:

  • 这里有很多关于使用 SQL 查询 Excel 数据的文章。看看那些,尝试一些代码,然后回复你可能有的具体问题。例如。 stackoverflow.com/questions/19755396/…
  • 很好奇,你为什么在 Excel 中存储如此大量的数据而不使用实际的数据库?如果使用 Windows,则 Jet/ACE SQL 引擎(MS Access 的默认数据库)已安装并可使用。
  • 我无权访问数据库,只是一个包含数据库数据的文件。认为这样的东西是我需要的:youtube.com/watch?v=1xIZUZaJB8s

标签: sql vba excel


【解决方案1】:

您可以使用Power query只将相关数据(使用过滤条件)从excel文件/ Sql数据库导入到新的excel文件中的数据模型,然后您可以轻松地对该数据模型进行分析。

【讨论】:

    【解决方案2】:
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                   & "Data Source='C:\Path\To\Workbook.xlsm';" _
                   & "Extended Properties=""Excel 8.0;HDR=YES;"";"
    
    strSQL = "SELECT * FROM [Sheet1$]" 
    

    您可以像对待访问文件一样将 excel 文件视为数据源,并以这种方式查询它:)

    【讨论】:

    • 谢谢!我之前在看一个视频,有人告诉我查询返回一个记录集,或者查询的结果。我如何将其存储在新工作表中?
    • 这取决于您如何调用记录集。但通常你可以使用类似 ThisWorkbook.Sheets("SheetXYZ").Range("a1").CopyFromRecordSet
    • @petergensler 在这里查看更多信息functionx.com/vbaccess/Lesson22.htm
    • 只是一个更新...发现如果您可以正确设置与工作簿的连接,那么您实际上根本不需要触摸 VBA,并且可以使用 microsoft 查询向导写sql,和访问查询接口差不多。
    • 是的,它绝对不是最漂亮的 SQL,但我认为它可以完成工作。令人惊讶的是,网络上几乎没有任何关于使用它来查询大型电子表格的内容,因为它绝对是老派,但比一次使用 5 个过滤器要好。
    【解决方案3】:

    RunQuery(SourceFile 作为字符串,Targetrange 作为范围,strsql 作为字符串,ColName 作为布尔值)

    Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset
    Dim dbConnectionString As String
    Dim TargetCell As Range, i As Integer
    
    dbConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; DBQ=" & SourceFile & ";"
    
    Set dbConnection = New ADODB.Connection
    'On Error GoTo InvalidInput
    dbConnection.Open dbConnectionString
    
    Set rs = dbConnection.Execute(strsql)
    If ColName Then
        Set TargetCell = Targetrange.Cells(1, 1)
        For i = 0 To rs.Fields.count - 1
            TargetCell.Offset(0, i).Formula = rs.Fields(i).Name
            Debug.Print rs.Fields(i).Name
        Next i
        Set TargetCell = Targetrange.Offset(1, 0)
    Else
        Set TargetCell = Targetrange.Offset(0, 0)
    End If
    TargetCell.CopyFromRecordset rs
    rs.Close
    dbConnection.Close
    Set TargetCell = Nothing
    Set rs = Nothing
    Set dbConnection = Nothing
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多