对象“范围”的方法“值”失败

下面的VBA代码片段试图在大约80k行的excel列上使用简单的If语句。 出现以下错误。

运行时错误'-2147417848(80010108)':对象'范围'的方法'值'失败

这里怎么了?

Dim r As Long Dim lastrow As Long lastrow = Range("A" & Rows.Count).End(xlUp).Row For r = 2 To lastrow If InStr(Range("I" & r).Text, "WH") Then Range("Z" & r).Value = "O" ElseIf InStr(Range("I" & r).Text, "MOD") Then Range("Z" & r).Value = "M" ElseIf InStr(Range("I" & r).Text, "VER") Then Range("Z" & r).Value = "V" ElseIf InStr(Range("I" & r).Text, "WT") Then Range("Z" & r).Value = "WT" ElseIf InStr(Range("E" & r).Text, "OIL") Then Range("Z" & r).Value = "OIL" Else: Range("Z" & r).Value = "N" End If Next r 

VBA环境不能避免不稳定。 如果你有多个崩溃,保存你的工作,并重新启动你的机器(冷启动)。

这就是说,这些例程中的每一个都运行在不到半秒的时间,而不是你原来通过80K单元所花的27秒。

 Sub oilWT2() Dim r As Long, vVALs As Variant Debug.Print Timer With Worksheets("Sheet5") vVALs = .Range(.Cells(2, "I"), .Cells(rows.Count, "A").End(xlUp).Offset(0, 8)).Value2 For r = LBound(vVALs, 1) To UBound(vVALs, 1) Select Case UCase(vVALs(r, 1)) Case "WH" vVALs(r, 1) = "O" Case "MOD", "VER" vVALs(r, 1) = Right(vVALs(r, 1), 1) Case "WT", "OIL" 'do nothing - value already correct Case Else vVALs(r, 1) = "N" End Select Next r .Cells(2, "Z").Resize(UBound(vVALs, 1), 1) = vVALs End With Debug.Print Timer End Sub Sub oilWT3() Dim r As Long, vVALs As Variant Debug.Print Timer With Worksheets("Sheet5") vVALs = .Range(.Cells(2, "I"), .Cells(rows.Count, "A").End(xlUp).Offset(0, 8)).Value2 For r = LBound(vVALs, 1) To UBound(vVALs, 1) Select Case True Case CBool(InStr(1, vVALs(r, 1), "WH", vbTextCompare)) vVALs(r, 1) = "O" Case CBool(InStr(1, vVALs(r, 1), "MOD", vbTextCompare)) Or _ CBool(InStr(1, vVALs(r, 1), "VER", vbTextCompare)) vVALs(r, 1) = Right(vVALs(r, 1), 1) Case CBool(InStr(1, vVALs(r, 1), "WT", vbTextCompare)) vVALs(r, 1) = "WT" Case CBool(InStr(1, vVALs(r, 1), "OIL", vbTextCompare)) vVALs(r, 1) = "OIL" Case Else vVALs(r, 1) = "N" End Select Next r .Cells(2, "Z").Resize(UBound(vVALs, 1), 1) = vVALs End With Debug.Print Timer End Sub 

前者只是看整个单元格的内容; 后者使用InStr函数来search原始string中的string。 通过重用variables数组来存储新的值,它使得条件语句比单元格单元读取更有效。 这些值同样返回到Z列。