MICROSOFT

EP08. “Remove Duplicates 移除重复数字”

首页 Microsoft 工具 Excel · VBA · Loop · EP08
约 5 分钟· #EP08#Excel#Loop
🔒 登录后可标记已读
  • 这篇教怎么用双层循环加一个布尔(Boolean)标志变量,把 A 列 10 个数字里的重复值挑掉,只把不重复的数字放进 B 列
  • 前置知识:双层循环和 If Then 判断
  • 学完能理解「用一个开关变量标记状态」这个很常用的编程手法
  • 也是 Excel 内建"删除重复项"功能背后的基本原理

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


完整 VBA 代码

Dim toAdd As Boolean, uniqueNumbers As Integer, i As Integer, j As Integer

Cells(1, 2).Value = Cells(1, 1).Value

uniqueNumbers = 1
toAdd = True

For i = 2 To 10

    For j = 1 To uniqueNumbers
        If Cells(i, 1).Value = Cells(j, 2).Value Then
            toAdd = False
        End If
    Next j

    If toAdd = True Then
        Cells(uniqueNumbers + 1, 2).Value = Cells(i, 1).Value
        uniqueNumbers = uniqueNumbers + 1
    End If

    toAdd = True

Next i

代码说明

  1. 声明 toAdd(布尔开关,标记「这个数字要不要被加进去」)、uniqueNumbers(目前已收集到几个不重复数字)、ij(循环计数器)
  2. 先把 A 列第一个数字直接复制到 B 列第一格,因为第一个数字必然是不重复的,uniqueNumbers 设成 1
  3. 外层循环 For i = 2 To 10 从第 2 个数字开始逐一检查(第 1 个已经处理过了)
  4. 内层循环 For j = 1 To uniqueNumbers 拿当前数字(Cells(i, 1))跟 B 列目前已收集的每一个不重复数字比对,只要找到相同的,就把 toAdd 设成 False
  5. 内层循环结束后,如果 toAdd 还是 True(表示跟已收集的数字都不重复),就把这个数字加进 B 列,uniqueNumbers 加 1
  6. 每处理完一个数字(不管有没有加进去),都把 toAdd 重设回 True,让下一轮循环重新判断——这一步很关键,不重设的话上一轮的判断结果会一直延续下去,后面的数字永远加不进去

怎么运行

在 A1:A10 输入 10 个数字(含重复),Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),B 列会显示去重后的结果。


学完你会

  • ✅ 会用布尔开关变量标记「这个值要不要被加进去」
  • ✅ 理解为什么每轮循环结束都要把开关重设回 True
  • ✅ 会用「已收集数量」而不是写死的范围当内层循环的上限

常见错误

  • 忘记在每轮外层循环结束前把 toAdd 重设回 True,会导致一旦某个数字被判定为重复,后面所有数字都会被误判成重复,B 列不会再增加任何新值
  • 内层循环范围要用 1 To uniqueNumbers(只跟"已经收集到的"数字比较),而不是固定 1 To 10——如果写死成 10,会拿还没处理过的、值是 0 或空的单元格来比较,判断会出错
  • 循环范围写死是 10 行,数据超过或不足 10 行时程序不会自动适应,需要手动调整上限或改成动态抓取最后一行

Sources

Blog / Website:

  1. Remove Duplicates