是否有更有效的 For-Next 方法,包括 If-Then 语句



我正在提高两个宏的效率。除了标题上描述的方法外,我已经设法改进了他们的所有方法。它是功能齐全的,但我相信有一种更好的方法来纠正我在下面提供的代码部分:

For Each cell2 In Range("L2:L" & lastrow2)
  If Not cell2.Offset(0, -1).Value = 0 Then
    If cell2.Offset(0, -5).Value = "SOCHACZEW" Then
    cell2.Value = 31.2
    ElseIf cell2.Offset(0, -5).Value = "SEKERPINAR" Then
    cell2.Value = 33
    ElseIf cell2.Offset(0, -5).Value = "ATHENS" Then
    cell2.Value = 28
    ElseIf cell2.Offset(0, -5).Value = "MECHELEN" Then
    cell2.Value = 33
    ElseIf cell2.Offset(0, -5).Value = "TIMISOARA" Then
    cell2.Value = 34
    ElseIf cell2.Offset(0, -5).Value = "STRANCICE" Then
    cell2.Value = 33
    ElseIf cell2.Offset(0, -5).Value = "KLIPPAN" Then
    cell2.Value = 33
    ElseIf cell2.Offset(0, -5).Value = "MATARO" Then
    cell2.Value = 33
    ElseIf cell2.Offset(0, -5).Value = "KIEV" Then
    cell2.Value = 32
    ElseIf cell2.Offset(0, -5).Value = "ROSTOV" Then
    cell2.Value = 32.6
    ElseIf cell2.Offset(0, -5).Value = "ITELLA" Then
    cell2.Value = 32
    End If
  End If
Next cell2

您可以将一些ElseIf组合在一起,因为它们共享相同的结果,同时切换到Select Case,您的代码可以更短,如下所示:

For Each cell2 In Range("L2:L" & lastrow2)
    With cell2
        If Not .Offset(0, -1).Value = 0 Then
            Select Case .Offset(0, -5).Value
                Case "SOCHACZEW"
                    .Value = 31.2
                Case "SEKERPINAR", "MECHELEN", "STRANCICE", "KLIPPAN", "MATARO"
                    .Value = 33
                Case "ATHENS"
                    .Value = 28
                Case "KIEV", "ITELLA"
                    .Value = 32
                Case "ROSTOV"
                    .Value = 32.6
                Case "TIMISOARA"
                    .Value = 34
            End Select
        End If
    End With
Next cell2

@ShaiRado答案确实使代码更短,但为了性能起见,您应该使用数组来最小化与范围的交互:


Option Explicit
Public Sub SetCities()
    Const COL_G = 1
    Const COL_K = 5
    Const COL_L = 6
    Dim r As Long, arr As Variant, lastrow2 As Long, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")  'read entire range
    With ws
        lastrow2 = .Cells(.Rows.Count, "L").End(xlUp).Row
        arr = .Range("G2:L" & lastrow2)
    End With
    For r = 1 To UBound(arr)
        If Not IsError(arr(r, COL_G)) And Not IsError(arr(r, COL_K)) Then
            If Len(arr(r, COL_K)) > 0 Then
                Select Case arr(r, COL_G)
                    Case "SOCHACZEW":   arr(r, COL_L) = 31.2
                    Case "SEKERPINAR", "MECHELEN", "STRANCICE", "KLIPPAN", "MATARO"
                                        arr(r, COL_L) = 33
                    Case "ATHENS":      arr(r, COL_L) = 28
                    Case "TIMISOARA":   arr(r, COL_L) = 34
                    Case "KIEV", "ITELLA"
                                        arr(r, COL_L) = 32
                    Case "ROSTOV":      arr(r, COL_L) = 32.6
                End Select
            End If
        End If
    Next
    ws.Range("G2:L" & lastrow2) = arr   'write entire range
End Sub

或者至少在执行之前关闭Application.ScreenUpdating,并在执行后重新打开

您还应该完全限定所有范围以明确说明工作表

最新更新