使用VBA For循环求解谢丽尔生日 如何对比单元格与区域提取唯一值
VBA实现谢丽尔生日逻辑题解法
唯一值提取代码修正
你原有代码的问题在于:Range("A2:D4").Value返回的是二维数组,无法直接和单个单元格值做等值对比,你可以用工作表函数CountIf统计单元格值在目标区域的出现次数,次数为1即为唯一值,参考代码如下:
Sub FindUniqueDates() Dim targetRng As Range Dim c As Range Dim uniqueCol As Long ' 存储唯一值所在列号,后续清除用 ' 设定要对比的候选日期区域 Set targetRng = Range("A2:D4") ' 循环遍历你要检查的单元格区域,可根据实际存放日期的区域调整 For Each c In Range("A1:A12") ' 对应你原代码循环的1-12行A列单元格 If WorksheetFunction.CountIf(targetRng, c.Value) = 1 Then MsgBox c.Value & " 是唯一日期,位于第" & c.Row & "行" ' 记录唯一值所在列 uniqueCol = c.Column End If Next c ' 后续要清除唯一值所在列内容的话,取消注释下面一行即可 ' Columns(uniqueCol).ClearContents End Sub
如果你的日期是按“月/日”格式存储,确认单元格格式一致即可正常对比。
谢丽尔生日逻辑题推导结果
推导过程:
- 先排除唯一日期18、19对应的5月、6月(阿尔伯特确定伯纳德不知道,说明他拿到的月份里没有唯一日期),剩余候选:7月14日、7月16日、8月14日、8月15日、8月17日
- 伯纳德听完阿尔伯特的话就知道答案,说明剩余候选里他拿到的日期是唯一的,排除出现2次的14日,剩余:7月16日、8月15日、8月17日
- 阿尔伯特听完也知道了答案,说明他拿到的月份只剩1个候选,排除有2个候选的8月,最终答案为7月16日
内容的提问来源于stack exchange,提问作者Kevin Godinez
相关产品推荐
相关产品推荐

