为什么`PasteSpecial`方法强制activecell改变?

时间:2015-09-24 20:35:59

标签: vba

我很惊讶没有什么好方法可以将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

这是普遍接受的方法,只是简单地将一个范围乘以一个值,还是我不知道其他的东西?

1 个答案:

答案 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.ActivateActiveCellSelection来引用细胞。随着您的编码技能发展,这些细胞参考问题将变得更糟;不是更好。有关远离依赖选择和激活以实现目标的更多方法,请参阅xlPasteSpecialOperationMultiply