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.value
,rngCell.copy
因为它只复制值,而不需要将所有单元格内容读入内存。