为if then else循环添加复杂性

时间:2017-06-15 14:53:08

标签: excel vba

我有一个完美的宏,但我现在需要自定义它并增加复杂性。

宏基本上是以下代码,针对各种范围重复多次。

For i = 2 To n
Range(Cells(13, i), Cells(19, i)).Value = Sheets(i).Range("J13:J19").Value
Next i

我需要添加的逻辑/复杂性如下:

如果片材i上的范围O13:O19的总和大于零,则该片材上的范围单元格(13,i),单元格19,i)的值等于范围p13的值:第19页上的第19页。

如果纸张i上的范围O13:O19之和的值不大于0,则将目标范围的值设置为等于每个单元格(范围表(i).range(“I13:I19”) )折叠(ⅰ).range( “K13:K19”)* 4)。价值

简单来说,如果范围之和为0,则将范围A中每个单元格的值设置为范围b中每个单元格的值减去(范围C * 4中每个单元格的值)...

   Sub Op_ex_analysis_macro()


ActiveWorkbook.Sheets.Add Before:=Worksheets(1)
ActiveSheet.Name = "Control Panel"
Range("A:A").ColumnWidth = 36
Range("A12").Value = "Property Code"
Range("A13:A16") = Sheets(2).Range("A13:A16").Value
Range("A17") = Sheets(2).Range("B17").Value
Range("A18") = Sheets(2).Range("A18").Value
Range("A19") = Sheets(2).Range("B19").Value
Range("A20:A29") = Sheets(2).Range("A21:A30").Value
Range("A30") = Sheets(2).Range("B31").Value
Range("A31") = Sheets(2).Range("A33").Value
Range("A32:A36") = Sheets(2).Range("A35:A39").Value
Range("A37:A38") = Sheets(2).Range("A41:A42").Value

Range("A40").Value = "Analyst"
Range("A41").Value = "Number of Units"
Range("A42").Value = "Asset Manager"
Range("A43").Value = "Tenancy"
Range("A44").Value = "Year Built/Type"
Range("A45").Value = "Management Company"
Range("A46").Value = "End of Compliance Year"
Range("A47").Value = "Property Name"
Range("A48").Value = "Number of Properties"
Range("A49").Value = "City"
Range("A50").Value = "State"


'Consolidate Property Codes
n = ActiveWorkbook.Sheets.Count
For i = 2 To n
Z = Sheets(i).Range("P49").Value
Cells(12, i) = Z
Next i


'Consolidate rows 13-19

For i = 2 To n
Select Case Application.Sum(ThisWorkbook.Sheets(i).Range("O13:O33"))
Case Is > 0
Range(Cells(13, i), Cells(19, i)).Value = Sheets(i).Range("P13:P19").Value
Case Is = 0
Range(Cells(13, i), Cells(19, i)).Value = ThisWorkbook.Sheets(i).Range("I13:I19") - ThisWorkbook.Sheets(i).Range("K13:K19") * 4
End Select
Next i

2 个答案:

答案 0 :(得分:0)

在这种情况下,我认为最好的选择是使用Select case语句。

For i = 2 To n
Select Case Application.Sum(ThisWorkbook.Sheets(i).Range("O13:O33"))
Case Is > 0
Range(Cells(13, i), Cells(19, i)).Value = Sheets(i).Range("P13:P19").Value
Case Is < 0
Range(Cells(13, i), Cells(19, i)).Value = ThisWorkbook.Sheets(i).Range("I13:I19") - ThisWorkbook.Sheets(i).Range("K13:K19") * 4
End Select
Next i

希望这会有所帮助:)

编辑如果您想要考虑它是什么&#34; 0&#34;然后只需添加Case Is 0

答案 1 :(得分:0)

经过大量的反复试验,我能够通过不同的途径解决问题。

正如上面正确提到的A.S.H,你不能对VBA阵列进行算术运算。

我的代码的前半部分基本上是移动一个数组,正如Scott Craner在另一个页面上所说的那样,这很简单。

指示VBA执行计算需要编码人员按单元格逐个发送范围。

最终,根据需要执行的代码如下:

Dim rng As Range
n = ActiveWorkbook.Sheets.Count
With ActiveSheet
    For i = 2 To n
        If Application.Sum(Sheets(i).Range("O13:O33")) > 0 Then
            .Range(.Cells(13, i), .Cells(19, i)).Value = Sheets(i).Range("P13:P19").Value
        Else
            For Each rng In .Range(.Cells(13, i), .Cells(19, i))
                rng.Value = Sheets(i).Cells(rng.Row, "I") - (4 * Sheets(i).Cells(rng.Row, "K"))
            Next rng
        End If
    Next i
End With

如果满足if语句的前1/2的条件,那么它只是将这些值设置为等于这些值。如果不满足条件,则Else语句将指示Excel在执行计算的范围内移动。