Excel VBA:如何判断单元格内容是否为数组中的值
解决VBA中判断单元格内容是否在数组中的问题
嘿,看你卡在了VBA宏里的条件判断环节——要检查单元格值是否在指定的日期数组里对吧?这就给你俩实用的解决方案,还帮你把代码里的小细节优化好:
方法一:遍历数组逐个匹配
这是最贴合你现有代码结构的方式,直接循环数组里的每个元素和单元格值对比就行:
Public Sub Saturdays() Dim i As Integer Dim j As Integer Dim Sat As Variant ' 补全你的日期数组(建议用DateSerial生成日期常量,比字符串靠谱) Sat = Array(DateSerial(2018, 1, 6), DateSerial(2018, 1, 13), _ DateSerial(2018, 1, 20), DateSerial(2018, 1, 27), _ DateSerial(2018, 2, 3), DateSerial(2018, 2, 10)) ' 继续补全剩下的日期就行 ' 假设你要检查A列的单元格,这里以遍历A1到A100为例,你可以根据需求改范围 For i = 1 To 100 ' 遍历数组里的每一个日期 For j = LBound(Sat) To UBound(Sat) ' 用DateValue转换单元格值,确保和数组的日期类型一致,避免格式坑 If DateValue(Cells(i, 1).Value) = Sat(j) Then ' 这里写你要执行的后续代码,比如标记、计算啥的 MsgBox "找到匹配的周六啦:" & Sat(j) ' 找到匹配后直接退出内层循环,省点时间 Exit For End If Next j Next i End Sub
划重点:
- 别用字符串存日期!用
DateSerial(year, month, day)生成日期常量,能避免系统日期格式不同导致的匹配失败 - 一定要用
DateValue转一下单元格值,不然如果单元格是日期格式,直接和字符串比肯定不匹配,踩过这个坑的人含泪提醒😅
方法二:用WorksheetFunction.Match快速匹配
嫌写双层循环麻烦?用Excel自带的Match函数就能快速判断,代码更清爽:
Public Sub Saturdays() Dim i As Integer Dim Sat As Variant Dim matchResult As Variant Sat = Array(DateSerial(2018, 1, 6), DateSerial(2018, 1, 13), _ DateSerial(2018, 1, 20), DateSerial(2018, 1, 27)) For i = 1 To 100 On Error Resume Next ' 处理Match找不到匹配时的错误,不然会弹窗报错 matchResult = WorksheetFunction.Match(DateValue(Cells(i, 1).Value), Sat, 0) On Error GoTo 0 ' 恢复默认错误处理,别影响后面的代码 ' 如果找到匹配,matchResult会返回数组里的位置;没找到就是Empty If Not IsEmpty(matchResult) Then ' 这里写你的后续逻辑,比如给对应单元格标个色或者写内容 Cells(i, 2).Value = "周六" ' 举个例子:在B列标记出来 matchResult = Empty ' 重置变量,避免下一次判断出错 End If Next i End Sub
为啥推荐这个?
- 省去内层循环,代码短不少
- 数据量小的时候和循环效率差不多,数据量大的话
Match反而更快
对了,你原代码里数组末尾的3...是没写完的日期吧?记得补全所有需要的周六日期哦~
内容的提问来源于stack exchange,提问作者FORT
相关产品推荐
相关产品推荐

