Ms access 使用自动生成的ID从excel向Access表追加值

Ms access 使用自动生成的ID从excel向Access表追加值,ms-access,vba,Ms Access,Vba,我有一个access数据库,其中的一些表每天都会更新一些值。我需要表格有一个ID字段,该字段在表格的其他值从excel导入时自动生成。我想通过保留一个按钮和编写一个VBA代码来实现所有操作的自动化。现在我有一个表单,它将值导入到表中,但它只导入我所拥有的精确值。我还需要一个额外的ID列,它必须在导入时自动生成。请帮帮我 Excel表格示例: ProductName | ProductValue ------------+------------------ ABC | 7

我有一个access数据库,其中的一些表每天都会更新一些值。我需要表格有一个ID字段,该字段在表格的其他值从excel导入时自动生成。我想通过保留一个按钮和编写一个VBA代码来实现所有操作的自动化。现在我有一个表单,它将值导入到表中,但它只导入我所拥有的精确值。我还需要一个额外的ID列,它必须在导入时自动生成。请帮帮我

Excel表格示例:

ProductName |   ProductValue
------------+------------------
ABC         |   76
SDF         |   87
数据库表

ID  |   ProductName |   Product Value
----+---------------+-----------------
1   |   ABC         |   76
2   |   SDF         |   87

Excel工作表使用新值更新每个日期,必须将其放入access数据库,ID自动递增。

在access中创建表时,对于要创建的新列的数据类型,您有不同的选项。其中一种数据类型称为“自动编号”。以下是一些信息:


将列ID设置为自动编号,并将其作为主键。现在,每次在表ID中插入关系时,都会自动增加一个新的数字。

下面的内容将从excel写入access,如前面提到的注释,在数据字段类型中使用autonumber

Sub LogRecord()

 Dim strSQL As Variant
 Dim accApp As Object
 Dim srcs As Variant
 Dim msg1 As Variant


'your access db
srcs = "C:\Documents and Settings\user\My Documents\Programs\Past Versions\Database V2.mdb"  ''' Live location '''

strSQL = "Select * from [tablename];"


Set accApp = GetObject(srcs, "access.Application")
Set Db = DAO.OpenDatabase(srcs)
Set rs = Db.OpenRecordset(strSQL)
    accApp.Visible = False

 For clref = 1 To Range("A500000").End(xlUp).Row
   Cells(clref, 1).Activate

   On Error Resume Next
       If Len(Cells(clref, 1)) >= 1 Then
           rs.AddNew

           rs![Field1] = Sheets("Gather").Cells(clref, 1).Value
           rs![Field2] = Sheets("Gather").Cells(clref, 2).Value
           rs![Field3] = Sheets("Gather").Cells(clref, 3).Value

           rs.Update
       End If

   Next clref

       If Not rs Is Nothing Then rs.Close

       Set rs = Nothing
       Set Db = Nothing
       accApp.DoCmd.RunSQL strSQL
       accApp.Application.Quit


   End Sub

我创建了一个名为ExcelData.xlsx的Excel电子表格,其中包含您提供的格式为表格的示例数据:

然后,我创建了一个表单,其中包含一个按钮,用于运行将导入数据以访问的VBA(按钮名称为cmdImport):

作为表单VBA的一部分,我编写了一个检查表是否存在的函数。表的名称作为函数的参数提供,如果找到,则函数返回TRUE;如果未找到,则返回FALSE:

公共函数表以布尔形式存在(名称为字符串)
'用于检查表是否存在的函数
'将表的名称作为参数传递
'如果找到,函数将返回TRUE;如果未找到,函数将返回FALSE
TableExists=DCount(“*”,“MSysObjects”,“Name=”&Name&“Type=1”)
端函数
..然后在cmdImport按钮的点击事件中,我有以下内容(您需要根据您的特定情况替换一些内容,例如Excel电子表格的文件路径和文件名):

Private Sub cmdImport\u Click()
'1-删除您的访问表“TBLPProducts”,以便我们可以重置自动编号字段
如果_
TableExists(“tblProducts”)=True_
然后
'删除旧的“tblProducts”:
DoCmd.DeleteObject可执行,“tblProducts”
其他的
'不执行任何操作,因为表不存在
如果结束
'2-创建和定义新的访问表“tblProducts”。。。这允许我们重置ID字段的自动编号值
Dim数据库作为DAO.Database
将tdf调暗为DAO.TableDef
Dim fldID作为DAO.Field,fldProductName作为DAO.Field,fldValue作为DAO.Field
Set db=CurrentDb
'创建表定义
设置tdf=db.CreateTableDef(“tblProducts”)
'创建字段定义
Set fldID=tdf.CreateField(“ID”,dbLong)
fldID.Attributes=dbAutoIncrField
fldID.Required=True
设置fldProductName=tdf.CreateField(“ProductName”,dbText)
fldProductName.AllowZeroLength=False
fldProductName.Required=True
设置fldValue=tdf.CreateField(“ProductValue”,dbText)
fldValue.AllowZeroLength=False
fldValue.Required=真
'将字段追加到表中
tdf.Fields.Append-fldID
tdf.Fields.Append fldProductName
tdf.Fields.Append fld值
'将表追加到数据库
db.TableDefs.Append tdf
“轻轻推一下
db.TableDefs.Refresh
Application.RefreshDatabaseWindow
“清理内存
设置fldID=无
设置fldProductName=Nothing
设置fldValue=Nothing
设置tdf=无
Set db=Nothing
'3-检查从Excel导入的旧数据(“ExcelData”)并将其删除
如果_
TableExists(“ExcelData”)=True_
然后
'删除旧的“Excel数据”:
DoCmd.DeleteObject可执行,“ExcelData”
其他的
'不执行任何操作,因为表不存在
如果结束
'4-从Excel导入新数据(“Excel数据”)
DoCmd.transfer电子表格导入_
9, _
“卓越数据”_
“C:/Your/File\u Path/和\u File\u Name.xlsx”_
-1
'5-将中“ExcelData”中的新数据附加到“TBLPProducts”
Dim sqlAppend作为字符串
sqlAppend=“插入tblProducts(ProductName,ProductValue)”_
&选择ExcelData.ProductName、ExcelData.ProductValue_
&“来自ExcelData;”
CurrentDb.executesqlappend
端接头
这将导致这些表格

..使用tblProducts表中应用ID的新数据:


请注意,此方法完全覆盖之前导入的所有内容,然后重新导入,并将ID字段再次分配给所有新数据。这意味着,例如,在上一次导入中ID为1的记录在下一次导入时可能会获得不同的ID号,具体取决于Excel电子表格中的记录顺序在新导入时是否会更改。

谢谢您的解决方案。我用迂回的方式做了这件事。我只是第一次手动导入它,从下一次添加它开始。