【发布时间】:2021-12-17 20:19:12
【问题描述】:
我正在尝试使用多个工作表导入多个 Excel 文件。
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
strFileName = "C:\SomeFile\File.xlsx"
Set objWorkbook = objExcel.Workbooks.Open(strFileName)
Set colWorksheets = objWorkbook.Worksheets
For Each objWorksheet in colWorksheets
Set objRange = objWorksheet.UsedRange
strWorksheetName = objWorksheet.Name & "!" & objRange.Address(False, False)
objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
"Vulnerability", strFileName, True, strWorksheetName
Next
我的范围有问题。变量 strWorksheetName = "BE900!A1:L1634"。
我收到运行时错误“3011”。这 ”!”被“$”替换,因此找不到工作表。
有什么想法吗?
我的所有代码
公共函数 ImportFiles() 将 strFolder 调暗为字符串 暗淡 db 作为 DAO.Database 将 qdf 调暗为 DAO.QueryDef 暗淡 strFile 作为字符串 将 strTable 调暗为字符串 暗淡 strExtension 作为字符串 将 lngFileType 变暗 将 strSQL 暗淡为字符串 将 strFullFileName 调暗为字符串 变暗 varPieces 作为变体
With Application.FileDialog(3) ' msoFileDialogFolderPicker
.AllowMultiSelect = True
.Title = "Please select one or more files"
.Initialfilename = "*.xls*"
If .Show Then
strFullFileName = .SelectedItems(1)
Else
MsgBox "No folder specified!", vbCritical
Exit Function
End If
End With
strFile = Dir(strFolder)
Set db = CurrentDb()
strFile = Dir(strFolder & "*.xls*")
Do While Len(strFile) > 0
strTable = DetermineTable(strFile)
strSQL = "UPDATE [" & strTable & "] SET FileName=[pFileName]" & vbCrLf & _
"WHERE FileName Is Null OR FileName='';"
Set qdf = db.CreateQueryDef(vbNullString, strSQL)
varPieces = Split(strFile, ".")
strExtension = varPieces(UBound(varPieces))
Select Case strExtension
Case "xls"
lngFileType = acSpreadsheetTypeExcel9
Case "xlsx", "xlsm"
lngFileType = acSpreadsheetTypeExcel12Xml
Case "xlsb"
lngFileType = acSpreadsheetTypeExcel12
End Select
Set objexcel = CreateObject("Excel.Application")
Set objworkbook = objexcel.Workbooks.Open(strFullFileName)
Set colworksheets = objworkbook.Worksheets
For Each objWorksheet In colworksheets
Set objRange = objWorksheet.UsedRange
**strWorksheetName = objWorksheet.Name & "!" & objRange.Address(False, False)**
'strWorksheetName = objRange.Address(0, 0, external:=True)
DoCmd.TransferSpreadsheet _
TransferType:=acImport, _
SpreadsheetType:=lngFileType, _
tableName:=strTable, _
FileName:=strFile, _
HasFieldNames:=False, _
**Range:=CStr(strWorksheetName)**
Next
colworksheets.Close
colworksheets = Nothing
objworkbook.Close
objworkbook = Nothing
objexcel.Close
objexcel = Nothing
Set db = CurrentDb()
Set tdf = db.TableDefs(strTable)
'Add the field to the table.
If FieldExistsInTable(strTable, "FileName") = True Then
'Do nothing
Else
tdf.Fields.Append tdf.CreateField("FileName", dbText, 255)
'tdf.fields.append tdf.createField("SheetName", dbText, 255)
End If
'Supply the parameter value for the UPDATE and execute it ...
qdf.Parameters("pFileName").Value = strFile
qdf.Execute 'dbFailOnError
'Move to the next file
strFile = Dir
Loop
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
'rstTable.Close
Set rstTable = Nothing
End Function
【问题讨论】:
-
请尝试将
DoCmd.TransferSpreadsheet调用中的strWorksheetName替换为objRange.Address(0, 0, external:=True)。 -
我试过这个,同样的问题,!替换为 $
-
好的。现在,试试
"""" & strWorksheetName & """"... -
我在测试时没有任何区别。当我只测试导入每个文件的工作表的解码代码时,它就可以工作。但是当我用我的其余代码测试它时,问题仍然存在。我在原始问题中添加了所有代码。
-
既然您打算复制
UsedRange,请仅尝试objWorksheet.Name & "!"。理论上,它应该导入所有工作表内容。我无法理解您的安装中发生了什么...您有什么样的本地化?是标准英语吗?我还在某处读到某些系统需要“$”分隔符而不是“!”。您也可以尝试一下...我无法重现您的问题。仅出于测试原因,请尝试命名特定工作表的使用范围并使用该名称,而不是您尝试过的名称。如果可行,我们可以调整代码以动态创建命名范围。
标签: excel vba google-sheets