我很惊讶没有什么好方法可以将Range乘以常数值。当然你可以使用一个循环,但这看起来很简单,看起来很啰嗦。您也可以使用Evaluate
语句,但信息页面对于实际操作的内容是如此模糊,所以我宁愿不这样做。这给我们留下了PasteSpecial
方法,由于某种原因迫使活跃的细胞发生变化。这很烦人,因为如果你想将activecell默认保留在你粘贴的页面上,你现在必须添加4行代码来实现它。
在:
Sub sq()
Range("A1").Copy
Sheets(2).Range("F1:F20").PasteSpecial xlPasteValues, xlPasteSpecialOperationMultiply
Application.CutCopyMode = False
End Sub
后:
Sub sq()
Sheets(1).Range("A1").Copy
Sheets(2).Activate
adr = ActiveCell.Address
Sheets(2).Range("F1:F20").PasteSpecial xlPasteValues, xlPasteSpecialOperationMultiply
Application.CutCopyMode = False
Sheets(2).Range(adr).Select
Sheets(1).Activate
End Sub
这是普遍接受的方法,只是简单地将一个范围乘以一个值,还是我不知道其他的东西?
答案 0 :(得分:1)
如果您正在寻找一个很酷的'在不使用.Select
的情况下将Paste Special,Multiply应用于一系列单元格的方法,请考虑在项目中添加UDF。
Sub sq()
Dim rMultiplier As Double
With Worksheets(1)
rMultiplier = .Range("A1").Value2
End With
With Worksheets(2).Range("F1:F20")
.Cells = udfPasteSpecialMultiply(.Cells, rMultiplier)
End With
With Worksheets(2).Range("H2:K2")
.Cells = udfPasteSpecialMultiply(.Cells, rMultiplier)
End With
End Sub
Function udfPasteSpecialMultiply(rng As Range, dMult As Double)
Dim v As Long, w As Long, vVALs As Variant
vVALs = rng.Value2
For v = LBound(vVALs, 1) To UBound(vVALs, 1)
For w = LBound(vVALs, 2) To UBound(vVALs, 2)
vVALs(v, w) = vVALs(v, w) * dMult
Next w
Next v
udfPasteSpecialMultiply = vVALs
End Function
用户定义函数返回一个修改值数组,这些修改后的数值在执行[{3}}操作的[Range.PasteSpecial方法]等效操作后填充回单元格。不会对工作表上的选择或活动单元格进行任何更改。
平心而论,你真的不应该依靠.Select
,.Activate
,ActiveCell
或Selection
来引用细胞。随着您的编码技能发展,这些细胞参考问题将变得更糟;不是更好。有关远离依赖选择和激活以实现目标的更多方法,请参阅xlPasteSpecialOperationMultiply。