我在使用 Access 查询时遇到一些问题。 我想做的是执行一个查询,其中读取控件,由一个组合框和两个文本框组成,制定 SQL 查询,然后导出到 csv 文件。 第一个示例制定 SQL 字符串,并使用
DoCmd.RunSQL
语句,并且导致错误。
这是我迄今为止的代码:
Option Explicit
Private Sub Cmd_SaveToFile_Click()
'read combo box and two text boxes into variables
Dim Str_SQL As String
Dim str_Keyword As String
Dim Str_StartDate As String
Dim str_EndDate As String
Dim null_SetUp As Boolean
null_SetUp = False
'set focus to Cmb_Keyword so we can read it
Cmb_Keyword.SetFocus
If Cmb_Keyword.Text = "" Then
null_SetUp = True
Else
str_Keyword = Cmb_Keyword.Text
End If
'set focus to StartDate so we can read it
Txt_StartDate.SetFocus
If Txt_StartDate.Text = "" Then
null_SetUp = True
Else
Str_StartDate = Txt_StartDate
End If
'Set focus to EndDate so we can read it
Txt_EndDate.SetFocus
If Txt_EndDate.Text = "" Then
null_SetUp = True
Else
str_EndDate = Txt_EndDate
End If
If (null_SetUp = True) Then
MsgBox "Controls not filled out"
Else
Str_SQL = "SELECT Tbl_Journal.Keyword, Tbl_Journal.Date_Time, Tbl_Journal.Journal_Entry, Tbl_Journal.ID "
Str_SQL = Str_SQL & "FROM Tbl_Journal "
'Str_SQL = Str_SQL & "WHERE (((Tbl_Journal.Keyword) = 'Daily Journal')) "
'Str_SQL = Str_SQL & " And ((Tbl_Journal.Date_Time) > " & Str_StartDate & ") "
'Str_SQL = Str_SQL & " And ((Tbl_Journal.Date_Time) < " & str_EndDate & ")) "
MsgBox Str_SQL
DoCmd.SetWarnings False
DoCmd.RunSQL Str_SQL
'DoCmd.OpenQuery "Query1" This works but I want it to read the controls.
DoCmd.SetWarnings True
End If
End Sub
我收到的错误消息是
RunSQL 操作需要一个由 SSQL 语句组成的参数。
我尝试过不同的配置,但我很困惑。 我什至注释掉了一些行来缩短我的 SQL 语句,以解决发生的问题。
我的想法是阅读 Recordset 操作。 关于为什么会发生这种情况有什么想法吗?
根据评论,您的目标似乎是使用表单控件来指定一组可以导出为 CSV 文件的数据。
在这种情况下,我建议有一个更简单的方法来解决这个问题。 创建引用表单控件的查询并使用 DoCmd.TransferText 导出查询。
这是我的简单查询,Query1,它仅引用一个表单控件,一个组合框:
SELECT t1.ID, t1.some_text, t1.Date_Time
FROM tblOne AS t1
WHERE t1.some_text=Forms!Form1!cboTextKey;
然后在我的表单的Cmd_SaveToFile命令按钮的单击事件过程中,我可以检查组合是否包含合适的值,如果包含则导出查询数据:
Private Sub Cmd_SaveToFile_Click()
Const cstrQuery As String = "Query1"
Dim strFolder As String
Dim strFullPath As String
If Len(Nz(Me.cboTextKey.Value, vbNullString)) = 0 Then
' the combo value is either Null or an empty string
MsgBox "Control not filled out"
Else
' the output CSV file will be in the same folder as the current
' database; and the file name will be the query name plus ".csv";
strFolder = CurrentProject.Path & Chr(92)
strFullPath = strFolder & cstrQuery & ".csv"
DoCmd.TransferText acExportDelim, , cstrQuery, strFullPath, True
End If
End Sub
因此,您需要扩展该示例以处理 3 个表单控件,并且可能需要更改文件名和位置逻辑。 但我仍然认为没有必要在每次运行代码时使用
Recordset
或创建或修改 SQL 语句。 只需创建一个命名查询并将其导出即可。