Mysql VBA在嵌套的conidtional语句中修改SQL语句

Mysql VBA在嵌套的conidtional语句中修改SQL语句,mysql,excel,vba,Mysql,Excel,Vba,我有两个项目列表,一个是客户ID,另一个是国家保险号,我被要求做一个聪明的子项目,检查数据库中的ID和NI,如果有结果,复制数据,如果没有结果,尝试ID,如果没有成功的ID,最后尝试NI 我用下面的代码尝试了这一点,首先是一个查询,根据当前单元格ID和NI查找信息,如果结果复制到单元格中并完成,如果没有结果,则执行相同的查询,但仅使用ID,如果结果复制,则尝试NI等 我不断收到记录集错误,不允许在打开时使用它,但我在每个情况下都添加了关闭,但仍然没有 这个想法可行吗?如果可行的话,我的代码中缺少

我有两个项目列表,一个是客户ID,另一个是国家保险号,我被要求做一个聪明的子项目,检查数据库中的ID和NI,如果有结果,复制数据,如果没有结果,尝试ID,如果没有成功的ID,最后尝试NI 我用下面的代码尝试了这一点,首先是一个查询,根据当前单元格ID和NI查找信息,如果结果复制到单元格中并完成,如果没有结果,则执行相同的查询,但仅使用ID,如果结果复制,则尝试NI等

我不断收到记录集错误,不允许在打开时使用它,但我在每个情况下都添加了关闭,但仍然没有

这个想法可行吗?如果可行的话,我的代码中缺少了什么,让它做我想做的事情

Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Set con = New ADODB.Connection
Set rec = New ADODB.Recordset

Dim sql As String
Dim client As String
Dim NI As String

Dim myRange As Range
Dim myCell As Range
Dim msgStr As Variant
Dim f As New Details_Bar

Set myRange = Range("A2:A502")

Dim x As Integer
x = 1
pos = 2

With con
    .Provider = "MSDASQL"
    .ConnectionString = "DSN=ukfast"
    .Open
End With

' Loop Start
For Each myCell In myRange

client = myCell.text
NI = Cells(myCell.Row, 2).text

    ' First Look
    sql = "SELECT id,firstname,lastname,national_insurance FROM crm_clients WHERE id = '" & client & "' AND national_insurance = '" & NI & "' GROUP BY id"

    rec.Open sql, con
    ' If Record Found Auto Enter Data in cells
    If Not (rec.BOF And rec.EOF) Then

    Cells(myCell.Row, 7).CopyFromRecordset rec

    rec.Close

    MSG1 = MsgBox("Data Was Automatically Found", vbOKOnly)

    'Else Begin to query the database again based on the Client ID

    Else

        sql = "SELECT id,firstname,lastname,national_insurance FROM crm_clients WHERE id = '" & client & "' GROUP BY id"

        rec.Open sql, con

        'If no result on ID then try NI Number

            If (rec.BOF And rec.EOF) Then

                sql = "SELECT id,firstname,lastname,national_insurance FROM crm_clients WHERE national_insurance = '" & NI & "' GROUP BY id"

                rec.Open sql, con

                Cells(myCell.Row, 100).CopyFromRecordset rec

                MSG1 = MsgBox("The Following Data Was Found About Client based on NI" & x & vbNewLine & "Client ID : " & Cells(myCell.Row, 100) & vbNewLine & "First Name : " & Cells(myCell.Row, 101) & vbNewLine & "Last Name : " & Cells(myCell.Row, 102) & vbNewLine & "National Insurance : " & Cells(myCell.Row, 103) & vbNewLine & "Is this correct?", vbYesNoCancel, "Data Check")

                Select Case MSG1

                Case vbYes
                    Cells(myCell.Row, "G").Value = Cells(myCell.Row, 100)
                    Cells(myCell.Row, "H").Value = Cells(myCell.Row, 101)
                    Cells(myCell.Row, "I").Value = Cells(myCell.Row, 102)
                    Cells(myCell.Row, "J").Value = Cells(myCell.Row, 103)
                Case vbNo
                    Details_Bar.Show
                Case vbCancel
                    Exit For
                    Exit Sub

                End Select
                rec.Close
            End If

        Cells(myCell.Row, 100).CopyFromRecordset rec

        MSG1 = MsgBox("The Following Data Was Found About Client based on ID" & x & vbNewLine & "Client ID : " & Cells(myCell.Row, 100) & vbNewLine & "First Name : " & Cells(myCell.Row, 101) & vbNewLine & "Last Name : " & Cells(myCell.Row, 102) & vbNewLine & "National Insurance : " & Cells(myCell.Row, 103) & vbNewLine & "Is this correct?", vbYesNoCancel, "Data Check")

            Select Case MSG1

            Case vbYes
                Cells(myCell.Row, "G").Value = Cells(myCell.Row, 100)
                Cells(myCell.Row, "H").Value = Cells(myCell.Row, 101)
                Cells(myCell.Row, "I").Value = Cells(myCell.Row, 102)
                Cells(myCell.Row, "J").Value = Cells(myCell.Row, 103)
            Case vbNo
                Details_Bar.Show
            Case vbCancel
                Exit For
                Exit Sub

            End Select
        rec.Close
End If


' Update Vars
pos = pos + 1
x = x + 1
'End Of Loop
Next myCell

GUI.CommandButton13.Enabled = False
GUI.CommandButton15.Enabled = False
Range("CA502:CZ502").Select
Selection.Delete
Range("A1").Select

找到了解决办法

像我以前的一些工作一样,我逐渐意识到记录需要总是在循环结束之前关闭,对于每个不同的条件语句,它必须在每个条件语句的开头关闭,并在新查询之后立即重新打开,然后在所有条件语句之外关闭声明

' First Look
    sql = "SELECT id,firstname,lastname,national_insurance FROM crm_clients WHERE id = '" & client & "' AND national_insurance = '" & NI & "' GROUP BY id"

    rec.Open sql, con
    ' If Record Found Auto Enter Data in cells
    If Not (rec.BOF And rec.EOF) Then

    Cells(myCell.Row, 7).CopyFromRecordset rec

    rec.Close '<--------------- Previous location

    MSG1 = MsgBox("Data Was Automatically Found", vbOKOnly)

    'Else Begin to query the database again based on the Client ID

    Else
        rec.close <-------------- New location

        sql = "SELECT id,firstname,lastname,national_insurance FROM crm_clients WHERE id = '" & client & "' GROUP BY id"

        rec.Open sql, con
第一眼 sql=“从crm_客户机中选择id、firstname、lastname、national_insurance,其中id=”&client&“和national_insurance=”&NI&“按id分组” 记录打开sql,con '如果找到记录,自动在单元格中输入数据 如果不是(rec.BOF和rec.EOF),则 单元格(myCell.Row,7)。CopyFromRecordset rec 记录关闭'