MICROSOFT

EP07. “Sort Birthdays 按生日排序(忽略年份)”

首页 Microsoft 工具 Excel · VBA · Date and Time · EP07
约 5 分钟· #EP07#Excel#Date and Time
🔒 登录后可标记已读
  • 用冒泡排序(跟 07_Loop/EP06 同样的排序思路)把一批生日按「月份优先、日期其次」排好
  • 刻意忽略年份——因为生日本来就是每年循环,比的是月和日,不是完整日期先后
  • 前置知识:07_Loop/EP06 的冒泡排序、Month/Day 函数的基本用法
  • 学完能自己写「只比较日期里某部分(月/日)」的排序逻辑

重点内容


适用版本

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


完整代码

Dim i As Integer, j As Integer
Dim monthToCheck As Integer, dayToCheck As Integer, monthNext As Integer, dayNext As Integer
Dim tempDate As Date, tempName As String

For i = 1 To 8
    For j = i + 1 To 9
        monthToCheck = Month(Cells(i, 2).Value)
        dayToCheck = Day(Cells(i, 2).Value)
        monthNext = Month(Cells(j, 2).Value)
        dayNext = Day(Cells(j, 2).Value)

        If (monthNext < monthToCheck) Or (monthNext = monthToCheck And dayNext < dayToCheck) Then
            ' 交换日期
            tempDate = Cells(i, 2).Value
            Cells(i, 2).Value = Cells(j, 2).Value
            Cells(j, 2).Value = tempDate

            ' 交换对应的名字
            tempName = Cells(i, 1).Value
            Cells(i, 1).Value = Cells(j, 1).Value
            Cells(j, 1).Value = tempName
        End If
    Next j
Next i

逻辑说明

  • Month()Day() 分别取出两个日期的月份和日数,完全不看 Year()
  • 判断条件:后面那笔的月份比较小,或者月份相同但日数比较小,就代表顺序不对,需要交换
  • 交换时日期和名字要一起换,用两组 temp 变量分别处理,确保「谁的生日」这个对应关系不会跑掉

学完你会

  • ✅ 用 Month()Day() 只取日期里的部分字段来比较,忽略不需要的年份
  • ✅ 用冒泡排序处理「多层判断」(先比月份,月份相同再比日)
  • ✅ 交换关联数据时,同一行的所有栏位要一起交换,保持对应关系

常见错误

  • 只交换了日期,忘记把对应的名字也一起换,导致日期排好了,但名字对不上原本的人
  • 判断条件只比较月份,没有在「月份相同」时进一步比较日数,同月生日的人顺序会是原始顺序而非按日排列
  • 拿完整日期(含年份)直接比较大小,没有用 Month/Day 拆开来看,年份不同会干扰排序结果

Sources

Blog / Website:

  1. Sort Birthdays