Sql 在Excel VBA中编写带字符串和日期的查询语句

Sql 在Excel VBA中编写带字符串和日期的查询语句,sql,excel,vba,adodb,Sql,Excel,Vba,Adodb,使用ADODB连接,我有一个excel数据库,在其中存储数据,并且我正在尝试在其中一个工作表(db_报告)中进行查询。Lastname和Birthday的值从用户表单输入到文本框中(分别为tb_Lastname和tb_bday) 我的问题是前两个查询语句可以工作(在本例中是注释的):一个查询获取字符串的Lastname,另一个查询日期。它们各自独立工作,但如果我合并它们,因为我需要在同一搜索中查询名称或日期,这会导致类型不匹配;运行时错误13。我一直在搜索任何地方,但我不知道如何才能使这项工作。

使用ADODB连接,我有一个excel数据库,在其中存储数据,并且我正在尝试在其中一个工作表(db_报告)中进行查询。Lastname和Birthday的值从用户表单输入到文本框中(分别为tb_Lastname和tb_bday)

我的问题是前两个查询语句可以工作(在本例中是注释的):一个查询获取字符串的Lastname,另一个查询日期。它们各自独立工作,但如果我合并它们,因为我需要在同一搜索中查询名称或日期,这会导致类型不匹配;运行时错误13。我一直在搜索任何地方,但我不知道如何才能使这项工作。我甚至尝试将日期转换为字符串,但还是失败了

Private Sub search记录\u Click()
Dim conn作为新的ADODB连接
将rst设置为新ADODB.Recordset
Dim db_路径作为变量
db_path=“E:\DATABASE.xlsm”
conn.Open“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“&db_path&“扩展属性=”“Excel 12.0宏;HDR=YES;”
像弦一样暗的qry
“qry=”从[db_Reports$]中选择[LastName],格式([Birth],'mmmm dd,yyyy'),其中[LastName]=”&tb_LastName&“”'
“qry=”从[db_Reports$]中选择[LastName],格式([Birth],'mmmm dd,yyyy'),其中[Birth]=”&CStr(CLng(CDate(tb_bday)))和“'”正在工作
qry=“从[db_Reports$]中选择[LastName]、格式([Birth]、'mmmm dd,yyyy'),其中[LastName]=”&tb_LastName&“'或[Birth]=”&CStr(CLng(CDate(tb_bday)))&“'”不工作-类型不匹配;运行时错误13'
rst.打开qry、conn、adOpenKeyset、ADLOCK
rst.关闭
关闭连接
设置rst=无
设置连接=无
端接头
基本上,如何在一行中同时查询字符串和日期


由于我是一个自学成才的新手,我为冗长的代码行、我使用的行话甚至问题的表述道歉。

似乎“[生日]=”&CStr(CLng(CDate(tbbday)))&'在文本框tb_bday中没有输入值时会产生错误。我无法解释原因。作为一种解决方法,我只创建了一个if-then语句。我仍然希望避免使用if-then,因为它可以在一行中编码

Private Sub SearchRecords_Click()

    Dim conn As New ADODB.Connection 
    Dim rst As New ADODB.Recordset 
    Dim db_path As Variant

    db_path = "E:\DATABASE.xlsm"

    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & db_path & ";Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"

    Dim qry As String

    if tb_bday.value = ""  then 
        qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where [LastName] = '" & tb_Lastname & "'"  
    else 
        qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where where [LastName] = '" & tb_Lastname & "' or [Birthday] = '" & CStr(CLng(CDate(tb_bday))) & "'"
    end if 

    rst.Open qry, conn, adOpenKeyset, adLockOptimistic

    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
End Sub

似乎“[生日]=”&CStr(CLng(CDate(tb_bday))&”在文本框tb_bday中没有输入值时会创建一个错误。我无法解释为什么。作为一种变通方法,我刚刚创建了一个if-then语句。我仍然希望避免使用if-then,如果它可以被编码成一行的话

Private Sub SearchRecords_Click()

    Dim conn As New ADODB.Connection 
    Dim rst As New ADODB.Recordset 
    Dim db_path As Variant

    db_path = "E:\DATABASE.xlsm"

    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & db_path & ";Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"

    Dim qry As String

    if tb_bday.value = ""  then 
        qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where [LastName] = '" & tb_Lastname & "'"  
    else 
        qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where where [LastName] = '" & tb_Lastname & "' or [Birthday] = '" & CStr(CLng(CDate(tb_bday))) & "'"
    end if 

    rst.Open qry, conn, adOpenKeyset, adLockOptimistic

    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
End Sub

在哪一行抛出该错误?在第15行,从[db_Reports$]中选择[LastName]、格式([Birth]、'mmmm dd、yyyy'),其中[LastName]='“&tb_LastName&'”或[Birth]='”&CStr(CLng(CDate(tb_bday))和“’”不工作-类型不匹配;运行时错误13'您能告诉我们如何设置
tb_Lastname
tb_birth
吗?我很感激您的问题,但我不知道“设置”是什么意思。我不设置它肯定是不对的,或者我可能对它做了一些事情,而不知道我已经“设置了”。我一直在做同样的事情,没有设置它们,但它以前已经起作用了。你能解释一下“准备好”是什么意思吗?再说一点,这些是我分配给文本框的名称。当然,我的意思是一定有一些代码看起来像
tb\u birth=some\u value
。我想的是,其中一项设置不正确,这可能会导致错误。不匹配错误表示“类型”错误。举个简单的例子,如果您的变量需要一个数字,但您提供了一个无法转换为数字的字符串,那么您将得到这种错误。顺便说一句,别担心你是新手。我们都在某一点上。在哪一行抛出该错误?在[db_Reports$]中的第15行qry=“选择[LastName],格式([Birth],'mmmm dd,yyyy'),其中[LastName]='“&tb_LastName&'”或[Birth]='”&CStr(CLng(CDate(tb_bday))&“’”不工作-类型不匹配;运行时错误13'您能告诉我们如何设置
tb_Lastname
tb_birth
吗?我很感激您的问题,但我不知道“设置”是什么意思。我不设置它肯定是不对的,或者我可能对它做了一些事情,而不知道我已经“设置了”。我一直在做同样的事情,没有设置它们,但它以前已经起作用了。你能解释一下“准备好”是什么意思吗?再说一点,这些是我分配给文本框的名称。当然,我的意思是一定有一些代码看起来像
tb\u birth=some\u value
。我想的是,其中一项设置不正确,这可能会导致错误。不匹配错误表示“类型”错误。举个简单的例子,如果您的变量需要一个数字,但您提供了一个无法转换为数字的字符串,那么您将得到这种错误。顺便说一句,别担心你是新手。我们都有过这样的经历。它出错是因为,
CDate(…)
而空字符串不是一个。如果希望用户在没有日期的情况下运行查询,则无法避免检查。注意:正确的检查是
如果tb_Name.Text=vbNullString,则
Null
(空字符串)不是一回事)。注意:如果用户输入的日期不可识别,您仍然会出错。您完全正确。我确实在代码中使用了“”而不是null,因为正如您警告我的那样,它出错了。当然,在我有机会编辑之前,你就发现了我的错误。但我很感激你告诉我,我无法逃避支票,因为我花了一个周末才发现这一点。另外,为了避免无法识别的日期,我在文本框中设置了验证。谢谢。它出错是因为,
CDate(…)
而空字符串不是一个。如果希望用户运行查询时没有日期,那么