Try incorporating this change
Dim char as String
For j = 1 To Len(s)
char = Mid(rc, j, 1)
If InStr(sCharOK, char) > 0 Then
This works....
Option Explicit
Sub Characters()
Dim cell As Range
Dim i As Long, nRow As Long
Dim char As String, sCharOK As String
Application.ScreenUpdating = False
sCharOK = "'-;!"
For Each cell In Sheet1.UsedRange.Offset(1, 0)
For i = 1 To Len(cell)
char = Mid(cell, i, 1)
If InStr(sCharOK, char) > 0 Then
With Sheet2
nRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
Sheet1.Range("A" & cell.Row & ":C" & cell.Row).Copy
.Range("A" & nRow).PasteSpecial xlPasteValues
End With
End If
Next i
Next cell
Application.ScreenUpdating = True
End Sub
Or perhaps as you are deleting blanks in sheet1 anyway no need to copy....
Option Explicit
Sub Characters()
Dim cell As Range
Dim i As Long, ii As Long, lRow As Long
Dim char As String, sCharOK As String
Dim Found As Boolean
Application.ScreenUpdating = False
sCharOK = "'-;!"
With Sheet1
lRow = .Cells(Rows.Count, "A").End(xlUp).Row
For i = lRow To 2 Step -1
Found = False
For Each cell In .Range("A" & i & ":C" & i)
For ii = 1 To Len(cell)
char = Mid(cell, ii, 1)
If InStr(sCharOK, char) > 0 Then Found = True
Next ii
Next cell
If Found = False Then Rows(i).Delete
Next i
End With
Application.ScreenUpdating = True
End Sub
Bookmarks