【发布时间】:2015-10-07 23:01:20
【问题描述】:
我通过从这个(和其他一些)站点提取代码来创建这个过程,当我测试它时它就像一个魅力,但是当我部署它时,它崩溃了...... 我是新手它来到 VBA 并且无法找到合适的解决方案,所以我想我会寻求帮助。
用例
会计师每天从该领域的员工那里收到 100 多个电子表格(!),作为必需的报告形式。在我参与之前,3 位会计师会打开通过电子邮件收到的每个电子表格,并将某些单元格内容复制/粘贴到“主”电子表格中,该电子表格将在月底用于对账。不用说,这已经变得,比方说,效率低下。
我做了什么
我创建了一个 Access DB 并使用 TransferSpreadsheet 方法导入数据。我们只需要从每个电子表格中导入 11 个单元格,因此我修改了现场员工用来将所有这些数据拉到隐藏选项卡中的电子表格,其中所有数据都在一行中,所有行都在 Access 中的一个表中。正如我所提到的,当我和会计师测试该解决方案时,它运行良好。
出了什么问题
第一个问题是某个领域的人没有相同版本的 MS Office,有些人使用 OpenOffice 代替,我们在尝试导入一些电子表格时会出错。但是,由于我的简单解决方案仅为“完美路径”而构建,因此无法确定哪些电子表格失败,尤其是当文件夹中有 2000 多个电子表格时。
我想做的事
短期而言,在我有时间掌握 VBA 之前,我很想添加某种错误处理程序。或者即使在导入之后,“好”的电子表格会被发送到一个文件夹,而“坏”的电子表格会被发送到另一个文件夹。根据我的经验,大约 80% 的报告可以正常导入。遍历整个文件夹后,会计师可以检查“导入失败”文件夹并手动输入。我向您提出的问题,Access VBA 专家,这是否可行并且是一个合理的解决方案?如果是这样,你能指导我吗?
以下是我从互联网改编的当前代码。感谢您的所有帮助!
Function DoImport()
Dim strPathFile As String
Dim strFile As String
Dim strPath As String
Dim blnHasFieldNames As Boolean
Dim intWorksheets As Integer
Dim strWorksheets(1 To 1) As String
' 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 1) As String
' 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) = "Data"
strTables(1) = "my_table"
' Change this next line to True if the first row in EXCEL worksheet
' has field names
blnHasFieldNames = True
'update the path to where the Excel files to be imported are
strPath = "\mypathhere\"
' the number of worksheets to be imported
' from each EXCEL file
For intWorksheets = 1 To 1
strFile = Dir(strPath & "*.xlsm")
Do While Len(strFile) > 0
strPathFile = strPath & strFile
'MsgBox strPathFile
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTables(intWorksheets), strPathFile, blnHasFieldNames, strWorksheets(intWorksheets) & "$"
strFile = Dir()
Loop
Next intWorksheets
End Function
【问题讨论】:
-
如果您是 VBA 新手,我建议您使用 SSIS。这是一个更直观的系统,它擅长循环文件并将它们移动到文件夹中。 stackoverflow.com/questions/6190578/…。您可以使用它加载到 MS Access,但我建议您一路加载到 SQL Server。不幸的是,使用 excel 作为数据源,您总是会遇到数据质量问题。人们添加列、行并在其中输入废话。