Измените это:
Set FindMO_1 = WeaMat.Find(MO, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False) 'Lookup MO in WEA MAtrix
MOnachbar = FindMO_1.Offset(, off)
' etc...
На это:
Set FindMO_1 = WeaMat.Find(MO, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False) 'Lookup MO in WEA MAtrix
If FindMO_1 Is Nothing Then
' show an error message? break-out of a loop? exit the function?
MsgBox "Find returned nothing"
Exit Sub
Else
MOnachbar = FindMO_1.Offset(, off)
' etc...
End If
Для субъективного ради удобства чтения и обслуживания я рекомендую переместить объявления ваших переменных в где они инициализируются или присваиваются, например, так:
(я изначально полагал, что VBA имеет область видимости на уровне блоков, как, например, C и Java, но сегодня я узнал, что имеет только функцию / sub -уровень, так что мое предыдущее утверждение о том, что перемещение объявлений не позволит использовать переменную вне области видимости, было неверным).
Dim FindMO_1 As Range
Set FindMO_1 = WeaMat.Find(MO, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False) 'Lookup MO in WEA MAtrix
If FindMO_1 Is Nothing Then
' show an error message? break-out of a loop? exit the function?
MsgBox "Find returned nothing"
Exit Sub
Else
MOnachbar = FindMO_1.Offset(, off)
' etc...
End If