Excel VBA技术问询:比较D/F列范围,将D列新增字符串追加至F列
解决Excel D列与F列字符串比对并追加独值的VBA问题
嘿,我瞅见你在处理两列字符串的比对追加需求时,VBA代码出了点状况——比如误把已经存在的"g"识别成新字符串,而且代码还没完成最终追加到F列的步骤。咱们先拆解原代码的问题,再给出完整的解决方案。
原代码的核心问题
- Lastrow未初始化:代码里定义了
Lastrow但没给它赋值,默认是0,循环For r = 1 To Lastrow根本不会执行,或者执行范围完全错误。 - CountIf参数搞反了:你要判断的是「D列当前单元格的值是否在F列不存在」,但原代码写的是
CountIf(Range("D:D"), Cells(r, 6))——这是在统计F列单元格在D列的出现次数,逻辑完全颠倒了! - 缺少最终追加步骤:原代码只是把结果写到G列,但没把这些独有的值真正追加到F列末尾。
修正后的完整VBA代码
Sub RT_COMPILER() Dim lastRowD As Long, lastRowF As Long Dim r As Long Dim uniqueValues As Collection ' 初始化集合来存D列独有的值(自动去重,不过你说D列值唯一,所以主要用来存F列没有的) Set uniqueValues = New Collection ' 获取D列和F列的最后一行行号 lastRowD = Cells(Rows.Count, "D").End(xlUp).Row lastRowF = Cells(Rows.Count, "F").End(xlUp).Row ' 遍历D列所有值,筛选出F列没有的 On Error Resume Next ' 集合重复添加会报错,这里忽略(因为D列值唯一,其实不会触发,但保险起见) For r = 1 To lastRowD ' 核心修正:统计D列当前值在F列的出现次数 If Application.WorksheetFunction.CountIf(Range("F:F"), Cells(r, "D").Value) = 0 Then uniqueValues.Add Cells(r, "D").Value, Key:=CStr(Cells(r, "D").Value) End If Next r On Error GoTo 0 ' 恢复错误处理 ' 把筛选出的独值追加到F列末尾 If uniqueValues.Count > 0 Then For r = 1 To uniqueValues.Count lastRowF = lastRowF + 1 Cells(lastRowF, "F").Value = uniqueValues(r) Next r End If ' 可选:清空G列的临时数据(如果不需要保留的话) Range("G:G").ClearContents MsgBox "完成!共追加 " & uniqueValues.Count & " 个新字符串到F列。" End Sub
代码关键步骤解释
- 获取有效行号:用
Cells(Rows.Count, "D").End(xlUp).Row精准获取D列最后一个有值的行,避免遍历整列浪费资源。 - 正确的CountIf逻辑:
CountIf(Range("F:F"), Cells(r, "D").Value)——统计D列当前值在F列的出现次数,等于0就说明是F列没有的新值。 - 用集合存独值:集合可以自动处理重复(虽然你说D列值唯一,但这个操作更严谨),最后批量追加到F列末尾。
- 完整的追加流程:先获取F列当前最后一行,然后逐个把集合里的新值写进去,行号逐步递增。
测试你的示例场景
假设D列是a、b、c、e、f、g,F列是b、c、d、e、g:
- 遍历D列时,会筛选出
a和f(因为这两个在F列找不到) - 最终F列会变成
b、c、d、e、g、a、f,完全符合你的需求。
内容的提问来源于stack exchange,提问作者XCELLGUY
相关产品推荐
相关产品推荐

