Написание оператора запроса со строкой и датой в Excel VBA - PullRequest
0 голосов
/ 12 февраля 2020

Используя соединение ADODB, у меня есть база данных Excel, где я храню данные, и я пытаюсь сделать запрос на одном из листов (db_Reports). Значения для Фамилии и Дня рождения вводятся в текстовые поля (tb_Lastname & tb_bday, соответственно) из пользовательской формы.

Моя проблема в том, что первые два оператора запроса работают (в данном случае это комментируется): один запрашивает Lastname, который получает строку, другой запрашивает дату. Каждый из них работает отдельно, но если я объединю их, так как мне нужно запросить имя или дату в одном и том же поиске, это даст мне Несоответствие типов; Ошибка выполнения 13. Я искал в любом месте, но я не могу понять, как я могу сделать эту работу. Я даже пытался преобразовать дату в строку, но все равно не получилось.

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

    'qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where [LastName] = '" & tb_Lastname & "'"  'Working
    'qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where [Birthday] = '" & CStr(CLng(CDate(tb_bday))) & "'"  'Working
    qry = "Select [LastName], Format([Birthday], 'mmmm dd, yyyy') from [db_Reports$] where [LastName] = '" & tb_Lastname & "' or [Birthday] = '" & CStr(CLng(CDate(tb_bday))) & "'"  'Not Working - Type Mismatch; Runtime error 13'

    rst.Open qry, conn, adOpenKeyset, adLockOptimistic

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

Как вы можете сделать запрос для строки и даты в одной строке?

Я прошу прощения за длинную строку кода, использованный мной lin go и даже за формулировку вопроса, поскольку я самоучка-новичок ie.

1 Ответ

2 голосов
/ 12 февраля 2020

Кажется, что '[Birthday] =' "& 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
...