如何检查VBA范围内单元格的值
我试图选取一个单元格范围(具体来说是B列),找出该范围内值小于零的单元格,并清除这些单元格的内容。有没有一种方法可以做到这一点而不必在每个单元格中循环?列是一个非常大的数据集,每周都会变长,因此循环需要大量的时间 下面是我正在使用的当前循环如何检查VBA范围内单元格的值,vba,excel,excel-2010,Vba,Excel,Excel 2010,我试图选取一个单元格范围(具体来说是B列),找出该范围内值小于零的单元格,并清除这些单元格的内容。有没有一种方法可以做到这一点而不必在每个单元格中循环?列是一个非常大的数据集,每周都会变长,因此循环需要大量的时间 下面是我正在使用的当前循环 Dim sht As Worksheet Dim LastColumn As Long Set sht = ThisWorkbook.Worksheets("Sheet1") lastrow = sht.Cells.Find("*", SearchOrder
Dim sht As Worksheet
Dim LastColumn As Long
Set sht = ThisWorkbook.Worksheets("Sheet1")
lastrow = sht.Cells.Find("*", SearchOrder:=xlByRows,
searchdirection:=xlPrevious).Row
for i=1 to lastrow
if sheets("time").cells(i, "B") then
sheets("time").cells(i, "B").clear
end if
next i
我试图检查并可能删除的单元格包含公式
编辑:标记为已接受的答案加快了过程,但仍需要循环。如果有任何人有比发布的内容更快的内容,请随意添加。根据我的评论。我在5万行上运行这个,只花了很少的时间
Option Explicit
Sub update_column()
Dim Column_to_run_on As String
Dim LR As Long, i As Long
Dim arr As Variant
'change as needed
Column_to_run_on = "D"
'change sheet as needed
With Sheets("Sheet1")
LR = .Range(Column_to_run_on & "1048575").End(xlUp).Row
'"2:" here as I assume you have a header row so need to start from row 2
arr = .Range(Column_to_run_on & "2:" & Column_to_run_on & LR)
For i = 1 To UBound(arr, 1)
If arr(i, 1) < 0 Then
arr(i, 1) = 0
End If
Next
.Range(Column_to_run_on & "2:" & Column_to_run_on & LR).Value = arr
End With
End Sub
选项显式
子更新_列()
Dim列\u到\u作为字符串运行\u
暗淡的LR一样长,我一样长
作为变体的Dim-arr
"随需应变"
列到运行
'根据需要更改工作表
附页(“第1页”)
LR=.Range(列到运行于&“1048575”).End(xlUp).Row
“'2:”这里我假设您有一个标题行,所以需要从第2行开始
arr=.Range(列到运行列和“2:”&列到运行列和LR)
对于i=1至UBound(arr,1)
如果arr(i,1)<0,则
arr(i,1)=0
如果结束
下一个
.Range(列\u到\u运行\u on和“2:”&列\u到\u运行\u on和LR)。Value=arr
以
端接头
不需要循环。假设我们在B1到B21中有数据,比如:
这个微小的宏:
Sub RemoveNegs()
With Range("B1:B21")
.Value = Evaluate("IF(" & .Address & " < 0,""""," & .Address & ")")
End With
End Sub
子删除()
范围(“B1:B21”)
.Value=Evaluate(“如果(“&.Address&”<0,”,“&.Address&”)
以
端接头
将产生:
如果单元格中包含公式,则不适用。我使用vba数组对两种解决方案进行了LOPP测试,在每种情况下,循环速度至少快2到5倍:
Option Explicit
Sub fill()
Dim t As Double
t = Timer
Dim x&
Dim y&
Dim arr()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
ReDim arr(1 To 2000, 1 To 1000)
For x = 1 To 1000
For y = 1 To 2000
arr(y, x) = Rnd() * 1111 - 555
Next y
Next x
Range(Cells(1, 1), Cells(2000, 1000)).Value2 = arr
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
Debug.Print Timer - t
End With
Erase arr
End Sub
Sub nega()
Dim t As Double
t = Timer
Dim x&
Dim y&
Dim arr()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
'With Range("A1", Cells(2000, 1000))
' .Value2 = Evaluate("if(" & .Address & " <0,""""," & .Address & ")")
'End With
'Range(Cells(1, 1), Cells(2000, 1000)).Replace "-*", ""
arr = Range(Cells(1, 1), Cells(2000, 1000)).Value2
For x = 1 To 1000
For y = 1 To 2000
If arr(y, x) < 0 Then arr(y, x) = vbNullString
Next y
Next x
Range(Cells(1, 1), Cells(2000, 1000)).Value2 = arr
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
Erase arr
Debug.Print Timer - t
End Sub
选项显式
次填料()
调暗t为双色
t=计时器
暗x&
暗淡的&
Dim-arr()
应用
.ScreenUpdate=False
.EnableEvents=False
.Calculation=xlCalculationManual
ReDim arr(1到2000,1到1000)
对于x=1到1000
对于y=1到2000
arr(y,x)=Rnd()*1111-555
下一个y
下一个x
范围(单元格(1,1),单元格(2000,1000))。值2=arr
.ScreenUpdate=True
.Calculation=xlcalculation自动
.EnableEvents=True
打印计时器-t
以
擦除arr
端接头
次国家()
调暗t为双色
t=计时器
暗x&
暗淡的&
Dim-arr()
应用
.ScreenUpdate=False
.EnableEvents=False
.Calculation=xlCalculationManual
'带范围(“A1”,单元格(2000,1000))
'.Value2=Evaluate(“如果(“&.Address&”)可以将数据读入数组,然后将任何小于零的值更改为null(或“”)然后重新输出列。可能需要不到1秒的时间来运行此问题。我不认为循环不是您的最佳选择。我知道您使用VBA
标记,但您也可以在单元格上放置一个过滤器,过滤掉所有正值,然后清除剩余的可见cells@BruceWayne我考虑过这一点,但是我每周更新一次工作簿,并且已经有了一些VBA,在我使用完它之后,它将很快被传递给其他人。因为很少手动操作是首选的,所以我正在尝试寻找一种自动化的方法来完成它。