excel - 将 Excelsheet 行转换为单独的 XML 文件时出现运行时错误
问题描述
我是 VBA 新手,在 excel 上使用 VBA 并编写一个宏来每行导出一个 xml 文件(参见打印屏幕中的示例)。
不幸的是,我收到以下错误
运行时错误“2147024891 (80070005)”:系统错误:-2147024891。
当我单击“调试”按钮时,它会跳转到代码行
doc.Save sFile
我使用以下代码读取 excel 表(Microsoft Excel for Mac 版本 16.49)并创建 xml 文件:
Sub CustomerOutToXML()
sTemplateXML = _
"<?xml version='1.0'?>" + vbNewLine + _
"<ENVELOPE>" + vbNewLine + _
"<TRANSACTION>" + vbNewLine + _
"<TYPE>" + vbNewLine + "</TYPE>" + vbNewLine + _
"</TRANSACTION>" + vbNewLine + _
"<CONTENT>" + vbNewLine + vbNewLine + _
"<DATE>" + vbNewLine + "</DATE>" + vbNewLine + _
"<SSCC>" + vbNewLine + "</SSCC>" + vbNewLine + _
"<ORDER>" + vbNewLine + "</ORDER>" + vbNewLine + _
"</CONTENT>" + vbNewLine + _
"</ENVELOPE>"
Set doc = CreateObject("MSXML2.DOMDocument")
doc.async = False
doc.validateOnParse = False
doc.resolveExternals = False
With ActiveWorkbook.Worksheets(1)
lLastRow = .UsedRange.Rows.Count
For lRow = 2 To 7
sFile = "/Users/xxx/Documents/" & .Cells(lRow, 1).Value & ".xml"
Dim sDATE As String
Dim sSSCC As String 'Not Long
Dim sORDER As String
sDATE = CStr(.Cells(lRow, 2).Value)
sSSCC = .Cells(lRow, 3).Text ' <<< Not .Value
sORDER = CStr(.Cells(lRow, 4).Value)
sTransactionType = ActiveSheet.Name
doc.LoadXML sTemplateXML
doc.getElementsByTagName("DATE")(0).appendChild doc.createTextNode(sDATE)
doc.getElementsByTagName("TYPE")(0).appendChild doc.createTextNode(sTransactionType)
doc.getElementsByTagName("SSCC")(0).appendChild doc.createTextNode(sSSCC)
doc.getElementsByTagName("ORDER")(0).appendChild doc.createTextNode(sORDER)
doc.Save sFile
Next
End With
End Sub
这是 excelsheet 的示例: 在此处输入图像描述
我会很高兴得到一些快速的帮助。提前致谢。
解决方案
虽然您的问题不可重现,但请考虑一些可以帮助您诊断或解决问题的提示:
Option Explicit
在模块的最顶部(在Sub
or之外)使用Function
以确保正确定义所有对象。相关地,将所有Dim
对象放在子程序或函数的顶部以提高可读性。结合适当的错误处理
On Error GoTo...
以捕获运行时异常并在取消设置有或没有错误的对象后适当地退出子例程。如果您打开了许多工作簿,请避免使用可能会影响工作流程的
ActiveWorkbook
和。ActiveSheet
而是使用实际分配的对象或ThisWorkbook
对象。请参阅这篇规范的 Excel 帖子,如何避免在 Excel VBA 中使用 Select(第二个答案讨论Active*
方法)。尝试使用 MSXML 等外部库的早期绑定版本,它可以公开有用的错误属性并在 VBA 编辑器中启用 Intellisense。目前,您将后期绑定与
CreateObject
. 如果需要在许多用户之间进行后期绑定以实现可移植性,请忽略。Dim doc As MSXML2.DOMDocument Set doc = New MSXML2.DOMDocument
使用
With
块时,请遵循其所有属性。事实上,您可以避免使用ActiveSheet
:sTransactionType = .Name
推荐阅读
- rxjs - 在Angular 7中同步发出两个Http请求
- python-3.x - 我希望能够通过 Atom 运行我的 Python,就像我在手机上使用 dcoder 所做的那样
- karate - 如何使用 Gradle 构建系统运行空手道和加特林
- ruby - Ruby - 将带有数组值的哈希转换为哈希数组
- php - 在php中填补空白多维数组
- amazon-web-services - DynamoDB 查询/扫描仅返回项目的子集
- python - 将行与特定字符串匹配以提取值 Python Regex
- swift - 如何删除所有对象并停止对领域数据库的所有写入?
- r - R中列值的条件排序/重新排序
- opengl - 带有 python 和 pygame 的 OpenGL 模型