宏公式的变化

时间:2015-11-02 16:21:21

标签: excel vba excel-vba

我有一个类似的Excel文件:

enter image description here

我希望看起来像这样:

enter image description here

我使用的代码是:

   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。所以我在这个网站上找到了一些帮助并改为:

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:")

如何更改类似于子DEMO()?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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