2014-10-20 37 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没有重复。