【问题标题】:Import mulitple excelfiles with multiple sheets - issue with range使用多个工作表导入多个 excel 文件 - 范围问题
【发布时间】: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


【解决方案1】:

宏没有错误,在我的电脑上运行良好。

您可以尝试重启电脑。

我这没有帮助,您可以定义strWorksheetName2,将strWorksheetName 中的$ 替换为!。然后给它访问对象。

【讨论】:

  • 变量strWorksheetName 没问题,它有“!”,所以我不能替换那个级别的$。
  • 你可以在下面的行中用 Cstr(strWorksheetName) 更改 strWorksheetName 并试一试。 objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ "Vulnerability", strFileName, True, Cstr(strWorksheetName)
【解决方案2】:

在一个新的数据库中从头开始重建代码,现在它可以工作了。 感谢您的帮助。

【讨论】:

  • 关于“重建”是什么意思的信息不多。需要更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 2018-07-14
  • 2021-01-27
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多