2014-10-20 94 views
0

我有一些Excel VBA的經驗,但沒有一個使用Access。我在excel中創建了一個工具,它執行很多操作,並以帶有表格中數據的選項卡結束。多人將使用excel作爲數據輸入工具。我希望最終選項卡中的數據可以導出到Access,以便在輸入的人員之間彙總數據。爲確保不會造成混亂,我需要在提交到Access時檢查重複的ID。 ID變量稱爲ADP_Number,位於Excel和Access的第2列中。vba:導出Excel以訪問,刪除重複的ID

下面的代碼用於將數據提交給Access,但對ID沒有做任何處理。有人可以幫助我嗎?

Sub ExportToAccess_DAO() 

Dim oSelect As Range, i As Long, j As Integer ', sPath As String 
Dim ws As DAO.Workspace 
Sheets("Program_List").Activate 
Set oSelect = Application.InputBox("Range", , Range("A1").CurrentRegion.Address, , , , , 8) 
Dim oDAO As DAO.DBEngine 
Dim oDB As DAO.Database 
Dim oRS As DAO.Recordset 
ChDir ActiveWorkbook.Path 

Set oDAO = New DAO.DBEngine 
Set oDB = oDAO.OpenDatabase("I:\ALLSHARE\MAD_14.accdb", _ 
False, False, "MS Access;PWD=MAD_14") 
Set oRS = oDB.OpenRecordset("Program") ' change name? 

For i = 2 To oSelect.Rows.Count 'skips labels 
    oRS.AddNew 'addnew record to recordset 
    For j = 1 To oSelect.Columns.Count ' number of columns 'Field 0 is an auto# - like an ID, so we start at 1 
     oRS.Fields(j) = oSelect.Cells(i, j) 
    Next j 
    oRS.Update 
Next i 
oDB.Close 

End Sub 

回答

0

你可以做兩件事。

添加運行刪除重複部分的代碼。根據您的數據結構,最好先將所有數據複製到新選項卡並使用它導入。這可以確保所有鍵入的數據保持不變。

例如:

Sheets.Add After:=Sheets("DATA") 
Sheets("Program_List").Select 
Range(oSelect.Range).Select 
Selection.Copy 
Sheets("DATA").Select 
Range("A1").Select 
ActiveSheet.Paste 

對於刪除您有選擇複製,並確保您得到您的VBA恰到好處我會記錄刪除重複的步驟,並追加,在這個塊的結尾。

我會把這個放在你的代碼剛開始的ChDir行後面。

另一種選擇可能是對Access數據庫進行輕微更改。如果您無法控制Access環境,這並不總是可行的。如果你可以導入到臨時表中,那麼你可以編寫一個查詢,當你插入到你想要的數據表中時,它只會選擇不同的值。您的數據庫對象可以從Excel爲您運行查詢。

例如:

  • 在訪問你需要一個臨時表 - TEMP_TableName - 這是表的副本,你需要在數據
  • 更改您的Excel VBA使用這個新表。
  • 創建一個SELECT DISTINCT查詢。這假設所有重複值在所有列中具有相同的值。如果沒有,那麼你將需要創建一個更復雜的查詢,使用GROUP BYS,Min/Max,Fist/Last等來獲取唯一值。
  • 一旦查詢僅返回想要將其轉換爲追加查詢的值。選擇最終的目標表作爲源的追加。
  • 在excel中,您需要一行新的代碼。

    oDB.OpenQuery("QueryName") 
    

任何一項都將讓您的數據導入Access沒有重複。