我有一个完美的宏,但我现在需要自定义它并增加复杂性。
宏基本上是以下代码,针对各种范围重复多次。
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
答案 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在执行计算的范围内移动。