VBA多列空值判断与数组匹配赋值问题求助
解决A、C列空值时B列匹配赋值的VBA实现
核心判断条件实现
要判断某一行的A列和C列单元格均为空,同时B列有有效值,推荐用这两种严谨的判断逻辑:
- 针对真正空单元格的判断:
If IsEmpty(Range("A" & i)) And IsEmpty(Range("C" & i)) And Not IsEmpty(Range("B" & i)) Then - 能排除单元格仅含空格情况的判断(更稳妥):
If Len(Trim(Range("A" & i).Value)) = 0 And Len(Trim(Range("C" & i).Value)) = 0 And Len(Trim(Range("B" & i).Value)) > 0 Then
完整实现代码
结合你给出的数组,提供两种匹配赋值方式,按需选择即可:
方式一:循环遍历数组匹配
Sub AssignDValue() Dim Faelle() As Variant: Faelle = VBA.Array("a", "b", "c", "d", "e") Dim Werte() As Variant: Werte = VBA.Array("1", "2", "3", "4", "5") Dim lastRow As Long Dim i As Long, j As Long ' 获取数据最后一行,避免遍历无意义的空行 lastRow = Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To lastRow ' 执行A、C空且B非空的判断 If Len(Trim(Range("A" & i).Value)) = 0 And Len(Trim(Range("C" & i).Value)) = 0 And Len(Trim(Range("B" & i).Value)) > 0 Then ' 遍历Faelle数组查找匹配项 For j = LBound(Faelle) To UBound(Faelle) If Range("B" & i).Value = Faelle(j) Then Range("D" & i).Value = Werte(j) Exit For ' 找到匹配就退出循环,提升运行效率 End If Next j End If Next i End Sub
方式二:用Application.Match快速匹配(更简洁)
Sub AssignDValue_Match() Dim Faelle() As Variant: Faelle = VBA.Array("a", "b", "c", "d", "e") Dim Werte() As Variant: Werte = VBA.Array("1", "2", "3", "4", "5") Dim lastRow As Long Dim i As Long, matchIndex As Variant lastRow = Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To lastRow If Len(Trim(Range("A" & i).Value)) = 0 And Len(Trim(Range("C" & i).Value)) = 0 And Len(Trim(Range("B" & i).Value)) > 0 Then ' 用Match定位B列值在Faelle数组中的位置 matchIndex = Application.Match(Range("B" & i).Value, Faelle, 0) ' 检查是否找到有效匹配,避免报错 If Not IsError(matchIndex) Then Range("D" & i).Value = Werte(matchIndex - 1) ' 注意数组是0基索引,Match返回1基索引,需减1 End If End If Next i End Sub
关于你提到的Kol数组
你声明的Kol = VBA.Array(1,2,3)如果是想灵活指定A、B、C列的列号,可以保留并替换代码里的列引用:比如把Range("A" & i)改成Cells(i, Kol(0)),Range("B" & i)改成Cells(i, Kol(1)),这样后续要调整列的话,直接修改Kol数组即可,不用改动多处代码。
效果验证
运行代码后,示例数据的第2行B列b会匹配到Werte数组的2,第4行B列e会匹配到5,和你给出的示例预期结果一致。
内容的提问来源于stack exchange,提问作者maliebina
相关产品推荐
相关产品推荐

