Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将Excel电子表格中的记录与数据库中的记录进行比较_Vba_Excel - Fatal编程技术网

Vba 将Excel电子表格中的记录与数据库中的记录进行比较

Vba 将Excel电子表格中的记录与数据库中的记录进行比较,vba,excel,Vba,Excel,我最初认为我的记录集有问题,但现在看来我已经做了一些修补,当我将null值传递到我的SQL查询字符串中,并将其附加到excute时,它无法识别SQL中的null字符串 乙二醇 rst.OPEN“从XXX中选择*其中Y=int,Z=NULL” 然而,这不起作用 rst.OPEN“从XXX中选择*,其中Y=int,Z=datetime” 工作正常吗 Sub CompareExcel() ' Macro1 Macro ' Macro recorded

我最初认为我的记录集有问题,但现在看来我已经做了一些修补,当我将null值传递到我的SQL查询字符串中,并将其附加到excute时,它无法识别SQL中的null字符串

乙二醇 rst.OPEN“从XXX中选择*其中Y=int,Z=NULL”

然而,这不起作用

rst.OPEN“从XXX中选择*,其中Y=int,Z=datetime”

工作正常吗

        Sub CompareExcel()

        ' Macro1 Macro
        ' Macro recorded Aking


        Dim TargetDB As String
        Dim TargetDBUser As String
        Dim TargetDBPassword As String

        ThisWorkbook.Sheets("INPUT").Select

        TargetDB = Cells(2, 14)
        TargetDBUser = Cells(3, 14)
        TargetDBPassword = Cells(4, 14)

        Dim cnn As ADODB.Connection
        Dim rst As ADODB.Recordset
        Set cnn = New ADODB.Connection
        Set rst = New ADODB.Recordset
        cnn.Open TargetDB, TargetDBUser, TargetDBPassword

            ThisWorkbook.Sheets("Summary").Select
            ActiveWorkbook.Sheets("Summary").Range("A7:A20000").Delete

            ThisWorkbook.Sheets("INPUT").Select
            ActiveWorkbook.Sheets("INPUT").Select
            RowCounter = Application.WorksheetFunction.CountA(Range("A2:A20"))

            CountAllExcellRecords = 0
            CountSuccessRecords = 0
            RowInSourceSheet = 1

                Do While RowInSourceSheet <= RowCounter

                    SourceSheet = ThisWorkbook.Sheets("INPUT").Range("B1").Offset(RowInSourceSheet, 0)
                    Worksheets(SourceSheet).Activate
                    RowCountSourceSheet = Application.WorksheetFunction.CountA(Range("A:A"))
                    CriteriaBuilder = "('"
                    ColumnCountSourceSheet = ThisWorkbook.Sheets(SourceSheet).UsedRange.Rows(1).Columns.Count
                    SourceSheetRow = 1

                        Do While SourceSheetRow < RowCountSourceSheet

                            QvAriable = " WHERE"
                            QtAble = ""
                            SourceSheetColumn = 0

                                Do While SourceSheetColumn < ColumnCountSourceSheet


                                    qvAriablen = ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)
                                    qvAriablem = ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(SourceSheetRow, SourceSheetColumn)

                                    Worksheets(SourceSheet).Activate
                                    Cells.Range("A1").Offset(SourceSheetRow, SourceSheetColumn).Activate

                                        Application.Volatile


                                            Select Case True
                                            Case IsEmpty(ActiveCell): CellType = "Blank"

                                                If qvAriablem = "" Then toSQL = " Null "
                                                qvAriablem = toSQL

                                                QvAriable = QvAriable & " " & qvAriablen & " = " & qvAriablem & ""
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)

                                            Case Application.IsText(ActiveCell): DataType = "Text"

                                                QvAriable = QvAriable & " " & qvAriablen & " = '" & qvAriablem & "'"
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)

                                            Case Application.IsLogical(ActiveCell): CellType = "Logical"

                                                QvAriable = QvAriable & " " & qvAriablen & " = " & qvAriablem & " "
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)

                                            Case Application.IsErr(ActiveCell): CellType = "Error"

                                                QvAriable = QvAriable & " " & qvAriablen & " = " & qvAriablem & " "
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)

                                            Case IsDate(ActiveCell): DataType = "Date"

                                                qvAriablem = Format(qvAriablem, "MM/DD/YYYY")
                                                QvAriable = QvAriable & " " & qvAriablen & " = '" & Format(qvAriablem, "MM/DD/YYYY") & "'"
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)


                                            Case InStr(1, ActiveCell.Text, ":") <> 0: CellType = "Time"

                                                qvAriablem = Format(qvAriablem, "MM/DD/YYYY")
                                                QvAriable = QvAriable & " " & qvAriablen & " = '" & Format(qvAriablem, "MM/DD/YYYY") & "'"
                                                QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)


                                            Case IsNumeric(ActiveCell): CellType = "Value"

                                                Worksheets("INPUT").Activate
                                                RowCountExceptions = Application.WorksheetFunction.CountA(Range("I:I"))
                                                Exceptions = 2
                                                eXceptionCount = 0

                                                    Do While Exceptions <= RowCountExceptions

                                                        If qvAriablen = Cells(Exceptions, 9) Then

                                                        eXceptionCount = eXceptionCount + 1
                                                        QvAriable = QvAriable & " " & qvAriablen & " = '" & qvAriablem & "'"
                                                        QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)

                                                        End If

                                                        Exceptions = Exceptions + 1
                                                     Loop

                                                        If eXceptionCount = 0 Then

                                                        QvAriable = QvAriable & " " & qvAriablen & " = " & qvAriablem & " "
                                                        QtAble = QtAble & " " & ThisWorkbook.Sheets(SourceSheet).Range("A1").Offset(0, SourceSheetColumn)


                                                        End If


                                                End Select


                                            If SourceSheetColumn < ColumnCountSourceSheet - 1 Then
                                            QvAriable = QvAriable & " AND "
                                            QtAble = QtAble & ", "
                                            End If

                                        SourceSheetColumn = SourceSheetColumn + 1

                                    Loop

                                rst.Open "SELECT * FROM " & SourceSheet & QvAriable, cnn
                                'rst.Open "SELECT * FROM UNIT_FUND WHERE CURRENCY_CODE = 'GBP' AND  UNIT_FUND_CODE = '150' AND FUND_NAME = 'MetLife Fidelity Cash Fund' AND  EFFECTIVE_DATE = '10/21/2009' AND CEASE_DATE =" & "NULL"
                                Sheets("Summary").Range("G2").CopyFromRecordset rst


                                CountAllExcellRecords = CountAllExcellRecords + 1

                                    If rst.RecordCount > 0 Then

                                        CountSuccessRecords = CountSuccessRecords + 1

                                    Else

                                        ThisWorkbook.Sheets("Summary").Select
                                        ActiveWorkbook.Sheets("Summary").Select
                                        a = "SELECT * FROM " & SourceSheet & QvAriable
                                        NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
                                        Cells(NextRow, 1) = a

                                    End If

                                rst.Close

                             SourceSheetRow = SourceSheetRow + 1

                        Loop

                    RowInSourceSheet = RowInSourceSheet + 1

                Loop

            ThisWorkbook.Sheets("Summary").Select

            Cells(3, 3) = CountAllExcellRecords
            Cells(4, 3) = CountSuccessRecords
            Cells(5, 3) = CountSuccessRecords - CountAllExcellRecords


        End Sub
