当并非所有Excel文件都具有相同的工作表时,导入多个Excel文件和工作表以进行访问

当并非所有Excel文件都具有相同的工作表时,导入多个Excel文件和工作表以进行访问,excel,ms-access,macros,vba,Excel,Ms Access,Macros,Vba,我有一个包含75个Excel文件(.xlsx)的文件夹。Excel文件都应该有五个命名工作表(例如:SurveyData,两栖调查观测数据,BirdSurveyObservationData,PlantObservationData,以及WildSpeciesObservationData)。不幸的是,有时Excel文件只有工作表的一个子集(即,一个Excel文件可能包含所有五个工作表,而另一个Excel文件仅包含SurveyData和两栖TranssurveyObservationData工作

我有一个包含75个Excel文件(.xlsx)的文件夹。Excel文件都应该有五个命名工作表(例如:
SurveyData
两栖调查观测数据
BirdSurveyObservationData
PlantObservationData
,以及
WildSpeciesObservationData
)。不幸的是,有时Excel文件只有工作表的一个子集(即,一个Excel文件可能包含所有五个工作表,而另一个Excel文件仅包含
SurveyData
两栖TranssurveyObservationData
工作表)

我想将所有这些Excel文件导入Access,并将每个工作表中的信息放入单独的表中。例如,我希望将所有Excel文件中的
SurveyData
工作表中的所有数据放入名为
SurveyData
的访问表中。我发现了这个VBA代码(见下文),当所有工作表都存在于Excel文件中时,它似乎工作正常,但当一个工作表丢失时,脚本停止并不再继续导入任何其他文件。有没有办法只导入Excel文件中存在的工作表,否则跳过导入

函数ImportExcelFiles()
作为字符串的Dim strFile
DoCmd.SetWarnings错误
'为要导入的文件设置文件目录
strPath=“D:\SpeciesData\MoELoadform\2015SpeciesDetectionLoadforms-Copy\”
'告诉它从文件目录导入所有Excel文件
strFile=Dir(strPath&“*.xls*”)
'启动循环
当strFile“”时执行
'导入文件
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=“SurveyData”,文件名:=strPath&strFile,hasFieldName:=真,范围:=“SurveyData!A1:AD”
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=“两栖TransSurveyObservationData”,文件名:=strPath&strFile,HasFieldName:=真,范围:=“两栖TransSurveyObservationData!A1:AQ”
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=“BirdSurveyObservationData”,文件名:=strPath&strFile,HasFieldName:=真,范围:=“BirdSurveyObservationData!A1:AQ”
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=“PlantObservationData”,文件名:=strPath&strFile,hasFieldName:=真,范围:=“PlantObservationData!A1:BS”
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=“WildSpeciesObservationData”,文件名:=strPath&strFile,HasFieldNames:=True,范围:=“WildSpeciesObservationData!A1:AP”
'循环到目录中的下一个文件
strFile=Dir
环
MsgBox“所有数据均已导入”,vbOKOnly
端函数

我认为您可以按如下方式设置错误处理:

On Error Resume Next
然后,如果在任何一行中出现故障,VBA将直接跳到下一行

我不是100%确定这对你的情况会起作用,但是试试看


参考资料:

我认为您可以按如下方式设置错误处理:

On Error Resume Next
然后,如果在任何一行中出现故障,VBA将直接跳到下一行

我不是100%确定这对你的情况会起作用,但是试试看


另请参考:

考虑这种方法,即根据工作表的存在将单个文件保存到各种VBA集合中,然后在集合中进行迭代:

公共函数ImportExcelFiles()
将strpath设置为字符串,将strFile设置为字符串
将xlApp作为对象,xlWkb作为对象,xlWks作为对象
Dim allColl作为新系列
Dim surveyColl作为新系列,amphibColl作为新系列
Dim birdColl作为新系列,plantColl作为新系列
Dim speciesColl作为新系列
尺寸项目作为变型,coll作为变型
DoCmd.SetWarnings错误
'为要导入的文件设置文件目录
strpath=“D:\SpeciesData\MoELoadform\2015SpeciesDetectionLoadforms-Copy\”
'告诉它从文件目录导入所有Excel文件
strFile=Dir(strpath&“*.xls*”)
设置xlApp=CreateObject(“Excel.Application”)
'循环浏览文件
当strFile“”时执行
设置xlWkb=xlApp.Workbooks.Open(strpath和strFile)
'循环浏览工作表
对于xlWkb.工作表中的每个xlWks
选择Case xlWks.Name
“SurveyData”案
添加数组(strpath和strFile,“SurveyData”)
案例“两栖调查观测数据”
amphibColl.Add数组(strpath和strFile,“两栖调查观测数据”)
案例“鸟类调查观测数据”
添加数组(strpath和strFile,“BirdSurveyObservationData”)
案例“PlantObservationData”
plantColl.添加数组(strpath和strFile,“PlantObservationData”)
案例“野生物种观测数据”
speciesColl.Add数组(strpath和strFile,“WildSpeciesObservationData”)
结束选择
下一周
strFile=Dir
xlWkb.Close假
环
'循环遍历每个集合和导入
allColl.Add surveyColl:allColl.Add amphibColl
allColl.Add birdColl:allColl.Add plantColl
所有类别。添加类别类别类别
对于allColl中的每个coll
对于coll中的每个项目
'假定工作表和表名称相同
DoCmd.TransferSpreadsheet transfertype:=导入,表名:=项(1)_
文件名:=项(0),HasFieldNames:=真,范围:=项(1)&“!”
下一项
下一个科尔
设置xlWks=Nothing
设置xlWkb=Nothing
设置xlApp=Nothing
DoCmd.SetWarnings True
MsgBox“所有数据均已导入”,vbOKOnly
端函数

考虑这种方法,即根据工作表的存在将单个文件保存到各种VBA集合中,然后在集合中迭代:

公共函数ImportExcelFiles()
将strpath设置为字符串,将strFile设置为字符串
将xlApp作为对象,xlWkb作为对象,xlWks作为对象
Dim allColl作为新系列
Dim surveyColl作为新系列,amphibColl作为新系列
Dim birdColl作为新系列、工厂