Sql 确定电子表格条目是否与数据库列条目匹配

Sql 确定电子表格条目是否与数据库列条目匹配,sql,excel,ms-access-2007,vba,Sql,Excel,Ms Access 2007,Vba,我的项目的一个方面涉及将操作员输入的零件号与数据库中某列中的预定零件号列表进行比较。现在,我的程序告诉我,电子表格50+中输入的每个零件号与数据库中的任何零件号都不匹配,我已经验证了这一点是不正确的。我已经检查了电子表格零件号和数据库零件号是否都是字符串数据类型。我已经仔细检查了我的循环逻辑是否良好,在我看来它应该可以工作。据我所知,数据库单元格或电子表格单元格中都没有隐藏字符。我完全被弄糊涂了,为什么我的程序没有检测到电子表格和数据库之间的任何匹配。下面是包含用于检查零件号是否匹配的代码的子项

我的项目的一个方面涉及将操作员输入的零件号与数据库中某列中的预定零件号列表进行比较。现在,我的程序告诉我,电子表格50+中输入的每个零件号与数据库中的任何零件号都不匹配,我已经验证了这一点是不正确的。我已经检查了电子表格零件号和数据库零件号是否都是字符串数据类型。我已经仔细检查了我的循环逻辑是否良好,在我看来它应该可以工作。据我所知,数据库单元格或电子表格单元格中都没有隐藏字符。我完全被弄糊涂了,为什么我的程序没有检测到电子表格和数据库之间的任何匹配。下面是包含用于检查零件号是否匹配的代码的子项:

Sub CheckPN()
  'Connect to the E2 database
   Call SetPNConnection
  'Open a recordset
   Set PNRecordset = New ADODB.Recordset
   PNRecordset.Open "EstimRpt", PNConnection, adOpenKeyset, adLockOptimistic, adCmdTable
   PNSQLCmd = "SELECT DISTINCT [PartNo] FROM EstimRpt;"
  'Loop through data, comparing part numbers to E2 database part number records
   TotalBadPNCount = 0
   With PNRecordset
      For DataRowCount = 2 To TrackingLastRow
         PNCount = 0
         Part_Number = Tracking.Sheets("Operator Data").Range("A" & DataRowCount).Value
        'MsgBox "The datatype for " & Part_Number & " is " & VarType(Part_Number) & "."
         Do Until .EOF
           'MsgBox "The datatype for " & .Fields("PartNo").Value & " is " & VarType(.Fields("PartNo").Value) & "."
            If Part_Number = .Fields("PartNo").Value Then
           'If .Fields("PartNo").Value = Part_Number Then
               MsgBox Part_Number & " is a match."
               PNCount = PNCount + 1
            End If
            .MoveNext
         Loop
         If PNCount < 1 Then
            MsgBox "The P/N " & Part_Number & " entered in cell A" & DataRowCount & " is incorrect.  Please correctly enter the P/N and re-run the program."
            TotalBadPNCount = TotalBadPNCount + 1
         End If
      Next DataRowCount
      If TotalBadPNCount >= 1 Then
         Exit Sub
      End If
   End With
   PNRecordset.Close
   Set PNRecordset = Nothing
   PNConnection.Close
   Set PNConnection = Nothing
End Sub
另一方面,如果零件号不匹配,我希望整个程序停止执行,而不仅仅是直接子项。目前,只有该子项在零件号不匹配时退出

感谢您在这两个问题上提供的帮助


Jordan

我建议不要使用循环将用户提交的数据集中的记录与永久表进行比较。相反,将用户提交的数据集加载到数据库中的临时表中,并使用SQL比较这两个表

您可以尝试以下方法:

'Load spreadsheet into temp table
<your code here>

'open recordset in order to compare PartNos
Dim db As Database
Set db = CurrentDb
Dim rs As Recordset

sSQL = "select count(*) as [count] from temp " _ 
        & " where temp.PartNo not in (select distinct EstimRpt.PartNo from EstimRpt)"
Set rs = db.OpenRecordset(sSQL)

ctRecords = rs![Count]

'if records are found in temp table that do not exist 
'in the perm table, then end execution of everything.
if ctRecords > 0 then
    End
else
    'run the rest of your code
    <your code here>
end if

'Drop temp table
<your code here>

我终于发现了我的问题。数据库和电子表格之间的比较记录现在可以工作了。我必须对我的代码进行以下更改:

而不是:

Do Until .EOF
我需要:

Do Until .EOF = True
我还需要在For循环声明之后添加以下内容:

.MoveFirst

现在,我的代码循环正确。

是否有特殊原因导致无法将用户提交的Excel数据集中的记录与永久访问表进行比较?相对而言,这条路线的替代方案似乎相当麻烦。如果Access和Excel记录都是字符串类型,为什么那些应该匹配的记录不匹配?这两个记录之间有什么隐藏的区别吗?谢谢你的帮助。如果没有访问你的文件,我不知道为什么你当前的比较不起作用。如果Excel/Access版本之间存在任何兼容性问题,则在运行比较之前将Excel数据拉入Access将突出显示这些问题。导入Access后,请检查Excel列的数据类型。一旦数据进入Access,就可以运行基于集合的比较,而无需使用,这大大提高了处理大型数据集时的性能。我从中读取的数据库是一个必须的数据库,我不会以任何方式更改/更改/修改它是一个用于车间管理程序的大型数据库。因此,我只想从中读取数据,而不是其他任何内容。因此,排除了这一点,我再次确保这两个值都是字符串,并且根据我的excel程序中的消息框,我的excel程序正在读取/解释数据库值,就像它们在excel中编写的一样。这似乎表明,我的数据是好的,但我的循环是有缺陷的,但它看起来不错。蚂蚁的建议?好的-祝你好运!我不能提出任何建议,因为我看不到您的Excel&Access文件中“幕后”到底发生了什么。如果不想在现有Access DB中创建任何新对象,可以创建一个单独的DB,从“主”DB中提取数据,并在其中进行比较。