Please, (also) test the next way. It uses standard VBA and an array to be processed. The processed array content will be dropped at the end of the code, so, it should be very fast even for large ranges. It assumes that the range to be processed starts from "A1", headers existing on the sheet first row:
Sub extractInchesNoFromAllRange()
Dim sh As Worksheet, lastR As Long, arr, i As Long
Dim dblQ As Long, sQ As Long, strIn As Long, No As String
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.rows.count).End(xlUp).row
arr = sh.Range("A2:B" & lastR).Value2
For i = 1 To UBound(arr)
dblQ = InStr(arr(i, 1), """") 'check if a double quote caracters exists and return its postition if it does
sQ = InStr(arr(i, 1), "''") 'check if two simple quote caracters exists and return its postition if it does
strIn = InStr(arr(i, 1), "in") 'the same as above for "in" string
No = "" 'reinitialize the variable to keep the extracted number (as string...)
If dblQ > 0 Or sQ > 0 Then 'if doble quote exists:
If IsNumeric(Mid(arr(i, 1), IIf(dblQ > 0, dblQ, sQ) - 1, 1)) Then 'if a number exists before the quote ch
No = Mid(arr(i, 1), IIf(dblQ > 0, dblQ, sQ) - 1, 1) 'extract first digit
arr(i, 2) = extractNo(IIf(dblQ > 0, dblQ, sQ) - 2, CStr(arr(i, 1)), No, True) 'call the function which make extraction by (backward) iteration
End If
ElseIf strIn > 0 Then 'if "in" exists:
If Mid(arr(i, 1), strIn + 2, 1) = " " Or Mid(arr(i, 1), strIn + 2, 2) = "ch" Or strIn + 1 = Len(arr(i, 1)) Then
If Mid(arr(i, 1), strIn - 1, 1) = " " Then
arr(i, 2) = extractNo(strIn - 2, CStr(arr(i, 1)), No, True)
Else
arr(i, 2) = extractNo(strIn - 1, CStr(arr(i, 1)), No, True)
End If
End If
Else
arr(i, 2) = extractNo(0, CStr(arr(i, 1)), "")
End If
Next i
'drop the processed arran content back in its range:
sh.Range("A2").Resize(UBound(arr), UBound(arr, 2)).Value2 = arr
End Sub
Function extractNo(pos As Long, str As String, No As String, Optional boolChar = False) As Variant
Dim i As Long, boolNo As Boolean
On Error GoTo WrongPatt
If boolChar Then 'if one of the searched characters has been found:
For i = pos To 1 Step -1
If IsNumeric(Mid(str, i, 1)) Or Mid(str, i, 1) = "." Then
No = CStr(Mid(str, i, 1)) & No
Else
extractNo = CDbl(No): Exit For
End If
Next i
Else 'if no searched string has been found:
For i = 1 To Len(str)
If IsNumeric(Mid(str, i, 1)) Then
boolNo = True
No = No & Mid(str, i, 1)
Else
If boolNo Then Exit For
End If
Next i
If Len(No) <= 2 And No <> "" Then
extractNo = CLng(No)
Else
extractNo = ""
End If
End If
Exit Function
WrongPatt:
extractNo = "Wrong pttern"
End Function
But the above code will process only the pattern string you show in your question. If, for instance, there will be more double quotes characters, with a different purpose **before the one having a number in front of it), the code will process only the first found. It may have problems if the searched strings are the first in the string and so on... It can be adapted to deal with more conditions, but we here are not the mind readers to cover such not shown cases...