Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 更改列中数值的符号_Vba_Excel_Formula - Fatal编程技术网

Vba 更改列中数值的符号

Vba 更改列中数值的符号,vba,excel,formula,Vba,Excel,Formula,我在D列中有数据 D1列中有一个标题,D2列中有一个数值。我想选择D列中的所有数值(数值的数量未知)并将它们乘以-1(替换D列中的当前值)。如何通过VBA代码实现这一点 如果我可以使用Excel中的公式,我只需向下拖动公式D2*-1;但是,我需要VBA等效项。当使用100000个随机值进行测试时,以下项几乎可以立即工作: Sub MultColDbyOne() Dim i As Long, n As Long, A As Variant n = Cells(Rows.Count,

我在D列中有数据

D1列中有一个标题,D2列中有一个数值。我想选择D列中的所有数值(数值的数量未知)并将它们乘以-1(替换D列中的当前值)。如何通过VBA代码实现这一点


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

当使用100000个随机值进行测试时,以下项几乎可以立即工作:

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

sub的工作原理是首先确定D列中数据的最后一行,然后将其传输到VBA数组(这是一个只有1列的二维数组),在该数组中循环,将其中的每个数字替换为负数,然后将其传输回。这种
范围
数组
然后再回到
范围
的策略在VBA中相当常见(而且相当有效)。

当使用100000个随机值进行测试时,以下策略几乎瞬间起作用:

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

sub的工作原理是首先确定D列中数据的最后一行,然后将其传输到VBA数组(这是一个只有1列的二维数组),在该数组中循环,将其中的每个数字替换为负数,然后将其传输回。这种
范围
数组
再回到
范围
的策略在VBA中相当常见(而且相当有效)。

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

如果列D包含10000个值,则速度更快。
如果列D包含1000000个值,则此函数速度更快

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

此外,我注意到,如果列中有一些文本值,则此函数不会出错。

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

如果列D包含10000个值,则速度更快。
如果列D包含1000000个值,则此函数速度更快

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

此外,我注意到,如果列中有一些文本值,则此函数不会出错。

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

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

有趣。我承认我不完全理解它是如何工作的。你在某个单元格中输入“-1”,复制它,然后选择D列,主页>查找和选择>转到…>特别…>常数,数字。然后使用“倍增”选项粘贴。函数中的那些数字不是自解释的,这就是为什么它可能更难理解的原因。另外--我喜欢你如何安排它,使最终结果不会移动选择。有趣。我承认我不完全理解它是如何工作的。你在某个单元格中输入“-1”,复制它,然后选择D列,主页>查找和选择>转到…>特别…>常数,数字。然后使用“倍增”选项粘贴。函数中的那些数字不是自解释的,这就是为什么它可能更难理解的原因。另外--我喜欢你如何安排它,使最终结果不会移动选择。工作完美!非常感谢。工作得很好!非常感谢。