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