Запуск Access ImportExport из VBS не удается, если VBS выполняется из Excel VBA - любая идея?
У меня есть файл Excel (file1) с макросом, который имеет эту строку:
Shell "wscript " & SFilename, vbNormalFocus
Где "SFilename" - это имя файла VBS.
В файле VBS у меня есть строка:
appAccess.DoCmd.RunSavedImportExport ("ImportMonthlyData")
Над этой строкой есть несколько строк, таких как:
appAccess.DoCmd.OpenQuery ("Insert Detail")
И в vbs on Excel file2 выполняется много работы в Excel (а не в том же файле, который содержит макрос wscript).
Когда я запускаю файл vbs, дважды щелкнув vbs в проводнике, все работает отлично.
Когда я запускаю макрос из файла Excel1 через макрос, происходит сбой vbs в строке ImportExport. Ошибка состоит в том, что он не может подать лист в Excel для импорта, и имя листа, отображаемое в сообщении об ошибке, имеет "$" в конце. Я не знаю, является ли "$" чем-то, что Access делает все время, потому что оно работает, когда я использую проводник, или если "$" добавляется по какой-то другой причине. Тем не менее, я думаю, это не проблема.
Я считаю, что проблема возникает из-за того, что ImportExport пытается найти лист в Excel file1 вместо file2.
Как вы думаете? И если это проблема, как мне ее исправить?
2 ответа
Итак, вы пытаетесь импортировать данные Excel в Access? Зачем теперь запускать все это с помощью VBA, которая гораздо менее загадочна и гораздо более интуитивна по сравнению с запущенными пакетными сценариями.
Ниже приведен общий код для импорта данных из определенных листов во все файлы EXCEL (имена листов одинаковы во всех файлах), которые находятся в одной папке. Все листы EXCEL-файлов с одинаковыми именами должны иметь данные в одинаковом формате и формате.
Dim strPathFile As String, strFile As String, strPath As String
Dim blnHasFieldNames As Boolean
Dim intWorksheets As Integer
' Replace 3 with the number of worksheets to be imported
' from each EXCEL file
Dim strWorksheets(1 To 3) As String
' Replace 3 with the number of worksheets to be imported
' from each EXCEL file (this code assumes that each worksheet
' with the same name is being imported into a separate table
' for that specific worksheet name)
Dim strTables(1 To 3) As String
' Replace generic worksheet names with the real worksheet names;
' add / delete code lines so that there is one code line for
' each worksheet that is to be imported from each workbook file
strWorksheets(1) = "GenericWorksheetName1"
strWorksheets(2) = "GenericWorksheetName2"
strWorksheets(3) = "GenericWorksheetName3"
' Replace generic table names with the real table names;
' add / delete code lines so that there is one code line for
' each worksheet that is to be imported from each workbook file
strTables(1) = "GenericTableName1"
strTables(2) = "GenericTableName2"
strTables(3) = "GenericTableName3"
' Change this next line to True if the first row in EXCEL worksheet
' has field names
blnHasFieldNames = False
' Replace C:\Documents\ with the real path to the folder that
' contains the EXCEL files
strPath = "C:\Documents\"
' Replace 3 with the number of worksheets to be imported
' from each EXCEL file
For intWorksheets = 1 To 3
strFile = Dir(strPath & "*.xls")
Do While Len(strFile) > 0
strPathFile = strPath & strFile
DoCmd.TransferSpreadsheet acImport, _
acSpreadsheetTypeExcel9, strTables(intWorksheets), _
strPathFile, blnHasFieldNames, _
strWorksheets(intWorksheets) & "$"
strFile = Dir()
Loop
Next intWorksheets
Видимо, Excel ищет в файле2 лист. Я не уверен, почему, но в качестве обходного пути я просто скопировал нужный лист из файла1 в файл2, выполнил необходимую работу и затем удалил лист.