2014-09-10 48 views
0

花了很多小時試圖解決此問題後,我不知道如何繼續。我試圖將電子表格中的數據添加到Access表中,但我不希望表中有任何重複項,並且希望現有行的更新版本替換現有行。我覺得我已經用盡了與互聯網有關的問題。我使用了以下Stack Overflow鏈接(How to check for record by using ID, then if record exists update if not add new record)中的線程來幫助我解決很多問題,但是我對代碼的理解並沒有做到我所需要的。我沒有語法錯誤;但是我的SQL語句(通過確定電子表格數據是否與當前數據庫條目匹配來過濾記錄集)是在數據庫表中每個電子表格條目至少有5個完全相同的副本時返回空記錄集。我完全陷入了這個問題。以下是我的代碼:RecordSet過濾不檢測重複項或修改現有行

Public Sub ADOFromExcelToAccess() 
    'Variable definition 
    InputDate = Tracking.Sheets("P&Q Weekly Summary").Range("E3").Value 
    Call SetDataConnection 
    Set DataRecordset = New ADODB.Recordset 
    With DataRecordset 
     For DataRowCount = 2 To TrackingLastRow 
      Part_Number = Tracking.Sheets("Operator Data").Range("A" & DataRowCount).Value 
      Week_Day = Tracking.Sheets("Operator Data").Range("B" & DataRowCount).Value 
      Weekday_Name = WeekdayName(Weekday(Week_Day)) 
      Quantity = Tracking.Sheets("Operator Data").Range("C" & DataRowCount).Value 
      Machine = Tracking.Sheets("Operator Data").Range("G" & DataRowCount).Value 
      'Attempting to find duplicate entry 
      SQLCmd = "SELECT * FROM Raw_Data WHERE [Part] = '" & Part_Number & "' AND [Day] = " & Week_Day & " AND [Quantity] = " & Quantity & " AND [Machine] = '" & Machine & "';" 
      .Open Source:=SQLCmd, ActiveConnection:=DBConnection, CursorType:=adOpenDynamic, LockType:=adLockOptimistic, Options:=adCmdText 
      If (.BOF) Or (.EOF) Then 
       MsgBox .RecordCount 
       'No match found; add new record 
       .AddNew 
       .Fields("Part") = Part_Number 
       .Fields("Week") = InputDate 
       .Fields("Day") = Week_Day 
       .Fields("Weekday") = Weekday_Name 
       .Fields("Quantity") = Quantity 
       .Fields("Adjusted Quantity") = Tracking.Sheets("Operator Data").Range("D" & DataRowCount).Value 
       .Fields("Sample") = Tracking.Sheets("Operator Data").Range("E" & DataRowCount).Value 
       .Fields("Rejected") = Tracking.Sheets("Operator Data").Range("F" & DataRowCount).Value 
       .Fields("Machine") = Machine 
       .Fields("Cycle") = Tracking.Sheets("Operator Data").Range("H" & DataRowCount).Value 
       .Fields("Operator") = Tracking.Sheets("Operator Data").Range("I" & DataRowCount).Value 
       .Update 
       DataRowCount = DataRowCount + 1 
      'If current line already exists in database 
      Else 
       .Fields("Part") = Part_Number 
       .Fields("Week") = InputDate 
       .Fields("Day") = Week_Day 
       .Fields("Weekday") = Weekday_Name 
       .Fields("Quantity") = Quantity 
       .Fields("Adjusted Quantity") = Tracking.Sheets("Operator Data").Range("D" & DataRowCount).Value 
       .Fields("Sample") = Tracking.Sheets("Operator Data").Range("E" & DataRowCount).Value 
       .Fields("Rejected") = Tracking.Sheets("Operator Data").Range("F" & DataRowCount).Value 
       .Fields("Machine") = Machine 
       .Fields("Cycle") = Tracking.Sheets("Operator Data").Range("H" & DataRowCount).Value 
       .Fields("Operator") = Tracking.Sheets("Operator Data").Range("I" & DataRowCount).Value 
       .Update 
       DataRowCount = DataRowCount + 1 
      End If 
      .Close 
     Next DataRowCount 
    End With 
    Set DataRecordset = Nothing 
    DBConnection.Close 
    Set DBConnection = Nothing 
End Sub 

謝謝你的幫助。我非常感謝。

+0

我想嘗試從WHERE子句中刪除條件,然後一次添加一個,並查看在哪一點上,您將丟失所有記錄。那麼至少你可以仔細檢查該字段的數據。 – Rory 2014-09-10 12:22:55

+0

根據Rory的回答,除了我通常使用調試來獲取SQLCmd值,並將其放入SQL視圖中的新查詢中,然後切換回設計視圖。正如Rory所說,刪除每個標準直到找到問題。通常你會在設計視圖中發現問題。 – maxhugen 2014-09-10 13:05:37

+0

謝謝你的建議,它幫助了很多。除了使用WHERE [Day] =「&Week_Day&」之外,所有字段和組合都不會生成重複項。這是我的問題標準。在Access中,[日期]列處於常規日期格式。 Excel電子表格中的相應列也是日期格式。不知何故,這兩列不能識別我猜對方的相應格式。關於具體可能出錯的任何想法?謝謝。 – jlynn303 2014-09-10 14:59:12

回答

0

我的SQL語句中的問題是日期標準。顯然,每個MSDN的日期和時間標準都需要特殊的語法(http://msdn.microsoft.com/en-us/library/dd627355(v=office.12).aspx#Access2007BuildingSQLStatements_UsingDateTimeCriteria)。

WHERE [Day] = " & Week_Day & " 

下面的代碼反映了變化,特別是必要的#的:不要使用以下WHERE子句的

WHERE [Day] = #" & Week_Day & "# 

上面的鏈接說明了這一點相當清楚。如果不通過我的WHERE語句解析,我不會發現這一點。除了具有日期標準的那個之外,其他所有的都很好。問題解決了。