如何用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
代码说明
- QTY映射配置:示例用字典存储文件名与QTY的对应关系,实际使用时可替换为读取Excel表格的逻辑(如从指定工作表A列读取文件名、B列读取QTY值)。
- XML节点定位:通过XPath精准定位
<CUT>及其子节点<NUM>,直接修改元素文本内容,避免纯文本替换的兼容性问题。 - 批量处理支持:支持多选XML文件,修改后保留原文件名并保存到指定目录。
示例验证
针对你提供的示例XML,若文件名匹配70-110_938.xml,<CUT>内的<NUM>123</NUM>会被替换为<NUM>1</NUM>,符合需求。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

