【问题标题】:VBA ADODB- Select query using the excel sheet of the same workbook as DatabaseVBA ADODB-使用与数据库相同的工作簿的excel表选择查询
【发布时间】:2016-11-26 11:33:01
【问题描述】:

我是 VBA 的新手,所以请不要介意问题是低级别的。我正在尝试运行 SQL 查询,其中必须从同一工作簿的一张表中提取数据。

SQL = "Select ProductNumber from [sData$] where ProductSource = " & pSource & "

'pSource is a string that stores Product Source
'sdata is a sheet named as Data in the workbook

dataPath = ThisWorkbook.Fullname

'Not sure if this is the value I shall send as datapath in getData function

Set rst = getData(dataPath,SQL)
rst.Open

getData 函数定义如下

Public funtion getData(path as String, SQL as string) as ADODB.Recordset
Dim rs as ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open ("Provider= Microsoft.Jet.OLEDB.4.0;" & _
           "DataSource= " & path & ";"&_
            "Extended Properties=""Excel 8.0;HDR=Yes;FMT=Delimited;IMEX=1;""")
rs.ActiveConnection =cn
rs.Source= SQL
Set getData =rs
End Function

现在我从数据表中得到数字后,我需要找到对应的 关系表中的 ProductCompany。 9 代表 Amul,5 代表雀巢,以此类推。

关系:

我不知道该怎么做。这些数字按顺序对应于它们各自的产品公司。

【问题讨论】:

  • 将查询结果存储到数组中,遍历数组,然后根据数组中的数据运行JOIN语句。
  • 嗨,Doug Coats :) 我的查询没有得到结果。我不知道我的代码有什么问题。你能检查我的代码并告诉我有什么问题吗?下一步将结果集存储在数组中并循环遍历逻辑,你能帮忙看看代码吗?我不是很清楚。我明白了逻辑,但在 vba 中做,因为在工作表之间翻转让我感到困惑。
  • 工作表名称是Data还是sData?
  • 工作表名称是数据,在vba而不是Sheet1中,我使用vba属性将其更改为sData。
  • 我认为这是你的问题 :)

标签: vba excel ado


【解决方案1】:

看看下面的例子,它展示了如何创建到这个工作簿的 ADODB 连接,从 SQL 查询中获取 ADODB 记录集,从关系表中检索键值对,创建和填充字典,以及从记录集中输出值和字典中的对应值:

Option Explicit

Sub Test()

    Dim oCn As Object
    Dim oRs As Object
    Dim aKeys
    Dim aItems
    Dim i As Long
    Dim oDict As Object
    Dim dProdNum

    ' create ADODB connection to this workbook
    Set oCn = CreateObject("ADODB.Connection")
    oCn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "DataSource='" & ThisWorkbook.FullName & "';" & _
        "Extended Properties=""Excel 8.0;HDR=Yes;FMT=Delimited;IMEX=1;"";"
    ' get ADODB recordset from SQL query
    Set oRs = oCn.Execute("SELECT DISTINCT ProductNumber FROM [Data$] WHERE ProductSource = 'A1'")

    ' retrieve key - value pairs from relation sheet
    With ThisWorkbook.Sheets("Relation")
        aKeys = Split(.Range("B1"), ",")
        aItems = Split(.Range("B2"), ",")
    End With
    ' create and populate a dictionary
    Set oDict = CreateObject("Scripting.Dictionary")
    For i = 0 To UBound(aKeys)
        oDict(Trim(aKeys(i)) + 0) = Trim(aItems(i))
    Next

    ' output the values from the recordset and the corresponding values from the dictionary
    oRs.MoveFirst
    Do Until oRs.EOF
        dProdNum = oRs.Fields(0).Value
        Debug.Print dProdNum & " - " & oDict(dProdNum)
        oRs.MoveNext
    Loop

End Sub

我的输出如下:

4 - 大不列颠
5 - 雀巢
9 - 阿穆尔

注意,上面代码中的连接字符串显示为.xls 文件。如果.xlsm 你应该使用:

    oCn.Open _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source='" & ThisWorkbook.FullName & "';" & _
        "Extended Properties=""Excel 12.0 Macro;HDR=Yes;FMT=Delimited;IMEX=1;"";"

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多