【发布时间】:2017-03-17 10:05:09
【问题描述】:
我正在尝试使用“SELECT (columns, , ,) INTO TEMPO FROM ...”将 Excel 工作表中的一些列(实际上包含 156 列 x 16k 行)拉入动态创建的表中,但是尽管代码执行时,表格不会出现在导航窗格中。有时,它会在“表已存在”的 .Execute (StrSQL) 行上给出错误。
我尝试检查该表是否存在,然后将其删除或在隐藏的 Sys 表中,但它没有显示。正如您可以看到注释代码,我也尝试了 RefreshDatabaseWindow 以及 CurrentDb.TableDefs.Refresh 但表格仍然没有出现。
我也尝试过 DoCmd.TransferSpreadsheet 来提取工作表数据,但它导致“记录太大”错误。此外,使用 DoCmd.TransferSpreadsheet,无法选择不相邻的列。此外,在其他一些 Excel 工作表提取中,列的顺序可能不同。
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "TEMPO", FileSelector(), True, "Soaps$"
谁能帮我改正代码?
Sub grabData()
DoCmd.SetWarnings False
Dim db As DAO.Database
Dim strSQL As String
Dim objCon As Object
Dim objRS As Object
Dim conStr As String
' On Error Resume Next
' strSQL = "DROP TABLE TEMPO;"
' DoCmd.RunSQL strSQL
' DoCmd.DeleteObject acTable, "TEMPO"
If IsTableExists("TEMPO") Then CurrentDb.Execute "DROP TABLE TEMPO", dbFailOnError
Set objCon = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")
strSQL = "SELECT "
strSQL = strSQL & "[GTIN],[PVID],[Version Date],[Languages on Pack],[Description],[Brand],[Features],"
strSQL = strSQL & "[Other Information],[Trademark Information],[Safety Warnings],[Country],"
strSQL = strSQL & "[Manufacturers Address],[Importer Address],[Return To],[Web Address],[Recycling],"
strSQL = strSQL & "[Recycling Other Text],[Dimensions: Captured Height (mm)],[Gross Weight (g)],"
strSQL = strSQL & "[Ingredients],[Nutrition],[Per100 Energy (kJ)],[Per100 Energy (kcal)],[Per100 Fat (g)],"
strSQL = strSQL & "[Per100 thereof Sat Fat (g)],[Per100 Carbohydrates (g)],[Per100 thereof Total Sugar (g)],"
strSQL = strSQL & "[Per100 Protein (g)],[Per100 Fibre (g)],[Per100 Sodium (g)],[Per100 Salt (g)],"
strSQL = strSQL & "[PerServing PortionType],[PerServing Energy (kJ)],[PerServing Energy (kcal)],"
strSQL = strSQL & "[PerServing Fat (g)],[PerServing thereof Sat Fat (g)],[PerServing Carbohydrates (g)],"
strSQL = strSQL & "[PerServing thereof Total Sugar (g)],[PerServing Protein (g)],[PerServing Fibre (g)],"
strSQL = strSQL & "[PerServing Salt (g)],[Net Content] "
strSQL = strSQL & " INTO TEMPO "
strSQL = strSQL & " FROM [Soaps$]"
strSQL = strSQL & " ORDER BY [GTIN],[PVID],[Version Date]"
' strSQL = strSQL & " FROM [Excel 12.0 Xml; HDR=YES;IMEX=1;Database=" & FileSelector() & "].[Drinks$]"
With objCon
.provider = "Microsoft.ACE.OLEDB.12.0;"
.ConnectionString = "Data Source=" & FileSelector() & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=0;"""
.Open
Set objRS = .Execute(strSQL)
End With
Application.RefreshDatabaseWindow
' CurrentDb.TableDefs.Refresh
Set objRS = Nothing
Set objCon = Nothing
DoCmd.SetWarnings True
End Sub
这里是检查表是否存在的函数。
Function IsTableExists(TblName As String) As Boolean
IsTableExists = False
If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & TblName & "' And Type In (1,4,6)")) Then IsTableExists = True
End Function
这里是选择文件和路径名的功能。
Function FileSelector() As String
Dim dlg As Object
Set dlg = Application.FileDialog(3) 'msoFileDialogFilePicker
With dlg
.Title = "Select the Excel data extract to import"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xlsx", 1
If .Show = -1 Then
FileSelector = .SelectedItems(1)
Else
End
End If
End With
Set dlg = Nothing
End Function
【问题讨论】:
-
据我所知,您没有在 MS Access 中创建新表。您的所有 SQL 都在 Excel 连接中运行。为什么从 Access 中查询 Excel 的非常重要的行被注释掉了?更有趣的是
INTOSQL 命令在工作簿上运行时没有出错。 -
啊哈,明白了!感谢@Parfait 为我指明了正确的方向。我现在在查询中添加了这个:strSQL = strSQL & " FROM [Excel 12.0; HDR=YES;IMEX=0;Database=" & FileSelector() & "].[Soaps$]" .唯一的问题是,如果我想包含所有 156 列,我会收到“记录太大”错误,如果我使用这个:" SELECT * INTO TEMPO FROM [Excel 12.0; HDR=YES;IMEX=0;Database= " & FileSelector() & "].[Soaps$]"。知道如何解决这个问题吗?