Excel VBA将XML文件读入字符串用完了字符

时间:2019-01-25 19:11:46

标签: excel xml vba

我当前正在使用以下代码从 XML文件读取为 string

'Target Path
sFileName = ThisWorkbook.Path & "\Assembly\Alarms.xml"
iFileNum = FreeFile

'Open File
Open sFileName For Input As iFileNum

'Read Text
Do Until EOF(iFileNum)
    Line Input #iFileNum, sBuf
    sTemp = sTemp & sBuf & vbCrLf
Loop

'Close File
Close iFileNum

执行此操作时遇到的问题是字符串的大小限制。如果我打印出sTemp并全部选中,我将得到32,767个字符。

我将其推入字符串中,以便可以在特定的行项目上执行查找/替换。是否有另一种(更好的)方式可以读取我的XML并查找/替换,而不会遇到此问题?任何建议,将不胜感激。

<?xml version="1.0" encoding="UTF-8"?>
<alarms version="1.0" product="{E44CB020-C21D-11D3-8A3F-0010A4EF3494}" id="Alarms">
    <alarm history-size="10000" display-name="[ALARM]" hold-time="250" max-update-rate="1.00" embedded-server-update-rate="1.00" silence-tag="" remote-silence-exp="" remote-ack-all-exp="" status-reset-tag="" remote-status-reset-exp="" close-display-tag="" remote-close-display-exp="" use-alarm-identifier="false">
        <triggers>
            <trigger id="T1" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[0]}" exp="{[##PLCNAME]PVArrayAlarm[0],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label1" handshake-tag=""/>
            <trigger id="T2" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[1]}" exp="{[##PLCNAME]PVArrayAlarm[1],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label2" handshake-tag=""/>
            <trigger id="T3" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[2]}" exp="{[##PLCNAME]PVArrayAlarm[2],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label3" handshake-tag=""/>
            <trigger id="T4" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[3]}" exp="{[##PLCNAME]PVArrayAlarm[3],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label4" handshake-tag=""/>
            <trigger id="T5" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[4]}" exp="{[##PLCNAME]PVArrayAlarm[4],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label5" handshake-tag=""/>
            <trigger id="T6" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[5]}" exp="{[##PLCNAME]PVArrayAlarm[5],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label6" handshake-tag=""/>
            <trigger id="T7" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[6]}" exp="{[##PLCNAME]PVArrayAlarm[6],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label7" handshake-tag=""/>
            <trigger id="T8" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[7]}" exp="{[##PLCNAME]PVArrayAlarm[7],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label8" handshake-tag=""/>
            <trigger id="T9" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[8]}" exp="{[##PLCNAME]PVArrayAlarm[8],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label9" handshake-tag=""/>
            <trigger id="T10" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[9]}" exp="{[##PLCNAME]PVArrayAlarm[9],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label10" handshake-tag=""/>
            <trigger id="T11" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[10]}" exp="{[##PLCNAME]PVArrayAlarm[10],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label11" handshake-tag=""/>
            <trigger id="T12" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[11]}" exp="{[##PLCNAME]PVArrayAlarm[11],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label12" handshake-tag=""/>
            <trigger id="T13" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[12]}" exp="{[##PLCNAME]PVArrayAlarm[12],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label13" handshake-tag=""/>
            <trigger id="T14" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[13]}" exp="{[##PLCNAME]PVArrayAlarm[13],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label14" handshake-tag=""/>
            <trigger id="T15" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[14]}" exp="{[##PLCNAME]PVArrayAlarm[14],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label15" handshake-tag=""/>
            <trigger id="T16" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[15]}" exp="{[##PLCNAME]PVArrayAlarm[15],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label16" handshake-tag=""/>
            <trigger id="T17" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[16]}" exp="{[##PLCNAME]PVArrayAlarm[16],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label17" handshake-tag=""/>
            <trigger id="T18" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[17]}" exp="{[##PLCNAME]PVArrayAlarm[17],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label18" handshake-tag=""/>
            <trigger id="T19" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[18]}" exp="{[##PLCNAME]PVArrayAlarm[18],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label19" handshake-tag=""/>
            <trigger id="T20" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[19]}" exp="{[##PLCNAME]PVArrayAlarm[19],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label20" handshake-tag=""/>
            <trigger id="T21" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[20]}" exp="{[##PLCNAME]PVArrayAlarm[20],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label21" handshake-tag=""/>
            <trigger id="T22" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[21]}" exp="{[##PLCNAME]PVArrayAlarm[21],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label22" handshake-tag=""/>
            <trigger id="T23" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[22]}" exp="{[##PLCNAME]PVArrayAlarm[22],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label23" handshake-tag=""/>
            <trigger id="T24" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[23]}" exp="{[##PLCNAME]PVArrayAlarm[23],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label24" handshake-tag=""/>
            <trigger id="T25" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[24]}" exp="{[##PLCNAME]PVArrayAlarm[24],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label25" handshake-tag=""/>
            <trigger id="T26" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[25]}" exp="{[##PLCNAME]PVArrayAlarm[25],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label26" handshake-tag=""/>
            <trigger id="T27" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[26]}" exp="{[##PLCNAME]PVArrayAlarm[26],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label27" handshake-tag=""/>
            <trigger id="T28" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[27]}" exp="{[##PLCNAME]PVArrayAlarm[27],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label28" handshake-tag=""/>
            <trigger id="T29" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[28]}" exp="{[##PLCNAME]PVArrayAlarm[28],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label29" handshake-tag=""/>
            <trigger id="T30" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[29]}" exp="{[##PLCNAME]PVArrayAlarm[29],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label30" handshake-tag=""/>
        </triggers>
        <messages>
            <message id="M1" trigger-value="1" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].0"/>
            <message id="M2" trigger-value="2" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].1"/>
            <message id="M3" trigger-value="3" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].2"/>
            <message id="M4" trigger-value="4" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].3"/>
            <message id="M5" trigger-value="5" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].4"/>
            <message id="M6" trigger-value="6" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].5"/>
            <message id="M7" trigger-value="7" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].6"/>
            <message id="M8" trigger-value="8" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].7"/>
            <message id="M9" trigger-value="9" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].8"/>
            <message id="M10" trigger-value="10" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].9"/>
            <message id="M11" trigger-value="11" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].10"/>
            <message id="M12" trigger-value="12" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="##SPARE_ALARM[0].11"/>

以上是我的XML的示例。我非常想更改## Tags。 ## SPARE_ALARM数组最多可以增加30个DINTS。每个警报都是我要为其更新说明的单个警报。

2 个答案:

答案 0 :(得分:6)

从根本上来说,不应将XML视为文本文件,而应属于符合行业标准(特别是W3C standards)的特殊标记文档。因此,通过使用称为XSLT的专用声明性语言来完成通过查找和替换节点值来操纵XML文档的工作,该语言的代码布置在特殊的XML文件中。

XSLT可以通过专用的standalone software自身运行,也可以使用特殊的模块或库(与其他流行的特殊用途相同)通过应用程序层(Java,PHP,Python,C#,VB,R)进行接口声明性语言,称为SQL)。 VBA拥有一个带有MSXML的库。

考虑以下过程,将 text 属性更改为所需的MOTOR ## FAULT输出,该输出将作为参数传递到VBA:

XSLT 1.0 (另存为.xsl文件,这是要在VBA中加载的特殊.xml文件)

注意:XSLT将从VBA接收两个参数

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- APP LAYER PARAM PLACEHOLDERS -->
  <xsl:param name="prefix"/>
  <xsl:param name="suffix"/>

  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="message[contains(@text,'##SPARE_ALARM[0]')]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="text">
          <xsl:value-of select="concat($prefix, count(preceding-sibling::*)+1, $suffix)"/>
      </xsl:attribute>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Online demo

VBA (不使用For循环或If逻辑并将参数传递给XSLT)

Sub XSLTransform()
On Error GoTo ErrHandle
    ' SELECT Microsoft XML, v## AS VBA REFERENCE
    Dim xmldoc As New MSXML2.DOMDocument, newDoc As New MSXML2.DOMDocument
    Dim xslDoc As New MSXML2.FreeThreadedDOMDocument
    Dim tmpl As Object, xslproc As Object

    ' LOAD XML AND XSL FILES
    xmldoc.async = False
    xmldoc.Load "C:\Path\To\Input.xml"

    xslDoc.async = False
    xslDoc.Load "C:\Path\To\XSLT\Script.xsl"

    ' INITIALIZE TEMPLATE AND PROCESSOR
    Set tmpl = CreateObject("MSXML2.XSLTemplate")
    tmpl.stylesheet = xslDoc

    Set xslproc = tmpl.createProcessor()

    ' TRANSFORM XML WITH PARAMS
    xslproc.input = xmldoc
    xslproc.addParameter "prefix", "MOTOR "
    xslproc.addParameter "suffix", " FAULT"
    xslproc.transform

    ' SAVE OUTPUT TO FILE
    newDoc.LoadXML xslproc.output
    newDoc.Save "C:\Path\To\Output.xml"

    MsgBox "Successfully transformed XML!", vbInformation
    Exit Sub

ExitHandle:
    Set xmldoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
    Set tmpl = Nothing: Set xslproc = Nothing
    Exit Sub

ErrHandle:
    MsgBox Err.Number & " - " & Err.Description, vbCritical
    Err.Raise xslDoc.parseError.ErrorCode, , xslDoc.parseError.reason
    Resume ExitHandle

End Sub

输出

<?xml version="1.0" encoding="utf-16"?>
<alarms version="1.0" product="{E44CB020-C21D-11D3-8A3F-0010A4EF3494}" id="Alarms">
  <alarm history-size="10000" display-name="[ALARM]" hold-time="250" max-update-rate="1.00" embedded-server-update-rate="1.00" silence-tag="" remote-silence-exp="" remote-ack-all-exp="" status-reset-tag="" remote-status-reset-exp="" close-display-tag="" remote-close-display-exp="" use-alarm-identifier="false">
    <triggers>
      <trigger id="T1" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[0]}" exp="{[##PLCNAME]PVArrayAlarm[0],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label1" handshake-tag="" />
      <trigger id="T2" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[1]}" exp="{[##PLCNAME]PVArrayAlarm[1],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label2" handshake-tag="" />
      <trigger id="T3" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[2]}" exp="{[##PLCNAME]PVArrayAlarm[2],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label3" handshake-tag="" />
      <trigger id="T4" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[3]}" exp="{[##PLCNAME]PVArrayAlarm[3],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label4" handshake-tag="" />
      <trigger id="T5" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[4]}" exp="{[##PLCNAME]PVArrayAlarm[4],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label5" handshake-tag="" />
      <trigger id="T6" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[5]}" exp="{[##PLCNAME]PVArrayAlarm[5],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label6" handshake-tag="" />
      <trigger id="T7" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[6]}" exp="{[##PLCNAME]PVArrayAlarm[6],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label7" handshake-tag="" />
      <trigger id="T8" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[7]}" exp="{[##PLCNAME]PVArrayAlarm[7],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label8" handshake-tag="" />
      <trigger id="T9" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[8]}" exp="{[##PLCNAME]PVArrayAlarm[8],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label9" handshake-tag="" />
      <trigger id="T10" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[9]}" exp="{[##PLCNAME]PVArrayAlarm[9],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label10" handshake-tag="" />
      <trigger id="T11" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[10]}" exp="{[##PLCNAME]PVArrayAlarm[10],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label11" handshake-tag="" />
      <trigger id="T12" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[11]}" exp="{[##PLCNAME]PVArrayAlarm[11],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label12" handshake-tag="" />
      <trigger id="T13" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[12]}" exp="{[##PLCNAME]PVArrayAlarm[12],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label13" handshake-tag="" />
      <trigger id="T14" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[13]}" exp="{[##PLCNAME]PVArrayAlarm[13],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label14" handshake-tag="" />
      <trigger id="T15" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[14]}" exp="{[##PLCNAME]PVArrayAlarm[14],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label15" handshake-tag="" />
      <trigger id="T16" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[15]}" exp="{[##PLCNAME]PVArrayAlarm[15],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label16" handshake-tag="" />
      <trigger id="T17" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[16]}" exp="{[##PLCNAME]PVArrayAlarm[16],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label17" handshake-tag="" />
      <trigger id="T18" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[17]}" exp="{[##PLCNAME]PVArrayAlarm[17],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label18" handshake-tag="" />
      <trigger id="T19" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[18]}" exp="{[##PLCNAME]PVArrayAlarm[18],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label19" handshake-tag="" />
      <trigger id="T20" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[19]}" exp="{[##PLCNAME]PVArrayAlarm[19],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label20" handshake-tag="" />
      <trigger id="T21" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[20]}" exp="{[##PLCNAME]PVArrayAlarm[20],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label21" handshake-tag="" />
      <trigger id="T22" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[21]}" exp="{[##PLCNAME]PVArrayAlarm[21],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label22" handshake-tag="" />
      <trigger id="T23" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[22]}" exp="{[##PLCNAME]PVArrayAlarm[22],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label23" handshake-tag="" />
      <trigger id="T24" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[23]}" exp="{[##PLCNAME]PVArrayAlarm[23],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label24" handshake-tag="" />
      <trigger id="T25" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[24]}" exp="{[##PLCNAME]PVArrayAlarm[24],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label25" handshake-tag="" />
      <trigger id="T26" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[25]}" exp="{[##PLCNAME]PVArrayAlarm[25],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label26" handshake-tag="" />
      <trigger id="T27" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[26]}" exp="{[##PLCNAME]PVArrayAlarm[26],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label27" handshake-tag="" />
      <trigger id="T28" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[27]}" exp="{[##PLCNAME]PVArrayAlarm[27],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label28" handshake-tag="" />
      <trigger id="T29" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[28]}" exp="{[##PLCNAME]PVArrayAlarm[28],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label29" handshake-tag="" />
      <trigger id="T30" type="bit" ack-all-value="999" use-ack-all="true" ack-tag="{[##PLCNAME]PVAlmAckCmd[29]}" exp="{[##PLCNAME]PVArrayAlarm[29],L1}" message-tag="" message-handshake-exp="" message-notification-tag="" remote-ack-exp="" remote-ack-handshake-tag="" label="Label30" handshake-tag="" />
    </triggers>
    <messages>
      <message id="M1" trigger-value="1" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 1 FAULT" />
      <message id="M2" trigger-value="2" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 2 FAULT" />
      <message id="M3" trigger-value="3" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 3 FAULT" />
      <message id="M4" trigger-value="4" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 4 FAULT" />
      <message id="M5" trigger-value="5" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 5 FAULT" />
      <message id="M6" trigger-value="6" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 6 FAULT" />
      <message id="M7" trigger-value="7" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 7 FAULT" />
      <message id="M8" trigger-value="8" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 8 FAULT" />
      <message id="M9" trigger-value="9" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 9 FAULT" />
      <message id="M10" trigger-value="10" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 10 FAULT" />
      <message id="M11" trigger-value="11" identifier="0" trigger="#T1" backcolor="#800000" forecolor="#FFFFFF" audio="false" display="true" print="false" message-to-tag="false" text="MOTOR 11 FAULT" />
    </messages>
  </alarm>
</alarms>

答案 1 :(得分:1)

如果您的可变文本没有模式,则可以从Excel工作表中读取:

Sub TransformXML()
    Const xmlPath = "C:\Path\To\Alarms.xml"

    Dim xDoc As New MSXML2.DOMDocument60
    Dim loaded As Boolean
    xDoc.async = False
    loaded = xDoc.Load(xmlPath)
    If Not loaded Then
        MsgBox xDoc.parseError.reason
        Exit Sub
    End If
    'Assume that you have the old values in A2:A13 and the new values in B2:B13
    Dim transformRange As Range, cell As Range
    Set transformRange = Sheet1.Range("A2:B13")
    For Each cell In transformRange.Columns(1).Cells
        Dim xp As String
        xp = "/alarms/alarm/messages/message[@text='" & cell.Value2 & "']"
        Dim success As Boolean
        success = SetAttrAtPath(xDoc, xp, "text", cell.Offset(0, 1).Value2)
    Next cell

    xDoc.Save xmlPath
End Sub

Function SetAttrAtPath(loadedXMLDoc As DOMDocument60, _
                   elementXPath As String, _
                   attrName As String, _
                   newAttrValue As String) As Boolean
    Dim xNodes As IXMLDOMNodeList
    'Find all elements that fit the path i.e. have that element structure and attribute
    Set xNodes = loadedXMLDoc.SelectNodes(elementXPath)
    If xNodes.Length > 0 Then
        Dim elCount As Long
        For elCount = 0 To xNodes.Length - 1
            'set the attribute to have the new value
            xNodes.Item(elCount).Attributes.getNamedItem(attrName).NodeValue = newAttrValue
        Next elCount
        SetAttrAtPath = True
        Exit Function
    End If
End Function