我是VBA的新手,我想复制以下代码以使过程自动化

=IF(A2="Male","M","F")


我已将其编码如下,以在“ A”的第5列(F)偏移中显示值

Sub Gender1()
'
' Gender1 Macro
'
' =IF(A2="Male","M","F")

    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Range("A2", Range("A2").End(xlDown))

    For Each rCell In rRng.Cells
        If rCell.Value = "Male" Then
            result = "M"
            rCell.Offset(0, 5).Select
            ActiveCell.Value = result
        ElseIf rCell.Value = "Female" Then
            result = "F"
            rCell.Offset(0, 5).Select
            ActiveCell.Value = result
        Else
            result = "NULL"
            rCell.Offset(0, 5).Select
            ActiveCell.Value = result
        End If

    Next rCell

End Sub


我想了解该方法是否正确,应该使用offset来显示值,还是有更好的方法来优化代码并在所需列中显示值。

我必须遍历10万行

最佳答案

如果您要处理1个紫胶行,我建议您采用另一种方法。

将列A的数据读入一个数组,并根据您的IF条件构造另一个数组,然后将结果数组立即写入到工作表中。

如果您要与单元格进行交互,那么循环遍历10万行将花费一些时间,但是Array方法可能会花费不到一秒钟的时间。

尝试一下以了解区别...

当我在150000行数据上运行此代码时,以下代码花费了不到一秒钟的时间。

Sub Gender()
Dim lr As Long, i As Long
Dim x, y()
lr = Cells(Rows.Count, 1).End(xlUp).Row
x = Range("A2:A" & lr).Value
ReDim y(1 To UBound(x, 1), 1 To 1)
For i = 1 To UBound(x, 1)
    If x(i, 1) = "Male" Then
        y(i, 1) = "M"
    ElseIf x(i, 1) = "Female" Then
        y(i, 1) = "F"
    Else
        y(i, 1) = "NULL"
    End If
Next i
Range("F2").Resize(UBound(y), 1).Value = y
End Sub

10-06 03:46