You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel 2019宏批量修改CNC生成的XML文件

解决CNC XML文件中内值的批量替换问题

原宏代码的问题分析

  • 错误的XML处理逻辑:原代码将XML当作纯文本执行字符串替换,但XML解析后<NUM>是独立的元素节点,并非文本节点内的完整字符串,导致Replace方法无法匹配目标内容。
  • 无效的触发条件:原代码检查文本节点是否包含<CUT>,但<CUT>是元素节点,不会出现在文本节点的内容中,替换逻辑从未真正执行。

修正后的VBA宏代码

以下代码实现批量处理XML文件,将每个文件中<CUT>元素下的<NUM>值替换为对应文件名(Item)的QTY值(示例用字典预存映射关系,可根据实际需求改为读取Excel表格):

Sub BatchEditCNCXML()
    Dim fdFilePicker As FileDialog
    Dim fdFolderPicker As FileDialog
    Dim selectedFiles As Variant
    Dim filePath As String
    Dim fileName As String
    Dim xmlDoc As Object
    Dim cutNodes As Object
    Dim numNode As Object
    Dim qtyMap As Object ' 存储Item(文件名)与QTY的映射
    
    ' 初始化QTY映射字典(可替换为读取Excel表格的逻辑)
    Set qtyMap = CreateObject("Scripting.Dictionary")
    With qtyMap
        .Add "Sample1.xml", 5 ' 示例:文件名对应QTY值
        .Add "Sample2.xml", 3
        .Add "70-110_938.xml", 1 ' 匹配示例XML的文件名
    End With
    
    ' 选择多个XML文件
    Set fdFilePicker = Application.FileDialog(msoFileDialogFilePicker)
    With fdFilePicker
        .Title = "选择需要处理的XML文件"
        .Filters.Clear
        .Filters.Add "XML文件", "*.xml"
        .AllowMultiSelect = True
        If .Show <> -1 Then Exit Sub
        selectedFiles = .SelectedItems
    End With
    
    ' 选择保存目录
    Set fdFolderPicker = Application.FileDialog(msoFileDialogFolderPicker)
    With fdFolderPicker
        .Title = "选择保存修改后文件的目录"
        If .Show <> -1 Then Exit Sub
    End With
    
    ' 遍历每个选中的XML文件
    For Each filePath In selectedFiles
        ' 获取文件名(不含路径)
        fileName = Mid(filePath, InStrRev(filePath, "\") + 1)
        
        ' 加载XML文档
        Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
        xmlDoc.async = False
        xmlDoc.validateOnParse = False ' 适配CNC生成的非标准XML
        xmlDoc.Load filePath
        
        ' 获取所有<CUT>元素
        Set cutNodes = xmlDoc.SelectNodes("//CUT")
        
        ' 遍历每个<CUT>元素,修改其下的<NUM>值
        For Each cutNode In cutNodes
            Set numNode = cutNode.SelectSingleNode("./NUM")
            If Not numNode Is Nothing Then
                ' 检查映射关系,无匹配则设默认值1
                If qtyMap.Exists(fileName) Then
                    numNode.Text = qtyMap(fileName)
                Else
                    numNode.Text = 1
                End If
            End If
        Next cutNode
        
        ' 保存修改后的文件
        xmlDoc.Save fdFolderPicker.SelectedItems(1) & "\" & fileName
        
        ' 清理对象
        Set xmlDoc = Nothing
        Set cutNodes = Nothing
        Set numNode = Nothing
    Next filePath
    
    Set qtyMap = Nothing
    Set fdFilePicker = Nothing
    Set fdFolderPicker = Nothing
    
    MsgBox "批量处理完成!", vbInformation
End Sub

代码说明

  1. QTY映射配置:示例用字典存储文件名与QTY的对应关系,实际使用时可替换为读取Excel表格的逻辑(如从指定工作表A列读取文件名、B列读取QTY值)。
  2. XML节点定位:通过XPath精准定位<CUT>及其子节点<NUM>,直接修改元素文本内容,避免纯文本替换的兼容性问题。
  3. 批量处理支持:支持多选XML文件,修改后保留原文件名并保存到指定目录。

示例验证

针对你提供的示例XML,若文件名匹配70-110_938.xml,<CUT>内的<NUM>123</NUM>会被替换为<NUM>1</NUM>,符合需求。

内容的提问来源于stack exchange,提问作者Sid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:29:50