EP07. “Sort Birthdays 按生日排序(忽略年份)”
🔒 登录后可标记已读- 用冒泡排序(跟 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: