macros观公式的变化

我有一个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 

它的工作原理,但如果行超过50,000将挂起Excel。 所以我在这个网站上find了一些帮助,并改为:

 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 IsNumeric(Left(r, 6)) And 0 = InStr(r, "Totals:") 

我怎样才能改变相似的子DEMO()?

如果你想更快的速度,使用这样的东西,而不是你张贴的演示代码。 这个代码也更灵活。 唯一的

 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(ISNUMBER(VALUE(LEFT(A4,6))),A4,B3)正在检查列A中的单元格。如果此单元格以四个数字开始,则返回A4的值,否则,重复上面的细胞。

你能澄清第二个问题吗? If IsNumeric(Left(r, 6))在Excel中If IsNumeric(Left(r, 6))与VBA中的公式相同。 第二部分( 0 = InStr... )正在检查单元格内是否有“总计:”。 如果不是 ,则继续使用if语句(如果您的单元格确实有“Totals:”,那么将返回1 ,并且If语句将不会继续)。