我曾要求插入额外的数据字段(将excel数据导入访问的日期)以及原始导入Excel数据到访问表中。
以下是将Excel数据导入访问的代码。任何人都可以告诉我需要编写什么代码,以便在docmd之后将当前日期和原始excel数据一起插入到访问表中。 TransferSpreadsheet的。
Dim objXL As New Excel.Application
Dim wkb As Excel.Workbook
Dim wks As Object
'objXL.Visible = True
Set wkb = objXL.Workbooks.Open(strFileName)
For Each wks In wkb.Worksheets
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
"Plymouth - Nominal Detail", strFileName, True, wks.Name & "$"
Next
'Tidy up
wkb.Close
Set wkb = Nothing
objXL.Quit
Set objXL = Nothing
答案 0 :(得分:0)
考虑在Access中使用临时表:
在启动“For Each”循环之前,Access VBA代码看起来像这样......
' Use Now() function to create a semi-unique temporary table name in which to import
Dim strTempTableName as String
strTempTableName = "TempNominalDetail" & Format(Now(), "yyyymmdd_hhmmss")
' This is the SQL code to copy contents of temp table into target table
' and add current date-time value. Target table must already exist!
Dim strSQLCommand as String
strSQLCommand = "INSERT INTO [Plymouth - Nominal Detail] SELECT *, " & _
"NOW() as [DateTimeFieldName] FROM [" _
& strTempTableName & "];"
strSQLCommand
变量包含将临时表的内容追加到目标表中的命令(Plymouth - Nominal Detail)。一个关键要求是目标表的结构必须与源电子表格的结构相匹配 - 除了目标表必须在末尾有一个存储日期值的附加字段。在上面的代码中,我将其命名为DateTimeFieldName
,但您可以将其更改为您选择的某个字段名称,只要它位于Plymouth - Nominal Detail表字段列表的末尾。
在循环内部,用这些语句替换当前的DoCmd.TransferSpreadsheet ...(请注意,原始TransferSpreadsheet中的boolean参数已从True更改为 False ,因为您想要扔掉先前的表格内容,每次都重新开始。)
' Copy data into temp table, then transfer temp table into master table
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
strTempTableName, strFileName, False, wks.Name & "$"
DoCmd.RunSQL strSQLCommand
循环之后,作为清理的一部分,删除临时表。
DoCmd.DeleteObject(acTable, strTempTableName)
生成临时表,然后在假设您可能有两个或更多数据库的同时用户的情况下丢弃临时表。如果你确定永远不会出现这种情况,你可以将strTempTableName
定义为像"TempNominalDetail"
这样简单的东西(没有任何奇特的函数来生成唯一的名称)。
如果您正在考虑使用临时表的路线,则存在一些缺点。在回收已删除的记录或表所使用的空间时访问是不好的,因此临时表可能会导致数据库的大小迅速膨胀。偶尔的Database Compact操作将解决该问题,但这是一个值得注意的问题。此外,我建议用于生成“唯一”临时文件名的方法不能保证工作;如果两个不同的用户在完全相同的秒内启动此过程,则该函数会为它们分配相同的临时表名称,因此它们的工作将发生冲突。