Попробуйте работать с массивом, который был массово загружен с листа, вместо того, чтобы циклически проходить по ячейкам листа.
Вам также следует «замкнуть» ваши критерии выбора. Ваше основное сравнение заключается в том, является ли столбец P Север . Я думаю, что разумно предположить, что возможны либо 1 в 4 (N в N, S, E, W), либо 1 в 8 (N в N, NE, NW, S, SE, SW, E, W). Если вы поместите все критерии выбора в один и тот же оператор If, тогда вы будете искать SUBSTRINGx гораздо больше, чем нужно. Разбейте проверку для Север на отдельный оператор If и продолжайте проверять, только если найдено совпадение.
Option Explicit
Sub bucketup()
Dim SrchRng As Range, cel As Range
Dim searchArr As Variant, resultArr As Variant
Dim i As Long
With Worksheets(ActiveSheet.Name)
searchArr = .Range(.Cells(4, "D"), .Cells(.Rows.Count, "D").End(xlUp).Offset(0, 12)).Value2
ReDim resultArr(LBound(searchArr, 1) To UBound(searchArr, 1), 1 To 1)
For i = LBound(searchArr, 1) To UBound(searchArr, 1)
If searchArr(i, 13) = "North" Then
If InStr(1, searchArr(i, 1), "SUBSTRING®", vbTextCompare) > 0 Or _
InStr(1, searchArr(i, 1), "SUBSTRING®", vbTextCompare) > 0 Or _
InStr(1, searchArr(i, 1), "SUBSTRING®", vbTextCompare) > 0 Then
resultArr(i, 1) = 1
End If
End If
Next i
.Cells(4, "S").Resize(UBound(resultArr, 1), UBound(resultArr, 2)) = resultArr
End With
End Sub