简体   繁体   中英

Function to check string for a-z

I want to :

  • cycle down a specific column H (starting from H4 ), and
  • for each cell along that column, call a function to see if it is true (then do something ) or if it comes out false (do something else).

I'm getting runtime error ***invalid use of property*** on Call Isletter .

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 function has non optional argument (MyCell As String) so you must always pass this argument and must be string.

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

The code below

  • uses a variant array (which is much quicker than a range loop) to process each value from H4:Hx
  • uses a that can quickly check if at least one character in the string is alphabetic. If so blanks that string.

Thos line Range("H4:H" & Cells(Rows.Count, "H").End(xlUp).Row).Value2 = X writes the changed array back to the range.

code

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

The "Call isletter" shouldn't be there That part of the code should look like this instead

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

Next MyCell

Your "IsLetter" function is going to cause trouble. ASCII 127 is "delete"

Also, only ASCII 65-90 and 97 - 122 are letters. Is this supposed to include numeric and special characters?

if not, then it should look more like this

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM