【问题标题】:Change WHERE clause using VBA based on form control使用基于表单控件的 VBA 更改 WHERE 子句
【发布时间】:2019-04-26 18:45:09
【问题描述】:

所以,直到几个月前,我才刚接触并且只在 Excel 中使用 VBA,有很多命令我对如何使用/正确编写语法一无所知。

问题:我有一个已保存的查询 (qry_ExcelExport),目前只是:

SELECT '*' FROM tbl_Contacts

我想做的是使用 VBA 根据用户表单控件添加/更改 WHERE 子句。

类似:

If me.txt_Flag = "DP Delegate" then 'WHERE [DP-DEL] = True' (or = -1)
Elseif me.txt_Flag = "DP Sponsor" then 'WHERE [DP-SPON] = True' (or = -1)

等等。 (我知道上面的语法是 100% 不正确的,这正是我希望实现的)

借助互联网的力量,我设法找到了这段代码:

    ‘To change the Where clause in a saved query  
    Dim qdf as QueryDef
    Dim db as Database
    Set db = CurrentDB
    Set qdf = db.QueryDefs("YourQueryName")
    qdf.SQL = ReplaceWhereClause(qdf.SQL, strYourNewWhereClause)
    set qdf = Nothing
    set db = Nothing

    Public Function ReplaceWhereClause(strSQL As Variant, strNewWHERE As Variant)
    On Error GoTo Error_Handler

    ‘This subroutine accepts a valid SQL string and Where clause, and
    ‘returns the same SQL statement with the original Where clause (if any)
    ‘replaced by the passed in Where clause.
    ‘
    ‘INPUT:
    ‘ strSQL valid SQL string to change
    ‘OUTPUT:
    ‘ strNewWHERE New WHERE clause to insert into SQL statement
    ‘
        Dim strSELECT As String, strWhere As String
        Dim strOrderBy As String, strGROUPBY As String, strHAVING As String

        Call ParseSQL(strSQL, strSELECT, strWhere, strOrderBy, _
            strGROUPBY, strHAVING)

        ReplaceWhereClause = strSELECT &""& strNewWHERE &""_
            & strGROUPBY &""& strHAVING &""& strOrderBy

        Exit_Procedure:
            Exit Function

        Error_Handler:
            MsgBox (Err.Number & ": " & Err.Description)
            Resume Exit_Procedure

    End Function

第一行...第一行“更改已保存查询中的 Where 子句”表明这正是我所需要的。

但是,对于理解此代码、语法或更重要的是如何将其与表单控件联系起来,没有演练或循序渐进的初学者指南,而且我从未使用过或听过它以前的。

编辑:保存的查询 qry_ExcelExport 用于导出数据的函数

Call exportTable("qry_ExportExcel")

我在哪里打电话

Public Sub exportTable(tName As String)
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, tName, saveFileAs, True
End Sub

我需要修改 where 的能力,以便在导出时包含该子句,因为目前没有 WHERE 子句,因此导出只需获取所有数据。

【问题讨论】:

  • 如果您只需要使用 VBA 更改 WHERE 部分,我认为您不需要这么复杂的代码。将控件的值保存到字符串变量中,然后使用该新字符串执行 SQL 查询。像MySQL="SELECT * FROM tbl_Contacts WHERE " & myWherePart 这样的东西应该可以工作。另外Call ParseSQL是什么意思?
  • 该代码构建了一条 SQL 语句,但没有执行任何操作。你真正想要完成什么?如果您只想过滤报告或表单,请查看allenbrowne.com/ser-62.html
  • 我刚刚在 Microsoft 文档网站之一上发现了这一点(您知道那些有很多技术信息并不能真正帮助解释用法的网站)我希望它可以让我更改“WHERE field1 = true" 到 "WHERE field2 = True" 编辑:我需要更改已保存查询中的 WHERE 子句,因为我使用该查询调用 excel 导出

标签: ms-access vba


【解决方案1】:

修改已保存的查询以进行过滤通常既不需要也不实际。

您要做的是将过滤器应用于表单:

If me.txt_Flag = "DP Delegate" then 
    strFilter = "[DP-DEL] = True"
Elseif me.txt_Flag = "DP Sponsor" then 
    strFilter = "[DP-SPON] = True"
Else
    strFilter = ""
End If

Me.Filter = strFilter
Me.FilterOn = (strFilter <> "")

或者,如果您需要查询其他内容,您可以将过滤器应用于查询。

Set rs = DB.OpenRecordset("Select * From MySavedQuery Where " & strFilter)

编辑

如果查询用于导出,它实际上是修改查询有用的少数情况之一。

如果查询和你的问题一样简单,你可以简单地设置完整的 SQL:

strSql = "SELECT * FROM tbl_Contacts WHERE " & strFilter
db.QueryDefs("qry_ExportExcel").SQL = strSql
Call exportTable("qry_ExportExcel")

或者,如果基本查询更复杂,请使用两个查询:一个常量查询 (qry_ExportExcel_Base) 和一个动态查询 (qry_ExportExcel)

strSql = "SELECT * FROM qry_ExportExcel_Base WHERE " & strFilter

等等。如上

【讨论】:

  • 这看起来很有希望,但是保存的查询 (qry_Excel) 用于导出数据 - 如果我使用这种方法,它会将过滤器应用于导出,还是该模块会继续导出未更改的保存查询
  • 太棒了。我会回到绘图板上,写一些东西,然后用我的结果回复你,但只要看看你的解决方案,我就可以适应胜利的结果
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多