更改列中数值的符号
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 列的二维数组),循环通过该数组用负数替换其中的每个数字,然后将其传回。这种 Range
到 array
然后回到 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
我在 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 列的二维数组),循环通过该数组用负数替换其中的每个数字,然后将其传回。这种 Range
到 array
然后回到 Range
的策略在 VBA.
出于好奇,我想使用 Excel 的选择特殊单元格(数字)功能。我创建了另一个函数并针对
如果 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