子比较EXCEL()
'宏1宏
"宏观调控",
Dim TargetDB作为字符串
Dim TargetDBUser As字符串
Dim TargetDBPassword作为字符串
此工作簿。工作表(“输入”)。选择
TargetDB=单元(2,14)
TargetDBUser=单元格(3,14)
TargetDBPassword=单元格(4,14)
将cnn设置为ADODB.Connection
将rst设置为ADODB.Recordset
设置cnn=newadodb.Connection
Set rst=New ADODB.Recordset
打开TargetDB,TargetDBUser,TargetDBPassword
此工作簿。工作表(“摘要”)。选择
ActiveWorkbook.Sheets(“摘要”).范围(“A7:A20000”).删除
此工作簿。工作表(“输入”)。选择
ActiveWorkbook.Sheets(“输入”)。选择
RowCounter=Application.WorksheetFunction.CountA(范围(“A2:A20”))
CountAllExcellRecords=0
CountSuccessRecords=0
RowInSourceSheet=1

Do While RowInSourceSheet属性取决于光标位置和类型。看起来您所做的只是检查是否有任何记录,因此您可以使用:

If Not rst.EOF Then
而不是:

If rst.RecordCount <> 0 Then
如果rst.RecordCount为0,则

是的,对于那些变量名和没有明显声明类型的人来说,这有点棘手。你能给我们一些你的表名的例子吗,因为这在你的代码中看起来非常复杂,当然,我们看不到工作表的内容。嗨,伙计们,问题是我传入的值为Null,它不返回记录集,但是当我复制并粘贴查询到SQL时,它对我来说运行良好。我把null作为一个字符串,也许这就是问题所在??是的,那行不通。您不能使用
=
,您需要使用
其中FieldName为Null
作为标准。感谢Rory现在工作得很好