Vba 宏观公式的变化

Vba 宏观公式的变化,vba,excel,Vba,Excel,我有一个Excel文件,看起来像: 我想让它看起来像这样: 我使用的代码是: Sub FindString() Dim A As Range, r As Range, last As Range Set A = Intersect(ActiveSheet.UsedRange, Range("A:A")) For Each r In A If IsNumeric(Left(r, 6)) Then Set last = r If Not la

我有一个Excel文件,看起来像:

我想让它看起来像这样:

我使用的代码是:

   Sub FindString()
   Dim A As Range, r As Range, last As Range
   Set A = Intersect(ActiveSheet.UsedRange, Range("A:A"))

   For Each r In A
       If IsNumeric(Left(r, 6)) Then Set last = r
       If Not last Is Nothing Then last.Copy r.Offset(0, 1)
  Next r
 End Sub
它可以工作,但如果行数超过50000,则将挂起Excel。因此,我在该网站上找到了一些帮助,并改为:

Sub Demo()
Dim r As Range

With ActiveSheet
    Set r = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

r.Offset(0, 1).Formula = "=IF(ISNUMBER(VALUE(LEFT(A4,6))),A4,B3)"
r.Offset(0, 1) = r.Offset(0, 1).Value

End Sub
现在的问题是我不明白这一点:

"=IF(ISNUMBER(VALUE(LEFT(A4,6))),A4,B3)"  
在公式中,如果在当前公式中,如果我更改为if条件:

  If IsNumeric(Left(r, 6)) And 0 = InStr(r, "Totals:")
如何更改类似于子演示()的值?

=IF(ISNUMBER(VALUE(LEFT(A4,6))),A4,B3)
正在检查列A中的单元格。如果此单元格以四个数字开头,则返回
A4
中的值,否则,重复上面单元格中的数据


你能澄清第二个问题吗<代码>如果是数字(左(r,6))在VBA中与Excel中的公式相同。第二部分(
0=InStr…
)检查单元格内是否有“Totals:”。如果没有,则继续执行If语句(如果您的单元格中确实有“Totals:”,则将返回
1
,而
If
语句将不会继续)。

如果您想要更快的速度,请使用类似的代码,而不是您发布的演示代码。这段代码也更加灵活。唯一的

Sub Demo2()
    Application.ScreenUpdating = False
    Dim A() As Variant
    A = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value2
    Dim B() As Variant
    ReDim B(1 To UBound(A), 1 To 1)
    Dim ID As String
    For i = 1 To UBound(A)
        If IsNumeric(Left(A(i, 1), 1)) Then
            ID = A(i, 1)
            'If you want to use a dynamic equation, use the below line instead
            'ID = "=A" & i
        End If
        B(i, 1) = ID
    Next
    Range("B1:B" & UBound(B)) = B
End Sub

一个循环怎么会比一个带有块的
快呢?非常感谢我把它改成了If-IsNumeric(左(a(I,1),6))和InStr(a(I,1),“Totals:”<1,并给了我完美的答案result@MacroMan实际上,我没有仔细看演示代码。当我看到它正在使用公式进行计算时,我认为它的性能很差。再看一遍之后,我意识到它的性能会比我最初想象的更好。出于好奇,我对1000000行进行了测试。结果分别是3720ms和1940ms,Demo和Demo2。因此,Demo2将性能提高了约48%。有趣的是;然而,通过删除
r.Offset(0,1)=r.Offset(0,1)。Value
Demo达到了1900-2000 ms左右的速度,这可能是最快的方法,但会留下活动的计算器。@MacroMan因此,从所有意图和目的来看,它们的性能都差不多。Demo对公式的使用实际上相当有效,但是,重新分配静态值的需要使其总体速度稍慢。撇开性能不谈,演示代码既漂亮又简洁,但出于同样的原因,它的灵活性也较低。IMHO,Demo2使用了一种更好的编程模式。a列中有两种值,它们类似于“002323 SomeCompany name”和“002323 Totals:”,因为上面带IsNumeric(左(r,6))的公式正在查找前6个数值的所有值,这将给出一个错误,这就是为什么我编辑了like If IsNumeric(左(r,6))0=InStr(r,“Totals:”),因此它将忽略其中包含单词Total:的所有行。若在第一段代码中添加0=InStr(r,“Totals:”)将给出正确的结果,但我希望在Demo()中进行相同的更改,因为它执行得很快