【问题标题】:Deselect multiple fields from a query in VBA from MS-Access从 MS-Access 中的 VBA 查询中取消选择多个字段
【发布时间】:2019-06-13 17:32:06
【问题描述】:

我需要取消选择某些列中的某些特定值,例如 AREA RESP 列中的单词“Stamping”,并且我需要获取日期范围从今天到 30 的那些几天后。

我试过这个:

myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE]" _
            & " FROM INITIAL_PHASE" _
            & " WHERE [PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart'" _
            & "    OR [PLANNER NAME] = 'Marge' AND [AREA RESP] <> 'Stamping'" _
            & "   AND [START DATE] BETWEEN " & DateToday & " AND " & DateMonth
            & "   AND [PART NUMBER] NOT LIKE '%R'" _
            & " ORDER BY [START DATE]"

但它会返回 Stamping 以及它找到的所有日期

Sub GetFromMSAccess()
    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim WB As Excel.Workbook
    Dim SH As Excel.Worksheet
    Dim strConn As String
    Dim myQuery As String
    Dim CalcMode As Long
    Dim ViewMode As Long
    Dim DateToday As Date
    Dim DateMonth As Date

    DateToday = Format(Date, "m/d/yyyy")
    DateMonth = DateToday + 30 'One full month starting from today

    Application.StatusBar = "Extracting data from MS-Access"

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = False
    End With

    Sheets("DataSheet").Select

    Set WB = ThisWorkbook
    Set SH = WB.Sheets("DataSheet")

    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=G:\Share\Control\MD\Master_data.mdb;" & "Jet OLEDB:Database Password=321pass;"

    Set conn = New ADODB.Connection

    'Here it gets the information I need
        With SH
            Set Rng = .Cells(2, "A")
        End With

        Set rst = New ADODB.Recordset

        myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE] " & _
                    "FROM INITIAL_PHASE WHERE [PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart' OR [PLANNER NAME] = 'Marge' " & _
                    "AND [AREA RESP] <> 'Stamping' AND [START DATE] BETWEEN " & DateToday & " AND " & DateMonth & " " & _
                    "and [PART NUMBER] not LIKE '%R' order by [START DATE]"

        rst.Open myQuery, strConn, adOpenKeyset, adLockBatchOptimistic

        Rng.CopyFromRecordset rst
        rst.Close
        Set rst = Nothing

    Application.StatusBar = ""
End Sub

我想得到那些没有“Stamping”这个词的那些,以及我想要的范围之外的任何其他日期。

【问题讨论】:

  • 尝试替换:[PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart' OR [PLANNER NAME] = 'Marge' with PLANNER_NAME in ('Homer', 'Bart', '玛格')

标签: sql excel vba ms-access


【解决方案1】:

基本上你的ORAND 逻辑是相互混淆的。您需要在 OR 条件周围加上括号,以考虑一个单独的条件,包括其他 AND 条件。

此外,没有理由在 VBA 中连接 SQL。 Date(),Time(),Now() 在 MS Access SQL 中可用:

myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE]" _
            & " FROM INITIAL_PHASE" _
            & " WHERE ([PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart' OR [PLANNER NAME] = 'Marge')" _
            & "   AND [AREA RESP] <> 'Stamping'" _
            & "   AND [START DATE] BETWEEN Date() AND Date() + 30" _
            & "   AND [PART NUMBER] NOT LIKE '%R'" _
            & " ORDER BY [START DATE]"

更好,因为这是一个纯 SQL 查询,并且您正在使用可以索引的 WHEREORDER BY 子句,将您的查询保存为 MS Access 存储查询并避免 VBA 中的任何 SQL。存储查询比动态运行的字符串构建 SQL 更有效,因为 Access 引擎会为已保存的查询保存最佳执行计划。

Set rst = New ADODB.Recordset
rst.Open "mySavedQuery", strConn, adOpenKeyset, adLockBatchOptimistic

ThisWorkbook.Sheets("DataSheet").Cells(2, "A").CopyFromRecordset rst

rst.Close
Set rst = Nothing

【讨论】:

  • 非常感谢!有用!也感谢您提供的额外信息,我只是一名仍在学习 VBA 的实习生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多