如果从 Excel vba 执行 vbs,则从 vbs 运行 Access ImportExport 失败 - 知道吗?

Posted

技术标签:

【中文标题】如果从 Excel vba 执行 vbs,则从 vbs 运行 Access ImportExport 失败 - 知道吗?【英文标题】:Running an Access ImportExport from vbs fails if vbs is executed from Excel vba - any idea? 【发布时间】:2018-01-22 21:22:02 【问题描述】:

我有一个 Excel 文件 (file1),其中的宏包含以下行:

Shell "wscript " & SFilename, vbNormalFocus

其中“SFilename”是 vbs 文件的名称。

在vbs文件中有一行:

appAccess.DoCmd.RunSavedImportExport ("ImportMonthlyData")

在这一行之上有几行,如:

appAccess.DoCmd.OpenQuery ("Insert Detail")

并且在 Excel 文件 2 上的 vbs 中进行了大量的 Excel 工作(与包含 wscript 宏的文件不同。

当我在文件资源管理器中双击 vbs 运行 vbs 文件时,一切正常。

当我通过宏从 Excel 文件 1 中运行宏时,vbs 在 ImportExport 行上失败。失败之处在于无法将要从中导入导出的 Excel 中的工作表归档,并且错误消息中显示的工作表名称末尾带有“$”。我不知道“$”是否是 Access 一直在做的事情,因为它在我使用文件资源管理器时有效,或者是否因为其他原因而添加了“$”。但是,我的猜测是这不是问题。

我认为问题的出现是因为 ImportExport 试图在 Excel 文件 1 而不是文件 2 中查找工作表。

你怎么看?如果这是问题所在,我该如何解决?

【问题讨论】:

如果(在Shell 之前)您将当前目录更改为包含vbs 文件的目录,它是否有效? 使用SFilename 的完整路径,而不仅仅是文件名。同样适用于代码中您依赖当前目录的其他任何地方可能不是... 我知道不清楚,因为我没有显示 SFilename 的定义,但它确实包含完整路径。在 .vbs 文件中,完整路径也使用 chdir 设置。我正在研究它正在查看 file1 而不是 file2 的理论(两者都在同一个文件夹中)。希望我明天能够继续这个项目。 【参考方案1】:

那么,您正在尝试将 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

【讨论】:

vbs 脚本比将这些数据从 Excel 文件 2 加载到 Access 中更多,因此尝试将所有内容都转换为 vba 需要大量工作。但我会牢记您对未来可能全部是 vba 的项目的建议。谢谢。【参考方案2】:

显然,Excel 正在 file2 中查找工作表。我不知道为什么,但作为一种变通方法,我只是将所需的工作表从 file1 复制到 file2,完成了必要的工作,然后删除了工作表。

【讨论】:

以上是关于如果从 Excel vba 执行 vbs,则从 vbs 运行 Access ImportExport 失败 - 知道吗?的主要内容,如果未能解决你的问题,请参考以下文章

excel等于某个值自动 隐藏/显示 整行 求教VBA代码

在VBScript文件中集成VBA

Excel VBA条件格式未执行

从 Excel 调用 Access VBA 函数

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

需要骨架代码从 PythonWin 调用 Excel VBA