【问题标题】:How to write an ampersand to an XML file from an Excel file using VBA?如何使用 VBA 将与符号从 Excel 文件写入 XML 文件?
【发布时间】:2012-12-17 18:13:35
【问题描述】:

首先,当谈到 VBA 时,我是一个完全的新手,但不幸的是我被丢弃了这段代码,我必须处理它......

应用程序所做的是复制 Excel xlsm 文件中的信息并将其粘贴到 XML 文件中以供进一步处理。

事情是,一切都非常顺利,直到我在一个 Excel 单元格中点击了一个 & 符号,即:

我有一个包含“R&D”的单元格,当我将它传递给 XML 文件时,我收到以下错误:

Run-time error '91':
Object variable or With block variable not set

请记住,我对 VBA 完全是垃圾。我尝试更改“R&&D”、“R&D”单元格中的内容,但没有骰子。

我相信单元格的值来自这行代码:

oCell.Offset(, 0).Value

但我想要一些关于如何逃脱&符号的帮助......

非常感谢,如果您需要更多信息,请告诉我。

【问题讨论】:

  • 你能发一些代码吗?特别是你得到错误的那一行(以及它之前的一些相关行)?此外,您可以查看本地窗口以了解某些有助于调试的变量的状态(在 VBE 中,转到查看->本地窗口)
  • 此处代码中断:Set oNamedNodeMap = oDOM.ChildNodes(0).Attributes oDOM 是 MSXML2.DOMDocument,oNamedNodeMap 是 MSXML2.IXMLDOMNamedNodeMap。

标签: xml excel vba xls xlsm


【解决方案1】:

我为 Access 编写了以下函数,但它应该适用于 Excel。

Function CleanupStr(strXmlValue) As String  
 'description: Replace forbidden char. &'"<> by their Predefined General Entities   
 'author:      Patrick Honorez - www.idevlop.com   
   Dim sValue As String  
   If IsNull(strXmlValue) Then  
     CleanupStr = ""  
   Else  
     sValue = CStr(strXmlValue)  
     sValue = Replace(sValue, "&", "&amp;") 'do ampersand first !  
     sValue = Replace(sValue, "'", "&apos;")  
     sValue = Replace(sValue, """", "&quot;")  
     sValue = Replace(sValue, "<", "&lt;")  
     sValue = Replace(sValue, ">", "&gt;")  
     CleanupStr = sValue  
   End If  
End Function 

【讨论】:

  • 谢谢,但由于某种原因,代码现在实际上可以工作,即使我从昨天起没有更改任何内容......不过还是谢谢你。这对于遇到相同问题的人来说可能会派上用场:D
【解决方案2】:

您正在寻找一种在字符串中创建 html 实体的方法,这涉及使用 &amp; 和任何特殊字符的代码。 '&' 本身就是一个特殊的字符。

可能有代码可以更改以执行此操作,但同时在您的代码中替换

&

&amp;

你应该解决那个特定的问题。

【讨论】:

  • 我做了,仍然得到同样的错误。我编辑了原始帖子以反映这一点,我的错。
  • 在这种情况下,这不是您在调用oCell.Offset(, 0).Value 中缺少第一个参数的事实吗?
  • 不这么认为。如果单元格中没有 & 符号,则 VBA 代码可以完美运行,因此可能不是问题。
  • 您能否展示更多关于您的问题所在的代码?
  • 这是我(认为)从 xls 文件中获取单元格值的地方:For Each oCell In Worksheets("Dependencies").ListObjects(1).DataBodyRange.Columns(0).Cells 'sXML = sXML &amp; " &lt;!--start of record '" &amp; oCell.Value &amp; "' --&gt;" sXML = sXML &amp; " &lt;ProcessDependencies name=""" &amp; oCell.Offset(, 0).Value &amp; """ uniqueExternalUid=""" &amp; oCell.Offset(, 1).Value &amp; """&gt;",此处代码中断:Set oNamedNodeMap = oDOM.ChildNodes(0).Attributes oDOM 是 MSXML2.DOMDocument,oNamedNodeMap 是 MSXML2.IXMLDOMNamedNodeMap
【解决方案3】:

我找到here这两个辅助函数:

Public Function HTMLToCharCodes(ByVal iString As String) As _
    String
    With New MSXML2.DOMDocument30
        .loadXML "<p>" & iString & "</p>"
        HTMLToCharCodes = _
            .selectSingleNode("p").nodeTypedValue
    End With
End Function

Public Function CharCodesToHTML(ByVal iString As String) As _
    String
Dim iXml As New MSXML2.DOMDocument30

    With iXml.createTextNode(iString)
        CharCodesToHTML = .xml
    End With
End Function

【讨论】:

  • 这些函数需要额外的引用,并且不会转换所有预定义的实体:例如,撇号 (') 不翻译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多