DRY切换执行顺序的方式

时间:2014-10-15 20:07:58

标签: excel vba excel-vba

在下面的函数中(我还没有测试过),我需要在数组中移动值,然后相应地调整数组大小,问题在于我们是否在索引中向上移动值,或者向下移动需要先调整数组大小或移动值。你可以看到我有一个If语句,并且它有移动和调整大小的范围,但两种情况都有相同的结果(仅切换了行的顺序),是否有一种DRYer方式来编写它?

Private Function Update_Index(index As Interger, move As Integer) As Boolean
    Dim last As Integer
    last = UBound(Var_array, 2)
    If move < 0 Then
        ReDim Preserve Var_array(2, last + move)
        For i = index - 1 To last
            Var_array(i, 1) = Var_array(i + move, 1)
            Var_array(i, 2) = Var_array(i + move, 2)
        Next i
    Else
        For i = index - 1 To last
            Var_array(i, 1) = Var_array(i + move, 1)
            Var_array(i, 2) = Var_array(i + move, 2)
        Next i
        ReDim Preserve Var_array(2, last + move)
    End If
End Function

注意:在这种情况下,重复似乎是无害的,但我正在调整更大的代码块以满足这些需求。

2 个答案:

答案 0 :(得分:1)

创建一个子程序,通过引用传递数组。

Private Sub Update(ByRef array as variant, ByVal index as long, ByVal move as long)
    For i = index - 1 To ubound(array)
        Var_array(i, 1) = Var_array(i + move, 1)
        Var_array(i, 2) = Var_array(i + move, 2)
    Next i
End Sub

Private Sub Update_Index(index As Interger, move As Integer) As Boolean
    If move < 0 Then
        ReDim Preserve Var_array(2, last + move)

        Update Var_array, index, move
    Else

        Update Var_array, index, move

        ReDim Preserve Var_array(2, last + move)
    End If
End Function

你可能会提取另一种方法,但我不确定为什么你ReDim前后取决于移动大小。

答案 1 :(得分:1)

Private Function Update_Index(index As Integer, move As Integer) As Boolean
    Dim last As Integer
    last = UBound(Var_array, 2)
    If move < 0 Then ReDim Preserve Var_array(2, last + move)
    For i = index - 1 To last
        Var_array(i, 1) = Var_array(i + move, 1)
        Var_array(i, 2) = Var_array(i + move, 2)
    Next i
    If move > 0 Then ReDim Preserve Var_array(2, last + move)
End Function