更改列中数值的符号

Changing the sign of numeric values in a column

我在 D 列中有数据。

D1栏有一个header,D2栏往下有数值。我想 select D 列中的所有数值(值的数量未知)并将它们乘以 -1(替换 D 列中的当前值)。我如何通过 VBA 代码做到这一点?

如果我可以使用Excel中的公式,我会简单地将公式D2*-1向下拖动;但是,我需要 VBA 等价物。

使用 100,000 个随机值进行测试时,以下内容几乎立即生效:

Sub MultColDbyOne()
    Dim i As Long, n As Long, A As Variant
    n = Cells(Rows.Count, "D").End(xlUp).Row
    A = Range(Cells(2, "D"), Cells(n, "D")).Value
    For i = LBound(A) To UBound(A)
        A(i, 1) = -A(i, 1)
    Next i
    Range(Cells(2, "D"), Cells(n, "D")).Value = A
End Sub

子程序的工作方式是首先确定 D 列中数据的最后一行,然后将其传输到 VBA 数组(有点烦人的是,只有 1 列的二维数组),循环通过该数组用负数替换其中的每个数字,然后将其传回。这种 Rangearray 然后回到 Range 的策略在 VBA.

中相当普遍(并且相当有效)

出于好奇,我想使用 Excel 的选择特殊单元格(数字)功能。我创建了另一个函数并针对 created by @John Coleman 测试了速度。

如果 D 列包含 10,000 个值, 更快。
如果 D 列包含 1,000,000 个值,则此函数速度更快。

Sub ChangeSignColD()
    Dim v, x As String
    Application.ScreenUpdating = 0
    x = Selection.Address
    With Cells(1, 5)
        v = .Value
        .Value = -1
        .Copy
        Columns("D:D").SpecialCells(2, 1).PasteSpecial -4163, 4
        .Value = v
    End With
    Range(x).Select
    Application.CutCopyMode = 0
End Sub

此外,我注意到如果有例如列中的一些 text 值。

我喜欢@Zygd 解决它的方式,但我建议为 -1 使用一个不干扰现有工作范围的单元格。

Sub InvertNumericSign()
    Dim LastCell As Range
    Dim SignRng  As Range

    Set LastCell = Cells.SpecialCells(xlCellTypeLastCell)
    Set SignRng = Selection

    If Not LastCell = "" Then Set LastCell = LastCell(2, 2)
    LastCell = -1
    LastCell.Copy
    SignRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply
    LastCell.ClearContents
End Sub