【问题标题】:How to I select a Range based on active row in VBA?如何根据 VBA 中的活动行选择范围?
【发布时间】:2021-01-17 17:37:03
【问题描述】:

我正在尝试根据输入的数据设置一系列单元格的单元格颜色。 该行将根据当前处于活动状态的行而更改,但列将保持不变。 如果活动单元格为“N/A”,我想将单元格颜色更改为黑色。我不断收到运行时错误 13:类型不匹配。我正在尝试为当前选择的任何行中的 D:F 列着色。我的代码片段如下。

Sub black_out_range()
Dim wsC As Worksheet
Dim jobRange As Range
Dim jobRange As Range

Set wsC = Worksheets("Sheet1")
Set jobRange = Range("B10", Range("B10").End(xlDown))

jobRange.Select

If TypeName(Selection) = "Range" Then
    For Each i In jobRange
    i.Activate
    
    If ActiveCell = "N/A" Then
        With wsC
            .Range(.Cells(4, i), .Cells(6, i)).Interior.Color = RGB(0, 0, 0)
        End With

提前致谢!

【问题讨论】:

  • 您是要讨论#N/A 错误(例如,当 Vlookup 找不到匹配项时),还是以不同的方式放置字符串“N/A”?
  • @frekles9287 在问题的解释中做一些编辑会很好。很难理解你想要什么。

标签: excel vba


【解决方案1】:

通常最好尽量避免在 VBA 中使用 select 和 activate,尤其是当您尝试循环遍历范围时

此代码将从第 10 行(到最后一行数据)开始查看 b 列中的值,然后颜色 d-f black 是 B 中的值是“N/A”。

Sub black_out_range()
Dim last_row As Long


last_row = Range("B10").End(xlDown).Row()

For i = 10 To last_row
    If Cells(i, 2).Value = "N/A" Then   'asumes you want to start looking at cell b10
        Range("D" & i & ":F" & i).Interior.Color = RGB(0, 0, 0)
    End If
Next i

End Sub
    


【讨论】:

    【解决方案2】:

    您没有回答我的澄清问题,所以我会尝试假设您尝试处理真正的错误#N/A。如果是这样,请尝试下一个代码。也避免了选择,没有任何好处,只会消耗Excel资源,降低代码速度:

    Sub black_out_range()
     Dim wsC As Worksheet, lastR As Long, i As Long
    
     Set wsC = Worksheets("Sheet1")
     lastR = wsC.Range("B" & rows.count).End(xlUp).row() 'it returns the last cell even with gaps in the range
    
     For i = 10 To lastR
        If IsError(wsC.Range("B" & i).Value) Then
            If wsC.Range("B" & i).Value = CVErr(2042) Then   'the error for '#N/A' type
                wsC.Range("D" & i & ":F" & i).Interior.Color = RGB(0, 0, 0)
            End If
        End If
     Next i
    End Sub
    

    但是,如果这些单元格中确实有“N/A”,请使用下一个版本:

    Sub black_out_range_bis()
     Dim wsC As Worksheet, lastR As Long, i As Long
    
     Set wsC = Worksheets("Sheet1")
     lastR = wsC.Range("B" & rows.count).End(xlUp).row()
    
     For i = 10 To lastR
        If wsC.Range("B" & i).Value = "N/A" Then
            wsC.Range("D" & i & ":F" & i).Interior.Color = RGB(0, 0, 0)
        End If
     Next i
    End Sub
    

    【讨论】:

    • @freckles9287:那么,我是否应该理解您真的应该处理“N/A”字符串?
    猜你喜欢
    • 2018-11-11
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2020-02-10
    • 1970-01-01
    • 2017-01-11
    • 2019-03-27
    相关资源
    最近更新 更多