VBA:基于无循环的相邻单元编辑单元值

VBA:基于无循环的相邻单元编辑单元值,vba,excel,performance,Vba,Excel,Performance,目前,我有一个代码,如果同一行的不同列中的单元格不是空的,则在单元格中放置一个x。大概是这样的: for i = 2 to lLastRow if Cells(i,1) <> "" then cells(i,2) = "x" next i i=2至lLastRow的 如果单元格(i,1)”,则单元格(i,2)=“x” 接下来我 但我有一个例子,我的数据集有上万行,而这个循环占用了很多时间。有没有一种不循环的方法可以做到这一点?试一试…………它不需要循环: Sub Kill

目前,我有一个代码,如果同一行的不同列中的单元格不是空的,则在单元格中放置一个x。大概是这样的:

for i = 2 to lLastRow
    if Cells(i,1) <> "" then cells(i,2) = "x"
next i
i=2至lLastRow的

如果单元格(i,1)”,则单元格(i,2)=“x”
接下来我

但我有一个例子,我的数据集有上万行,而这个循环占用了很多时间。有没有一种不循环的方法可以做到这一点?

试一试…………它不需要循环:

Sub Killer_V2()
    Dim rng2 As Range, rng As Range
    Dim N As Long, s As String
    Dim critCol As String, helpCol As String

    critCol = "A"
    helpCol = "B"
    N = Cells(Rows.Count, critCol).End(xlUp).Row
    Set rng = Range(Cells(1, critCol), Cells(N, critCol))
    s = "=IF(" & rng.Address & "<>"""",""x"","""")"

    Set rng2 = Range(Cells(1, helpCol), Cells(N, helpCol))
    rng2.Value = Evaluate(s)
End Sub
Sub Killer_V2()
变暗rng2作为范围,rng作为范围
尺寸N和长度一样,s和字符串一样
Dim critCol作为字符串,helpCol作为字符串
critCol=“A”
helpCol=“B”
N=单元格(Rows.Count,critCol).End(xlUp).Row
设置rng=范围(单元格(1,critCol),单元格(N,critCol))
s=“=如果(&rng.Address&>,“x”)
设置rng2=范围(单元格(1,helpCol),单元格(N,helpCol))
rng2.值=评估
端接头

使用
自动筛选



阵列方法最有可能提供最快的解决方案:

Option Explicit

Sub main()
    Dim i As Long
    Dim vals As Variant

    With Range("A2", Cells(Rows.Count, 1).End(xlUp))
        vals = .Value
        For i = 1 To UBound(vals)
            If Not IsEmpty(vals(i, 1)) Then vals(i, 1) = "x"
        Next
        .Offset(, 1).Value = vals
    End With
End Sub
而无回路解决方案可以是:

Range("A2", Cells(lLastRow,1)).SpecialCells(xlCellTypeConstants).Offset(,1) = "x"

虽然很可能是慢的

有很多好的答案,但这一个对我来说是最简单/最快的。我做的一个更改是为输出列创建第二个变量。该列中已经有数据,当我尝试按原样实现此代码时,输出中的数据被输入中的数据覆盖。因此for循环中的条件变为:
如果不是isempty(vals(i,1),那么outputVals(i,1)=“x”
供其他人参考,工作超过35000行,此操作花费了我约0.75秒。
Option Explicit

Sub main()
    Dim i As Long
    Dim vals As Variant

    With Range("A2", Cells(Rows.Count, 1).End(xlUp))
        vals = .Value
        For i = 1 To UBound(vals)
            If Not IsEmpty(vals(i, 1)) Then vals(i, 1) = "x"
        Next
        .Offset(, 1).Value = vals
    End With
End Sub
Range("A2", Cells(lLastRow,1)).SpecialCells(xlCellTypeConstants).Offset(,1) = "x"