函数检查string的az

我要 :

  • 沿着特定的列H (从H4开始)循环,并且
  • 对于沿着该列的每个单元格,调用一个函数来判断它是否为真(然后执行某些操作),或者是否出现错误(执行其他操作)。

我得到运行时错误***invalid use of property***Call Isletter ***invalid use of property***

 Sub IfBlank() Dim Rng As Range Dim MyCell As Range Dim Isletter As Range Set Rng = Range("H4:H" & Cells(Rows.Count, "H").End(xlUp).Row) For Each MyCell In Rng Call Isletter If Isletter(MyCell.Value) = True Then 'do nothing End If If Isletter(MyCell.Value) = False Then MyCell.Value = "-" End If Next MyCell End Sub Public Function IsLetter(MyCell As String) As Boolean Dim intPos As Integer For intPos = 1 To Len(MyCell) Select Case Asc(Mid(MyCell, intPos, 1)) Case 33 To 127 Isletter = True Case Else Isletter = False Exit For End Select Next End Function 

IsLetter函数具有非可选参数(MyCell As String)因此您必须始终传递此参数并且必须是string。

 If IsLetter(MyCell.Value) = True Then 'do something Else 'do something else End If 

下面的代码

  • 使用variables数组(比范围循环快得多)来处理来自H4:Hx的每个值
  • 使用正则expression式可以快速检查string中是否至less有一个字符是字母。 如果是这样空白的string。

Range("H4:H" & Cells(Rows.Count, "H").End(xlUp).Row).Value2 = X将更改后的数组写回范围。

 Sub IfBlank() Dim rng1 As Range Dim X Dim lngCnt As Long Dim objRegex As Object X = Range("H4:H" & Cells(Rows.Count, "H").End(xlUp).Row).Value2 Set objRegex = CreateObject("vbscript.regexp") With objRegex .IgnoreCase = True .Pattern = "[az]" For lngCnt = 1 To UBound(X) If .test(X(lngCnt, 1)) Then X(lngCnt, 1) = vbNullString Next End With Range("H4:H" & Cells(Rows.Count, "H").End(xlUp).Row).Value2 = X End Sub 

“Call isletter”不应该在那里代码的这部分应该看起来像这样

 For Each MyCell In Rng If Isletter(MyCell.Value) = True Then 'do nothing else MyCell.Value = "-" End If Next MyCell 

你的“IsLetter”function会引起麻烦。 ASCII 127是“删除”

另外,只有ASCII 65-90和97 – 122是字母。 这应该包括数字和特殊字符?

如果不是,那么它应该看起来更像这样

 Public Function IsLetter(MyCell As String) As Boolean Dim intPos As Integer For intPos = 1 To Len(MyCell) Select Case Asc(Mid(Ucase(MyCell), intPos, 1)) Case 90 To 122 Isletter = True Exit Function Case Else Isletter = False Exit For End Select Next End Function