检查字符串是否包含a-z的函数

4

我想要:

  • 循环遍历一个特定的列 H(从 H4 开始),并且
  • 针对该列中的每个单元格,调用一个函数来查看它是否为真(然后执行某些操作),或者如果返回值为假(则执行其他操作)。

我在 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而不是Isletter2。 - James
请编辑您的帖子,人们可能不会阅读评论;-) 还有一个拼写错误,Fasle 应更正为 False - Mathieu Guindon
问题到底是什么?你遇到了具体的错误吗?在哪一行?请详细说明你的问题。 - Mathieu Guindon
请告诉我这是否对你有所帮助。 - James
MyCell是字符串还是范围?它不能同时用作两者。将IsLetter中的代码放入IfBlank中进行测试可能更容易,而不是调用它。您想要测试MyCell.Value吗? - justkrys
删除Call Isletter这一行,因为该函数已在if语句中调用,不再需要。 - Scott Craner
3个回答

2
以下代码:
  • 使用变体数组(比范围循环快得多)处理H4:Hx中的每个值
  • 使用,可以快速检查字符串中是否有至少一个字母字符。如果是,则将该字符串留空。
此行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 = "[a-z]"

         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

1

IsLetter函数有一个非可选参数(MyCell As String),因此您必须始终传递该参数,并且必须是字符串。

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

1
这确实帮助我解决了函数问题。谢谢。 - James

1
“Call isletter” 不应该在这里出现,代码的这部分应该改为:

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

Next MyCell

你的“IsLetter”函数可能会引起问题。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

谢谢Richard,我确实想包括数字和特殊字符,但代码似乎在验证为真后仍然循环遍历每个字符而不停止。例如(Microsoft Excel)代码读取Microsoft,但一旦读取“SPACE”,它就返回FALSE代码并输入“-”。我希望它只读取“M”然后停止并移动到下一个单元格。 - James
我需要的是 65 到 90,97 到 122 这个范围内的内容,问题在于,无论单元格是否有一堆空格和一个字母,我都希望代码能够在遇到这个范围中的任何部分时停止。它应该返回 true。 - James
James,我编辑了我的答案,给你想要的东西。你只需要在代码中添加“Exit Function”行,它就会跳出循环。 - user5889203
非常感谢,这对我有用。我想知道如果我没有If语句怎么办?你怎么让函数Isletter工作? - James
对于每个单元格在范围内 如果是字母下一个单元格 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接