我在D栏中有数据。
D1列中有标题,D2中有数字值。我想选择D列中的所有数值(值的数量未知)并将它们乘以-1(替换D列中的当前值)。我如何通过VBA代码执行此操作?
如果我可以在Excel中使用公式,我只需向下拖动公式D2 * -1;但是,我需要等效的VBA。
答案 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列的二维数组),循环遍历该数组,替换每个数字在它的负面,然后将其转回。这个Range
到array
然后回到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