如何用VBA Select Case遍历整列数值并按条件输出对应内容
解决方案
错误原因
- 最初代码直接对整列I的多单元格Range对象使用
Select Case判断,多单元格区域无法直接和单个数值做比较,因此触发类型不匹配错误。 - 修改后的代码逻辑错误:
Select Case LastRow = .Range("I" & .Rows.Count).End(xlUp).Row是布尔判断表达式,返回结果为True/False,不可能匹配数值111的判断条件。
通用实现代码
以下代码仅遍历I列有数据的区域,避免无效遍历浪费性能:
Sub Test() Dim wsSort As Worksheet Dim lastRow As Long Dim i As Long ' 绑定目标工作表 Set wsSort = Workbooks("Learner data Elliot.xlsm").Worksheets(2) ' 获取I列最后一行有数据的行号 With wsSort lastRow = .Range("I" & .Rows.Count).End(xlUp).Row End With ' 遍历I列有效行,若I列第1行是表头,将下方循环起始值改为2即可 For i = 1 To lastRow ' 对单个单元格的值做判断 Select Case wsSort.Cells(i, "I").Value Case 111 ' 同行左移2列写入test,也可写为wsSort.Cells(i, "I").Offset(0, -2).Value = "test" wsSort.Cells(i, "G").Value = "test" End Select Next i MsgBox "Done" End Sub
大数据量优化方案
如果I列数据量超过1000行,建议使用数组处理,减少VBA和Excel单元格的交互次数,运行速度会提升数倍:
Sub TestFast() Dim wsSort As Worksheet Dim lastRow As Long Dim dataArr As Variant Dim resArr As Variant Dim i As Long Set wsSort = Workbooks("Learner data Elliot.xlsm").Worksheets(2) With wsSort lastRow = .Range("I" & .Rows.Count).End(xlUp).Row ' 一次性读取I列所有数据到数组 dataArr = .Range("I1:I" & lastRow).Value ' 初始化G列结果数组 ReDim resArr(1 To UBound(dataArr, 1), 1 To 1) End With ' 遍历数组做判断 For i = 1 To UBound(dataArr, 1) Select Case dataArr(i, 1) Case 111 resArr(i, 1) = "test" End Select Next i ' 一次性将结果写入G列 wsSort.Range("G1:G" & lastRow).Value = resArr MsgBox "Done" End Sub
内容的提问来源于stack exchange,提问作者SeanG1246
相关产品推荐
相关产品推荐

