我反复对多列执行操作,并希望消除冗余代码。我发布了前两列的代码,因为我认为这足以证明我在做什么,但代码重复了总共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
如何简化此代码?
答案 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