更改列中数值的符号

时间:2015-11-30 00:32:13

标签: vba excel-vba formula excel

我在D栏中有数据。

D1列中有标题,D2中有数字值。我想选择D列中的所有数值(值的数量未知)并将它们乘以-1(替换D列中的当前值)。我如何通过VBA代码执行此操作?

如果我可以在Excel中使用公式,我只需向下拖动公式D2 * -1;但是,我需要等效的VBA。

3 个答案:

答案 0 :(得分:3)

当使用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中相当常见(并且相当高效)。

答案 1 :(得分:2)

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

如果D列包含10,000个值,@John Coleman's function更快 如果列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 值。

答案 2 :(得分:1)

我喜欢@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