首页 > 解决方案 > 将 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 的示例: 在此处输入图像描述

我会很高兴得到一些快速的帮助。提前致谢。

标签: excelxmlvba

解决方案


虽然您的问题不可重现,但请考虑一些可以帮助您诊断或解决问题的提示:

  1. Option Explicit在模块的最顶部(在Subor之外)使用Function以确保正确定义所有对象。相关地,将所有Dim对象放在子程序或函数的顶部以提高可读性。

  2. 结合适当的错误处理On Error GoTo...以捕获运行时异常并在取消设置有或没有错误的对象后适当地退出子例程。

  3. 如果您打开了许多工作簿,请避免使用可能会影响工作流程的ActiveWorkbook和。ActiveSheet而是使用实际分配的对象或ThisWorkbook对象。请参阅这篇规范的 Excel 帖子,如何避免在 Excel VBA 中使用 Select(第二个答案讨论Active*方法)。

  4. 尝试使用 MSXML 等外部库的早期绑定版本,它可以公开有用的错误属性并在 VBA 编辑器中启用 Intellisense。目前,您将后期绑定与CreateObject. 如果需要在许多用户之间进行后期绑定以实现可移植性,请忽略。

    Dim doc As MSXML2.DOMDocument
    
    Set doc = New MSXML2.DOMDocument
    
  5. 使用With块时,请遵循其所有属性。事实上,您可以避免使用ActiveSheet

    sTransactionType = .Name
    

推荐阅读