2017-06-15 31 views
-1

我有一個完美的宏,但我現在需要定製它並增加複雜性。爲if if else循環添加複雜性

這個宏基本上是以下代碼重複無數次的各種範圍。

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

邏輯/複雜性,我需要添加到本應該如下:

如果範圍O13的總和:O19上片i大於零,則該範圍內的值這張紙上的單元格(13,i),單元格19,i)等於紙張i上的範圍p13:p19的值。

如果紙張i上的範圍O13:O19之和的值不大於0,則將目標範圍的值設置爲等於(範圍紙張(i).range(「I13:I19 「)-sheet(i).range(」K13:K19「)* 4).value

簡而言之,如果範圍之和爲0,則將範圍A中每個單元格的值設置爲值(範圍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 

回答

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 

希望這有助於:)

編輯如果歐想佔了when它的「0」,則只需添加一個Case Is 0

+0

但是,如果值= 0呢? – braX

+0

嗨Joao,我試着你的解決方案,但得到一個語法錯誤,使你的代碼第2行... – AdMac

+0

@AdamMcDermott剛剛編輯的代碼,請現在試試吧。 –

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語句滿足,那麼它只是設置這些值等於這些值的前半的條件。如果條件不滿足,則Else語句指示Excel在執行計算的範圍內移動。