减少VBA中的代码行

时间:2015-04-09 21:58:06

标签: excel vba excel-vba

我反复对多列执行操作,并希望消除冗余代码。我发布了前两列的代码,因为我认为这足以证明我在做什么,但代码重复了总共16列(E列 - 列T)。

具有偏移量的

OldplayerRosterLocation基本上是" vba vlookup"让旧玩家找到它们在纸张上的位置,以便根据需要修改正确的行数据。它有效,但我想减少冗余代码。

'Below determines what weeks old player has already played.
'First part replaces team win/loss for that week as a value instead of
'formula so second part does not ruin sheet.
If Range("E61") = "1" Then 'Wk#1
Range("E42").Value = Range("E62")
Range("E43").Value = Range("E63")
'Second part clears weekly results for new player each weeks that the 
'old player has already played.
Range(OldPlayerRosterLocation).Offset(0, 3).ClearContents
Range(OldPlayerRosterLocation).Offset(1, 3).ClearContents
Range(OldPlayerRosterLocation).Offset(2, 3).ClearContents
End If

If Range("F61") = "1" Then 'WK#2
Range("F42").Value = Range("F62")
Range("F43").Value = Range("F63")
Range(OldPlayerRosterLocation).Offset(0, 4).ClearContents
Range(OldPlayerRosterLocation).Offset(1, 4).ClearContents
Range(OldPlayerRosterLocation).Offset(2, 4).ClearContents
End If

如何简化此代码?

2 个答案:

答案 0 :(得分:0)

我确定你可以将它用于16列:

Dim c As Range

For Each c In Range("E61:T61")
  If c = "1" Then
    c.Offset(-19, 0).Value = c.Offset(1, 0).Value
    c.Offset(-18, 0).Value = c.Offset(2, 0).Value
    For j = 0 To 2
      Range(OldPlayerRosterLocation).Offset(j, c.Column - 2).ClearContents
    Next
  End If
Next

c是一个范围对象(在这种情况下是一个单元格)。因此,我们使用For Each ... In代替For ... To
c.Column的列号为c。当我们减去2时,我们会将列数设置为Offset,您想要ClearContents

答案 1 :(得分:0)

使用Resize()功能

Range(OldPlayerRosterLocation).Offset(0,3).Resize(3,1).ClearContents
...
Range(OldPlayerRosterLocation).Offset(0,4).Resize(3,1).ClearContents

它需要一个单元格并创建一个跨越3行和1列的范围。也常用于快速价值转移。例如:

Range("B1").Resize(100,1).Value = Range("A1").Resize(100,1).Value

从A1复制100行到B1。对你而言,我提出了以下样式更改:

' Old Code
'Range("E42").Value = Range("E62")
'Range("E43").Value = Range("E63")

' New Code
Range("E42").Resize(2,1).Value =  Range("E62").Resize(2,1).Value