使用For Loop VBA简化

时间:2016-06-28 16:22:09

标签: excel vba

所以我对VBA并不是很好,以及它究竟是如何运作的,但我确信我所做的事情可以被浓缩,我只是不确定如何。

以下是我正在使用的代码:

Sub This()
If ComboBox5.Value = "Test" Then

If Range("R20").Value > 1 Then

Range("D37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[14]))+R[-17]C"

Range("E37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[13]))+R[-17]C"

Range("F37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[12]))+R[-17]C"

Range("G37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[11]))+R[-17]C"

Range("H37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[10]))+R[-17]C"

Range("I37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[9]))+R[-17]C"

Range("J37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[8]))+R[-17]C"

Range("K37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[7]))+R[-17]C"

Range("L37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[6]))+R[-17]C"

Range("M37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[5]))+R[-17]C"

Range("N37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[4]))+R[-17]C"

Range("O37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[3]))+R[-17]C"

Range("P37").Select
ActiveCell.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[2]))+R[-17]C"
End If
End If 

我录制了这个宏,它工作正常,但如果我想对Range(R23)这样做,那就有点痛。那么我将如何缩小此代码呢?我确定公式不是很清楚所以我希望D37的新更新值为:

D37 = (|(R20 - 1)|*D20) + D20

2 个答案:

答案 0 :(得分:2)

可能是这样的,虽然我尽量不使用R1C1表示法,因为它很难阅读,所以我不确定这正是你正在寻找的。

Sub This()
If ComboBox5.Value = "Test" Then

Dim rng as Range, cl as Range, i as Long

If Range("R20").Value > 1 Then
    Set rng = Range("D37:P37")
    rng.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C18))+R[-17]C"
End If

If Range("R23").Value > 1 Then
    '## NOTE: You may need to modify if the Column changes
    rng.FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C18))+R[-17]C"
Next
End Sub

解释为什么我在公式中使用C18

您的原始代码是使用带有相对引用的R1C1表示法。当您遍历您的单元格范围(从左向右移动)时,您的公式会减少列位置,例如:

Range("D37").FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[14]))+R[-17]C"  '## C[14]
Range("E37").FormulaR1C1 = "=ABS(R[-17]C*(1-R[-17]C[13]))+R[-17]C"  '## C[13]

因此,这意味着即使您更改了括号中的偏移值,您仍​​然会引用同一列,可以使用R1C1表示法C18

以绝对值表示

答案 1 :(得分:0)

好像您在同一行的每一列中放置了几乎相同的公式。所以,正如你的标题所暗示的那样,for循环可能是合适的。例如,

combine = cart(v=seq(1,n),k=k)
sum = 0
for(i in 1:dim(combine)[1]){
  if(sum(combine[i,])==n){
    sum = sum + sum(combine[i,])
  }
}