Excel VBA 如何将活动单元格设置为仅具有 X 数据的单元格?

Excel VBA 如何将活动单元格设置为仅具有 X 数据的单元格?
 Dim NA As String
         NAFinder = 9
         NA = ActiveSheet.Range("F9").Select
        
        For i = 0 To NARows
            NA = ActiveCell.Offset(i, 0).Value
            If NA = "" Then Exit For
            If NA = "N/A" Or NA = "N\A" Then
                ActiveCell.Copy Worksheets("Folha1").Range("Q1")
              End If
        Next i

这是我目前正在使用的代码,最终目标是遍历 F 列,只要发现 N/A 或 N\A 就复制单元格,将其放在另一张表上,然后删除该行,但现在我唯一想让它先做的就是正确复制单元格,但它没有这样做,它只是复制 F9 中的值。忽略变量 NAFinder,因为它没有使用,我只打算在将来使用它。

我确信我的错误是显而易见的,但我只是没有看到它们,因为我对这些东西还很陌生哈哈。

先感谢您!

答案1

您遇到此问题是因为您在开始时选择 F9,但从未将选择更改为新单元格。因此,您可以改用以下方法:

    NA = ActiveSheet.Range("F9").Select
    
    For i = 0 To NARows
        NA = ActiveCell.Offset(i, 0).Value
        If NA = "" Then Exit For
        If NA = "N/A" Or NA = "N\A" Then
            ActiveCell.offset(i,0).Copy Worksheets("Folha1").Range("Q1")
        End If
    Next i

话虽如此,我不太喜欢使用Range.Offset(i,0)来识别单元格。我建议使用两个Range变量并循环遍历它们,而不是依赖于Offset(i,0)

我还建议您在开始时找到您的结束单元格,而不是每次都检查值是否为“”。

第三个建议是不要使用多个 OR 语句,而是使用一个包含所有可能标记值的常量,并检查单元格内容是否出现在该列表中。

Sub ExtractNA()
    Const csFlags As String = "N\A,N/A,NA"
    Const csStCol As String = "F"
    Const csStRow As String = "9"
    
    Dim rngAll As Range
    Dim rngCell As Range
    Dim rngTarget As Range
    Dim LR As Long
    
    LR = Range(csStCol & Rows.Count).End(xlUp).Row
    
    Set rngAll = Range(csStCol & csStRow, csStCol & LR)
    Set rngTarget = Sheets("Folha1").Range("Q1")
    
    For Each rngCell In rngAll
        If InStr(1, csFlags, rngCell.Value, vbTextCompare) <> 0 Then
            rngTarget.Value = rngCell.Value
            Set rngTarget = rngTarget.Offset(1, 0)
        End If
    Next rngCell
End Sub

我们在开始时将期望固定的值定义在常量中,这样我们就可以轻松地引用它们并更改它们,而不必梳理代码。

我们首先找到源列中具有值的最后一行,然后Range("F" & rows.count)使用该End(xlup)方法找到该列中包含数据的底部单元格,并返回其.row作为数据的末尾。

然后,我们用 定义想要检查的单元格范围rngAll,从常量中指定的单元格到Range(csStCol & csStRow刚刚找到的最后一行。

通过循环遍历范围变量,我们无需担心选择任何内容,这将加快处理速度。使用 也比 更快rngTarget.value = rngCell.valuerngCell.copy因为它只复制值,而不需要将所有单元格内容读入内存。

相关内容