gpt4 book ai didi

excel - 使用 DoCmd.TransferSpreadsheet 将 Excel 电子表格导入 Access 会创建重复项

转载 作者:行者123 更新时间:2023-12-03 02:43:34 28 4
gpt4 key购买 nike

我遇到了一个非常意外的问题,因为我有一个 Excel 电子表格,我正在使用 DoCmd.TransferSpreadsheet 将其导入到 Microsoft Access 数据库中。它似乎工作正常......但现在我已经进入项目的最后阶段并开始计算导入的数据......我注意到所有计算结果都是应有的两倍。罪魁祸首竟然来自一个非常令人惊讶的来源!

事实证明,当我使用 DoCmd.TransferSpreadsheet 导入时,它几乎复制了每条记录。在 4000 行电子表格中,我创建的 Access 表有 7998 行。在研究这个问题时,我遇到了多个关于如何在导入重复项后删除重复项的建议。对于我的情况来说,这根本不是一个解决方案,因为我的数据中有需要保留的重复行。

简而言之,我需要完全按照重复行和所有内容导入电子表格......但导入过程不会创建额外的重复项。看来这应该是一个非常基本的过程,我真的很想知道这个导入过程是如何创建重复行的?我的意思是它实际上应该只导入现有的数据!

现在是时间紧迫的关键时刻,我没有想到会出现这个令人惊讶的问题......因此,我们将非常感谢任何帮助。

这是有问题的代码行:

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, strTableName, strFileName, True

我认为这并不重要...但我正在使用“打开文件”对话框来获取电子表格。如果有人认为有帮助,我可以发布完整的过程。

为了进一步说明,这里是我的此过程的完整代码。请注意,我正在将表的名称从导入的文件名更改为我自己的枚举名称,因为我一次导入多个工作表。

Private Sub ImportFiles()
Dim strFileName As String
Dim strTableName As String
Dim fDialog As Office.FileDialog
Dim varFile As Variant
Dim lngProcessID As Long

CancelProcessing = False
' Set up the File Dialog. '
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

With fDialog
' Allow user to make multiple selections in dialog box '
.AllowMultiSelect = True

' Set the title of the dialog box. '
.Title = "Select files to import"
.Filters.Clear
.Filters.Add "All Files", "*.*", 1
.Filters.Add "Excel Files", "*.xlsl", 2
.Filters.Add "Excel Files", "*.xls", 3
.Filters.Add "Excel Files", "*.accdb", 4
.Filters.Add "Excel Files", "*.mdb", 5
' Show the dialog box. If the .Show method returns True, the '
' user picked at least one file. If the .Show method returns '
' False, the user clicked Cancel. '
If .Show = True Then
lngProcessID = OpenCustomLoader()
CountOfFiles = 0
' Validate That All Fields Have Been Mapped
For Each varFile In .SelectedItems
If CancelProcessing = False Then
CountOfFiles = CountOfFiles + 1
strTableName = "tblImport" & CountOfFiles
strFileName = .SelectedItems(CountOfFiles)
' Import Table Into Access
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, strTableName, strFileName, True
Call ValidateFields(strTableName)
If CancelProcessing = True Then DoCmd.DeleteObject acTable, strTableName
End If
Next
' Prime File Count
CountOfFiles = 0
'Loop through each file selected and add it to our list box. '
If CancelProcessing = False Then
For Each varFile In .SelectedItems
CountOfFiles = CountOfFiles + 1
strTableName = "tblImport" & CountOfFiles
strFileName = .SelectedItems(CountOfFiles)
' Import Table Into Access
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, strTableName, strFileName, True
DoCmd.TransferDatabase acExport, "ODBC Database", CurrentDb.TableDefs("dbo_tblStagingTable").Connect, acTable, strTableName, strTableName
Call ImportFileData(strTableName)
Next
Call CopyStagingToInterests
End If
Call CloseCustomLoader(lngProcessID)
Call CloseCustomLoader(lngProcessID)
End If
End With

结束子

最佳答案

注意:我在了解问题的真正原因之前就提交了此答案。跳到事后分析了解解释。我将保留这个答案的其余部分,因为使用嵌入在查询的 FROM 子句中的连接字符串来查询电子表格是一项有用的技术,应该可以帮助 future 的读者。

我不明白为什么 TransferSpreadsheet 会复制您的电子表格数据。它可能有助于向我们展示使用 TransferSpreadsheet 的 VBA 过程的更多上下文,但可能不是全部。

同时,考虑到您的时间很紧,请创建一个 Access 查询来获取工作表数据。

以下是在我的 Access 2010 系统上测试的示例:

SELECT s1.*
FROM [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\share\Access\temp.xls].[Sheet1$] AS s1

如果您创建类似的查询,并且它仅返回您想要的数据(没有额外的重复项),那么您可以将其转换为“追加查询”并将该数据添加到合适的现有表中。这也意味着 DoCmd.TransferSpreadsheet 正在返回正确的结果,您需要检查该代码是否运行多次。

找出嵌入连接字符串的快速方法是创建指向工作表的链接。然后您可以检查链接属性以获取查询所需的内容:

? CurrentDb.TableDefs("tblExcelData").Connect
Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\share\Access\temp.xls
? CurrentDb.TableDefs("tblExcelData").SourceTableName
Sheet1$

收集该信息后,您无需保留链接即可使查询正常工作。另一方面,如果您可以保留链接,查询可能会更简单。

事后剖析:

Anthony 两次针对同一组选项发现了名为 DoCmd.TransferSpreadsheet acImport 的代码。因此,每个电子表格的数据都无意中导入了两次。

关于excel - 使用 DoCmd.TransferSpreadsheet 将 Excel 电子表格导入 Access 会创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com