我有一个类似的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。所以我在这个网站上找到了一些帮助并改为:
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()?
答案 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}}声明不会继续)。