Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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_Excel 2010 - Fatal编程技术网

如何检查VBA范围内单元格的值

如何检查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

我试图选取一个单元格范围(具体来说是B列),找出该范围内值小于零的单元格,并清除这些单元格的内容。有没有一种方法可以做到这一点而不必在每个单元格中循环?列是一个非常大的数据集,每周都会变长,因此循环需要大量的时间

下面是我正在使用的当前循环

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
以
端接头

不需要循环。假设我们在B1B21中有数据,比如:

这个微小的宏:

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,在我使用完它之后,它将很快被传递给其他人。因为很少手动操作是首选的,所以我正在尝试寻找一种自动化的方法来完成它。