Vba 更改列中数值的符号
我在D列中有数据 D1列中有一个标题,D2列中有一个数值。我想选择D列中的所有数值(数值的数量未知)并将它们乘以-1(替换D列中的当前值)。如何通过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,
如果我可以使用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列,主页>查找和选择>转到…>特别…>常数,数字。然后使用“倍增”选项粘贴。函数中的那些数字不是自解释的,这就是为什么它可能更难理解的原因。另外--我喜欢你如何安排它,使最终结果不会移动选择。工作完美!非常感谢。工作得很好!非常感谢。