Причина, по которой ошибка не обрабатывается, заключается в том, что два процесса не находятся в одном потоке. Если вы вызывали подпроцедуру «помощник» из основной подпроцедуры, вы остаетесь в том же потоке, и ошибки, генерируемые в «помощнике», обнаруживаются контролем ошибок в главном. Это похоже на то, почему ошибка в процедуре, запущенной Application.Run, не будет приводить к ошибкам, обработанным контролем ошибок в процедуре, которая ее запустила.
Чтобы получить какой-либо контроль над тем, что происходит в недавно открытой рабочей книге Workbook_Open, вам нужно контролировать вещи на уровне экземпляра приложения. Следующее останавливает выполнение процедуры события Workbook_Open; если нет необходимости обрабатывать код, тогда это может быть вашим решением.
Application.EnableEvents = False
Set bk = Workbooks.Open(ThisWorkbook.Path & "\bkOpenErrorTest_dict.xlsb")
Application.EnableEvents = True
Если заполнение словаря является конкретной ошибкой, которую вы пытаетесь устранить, используйте сокращенный метод словаря, который перезаписывает дубликаты.
Dim dict As Dictionary
Set dict = New Dictionary
dict.Item(0) = 0
dict.Item(0) = 1
'dict.count = 1 with key as 0 and item as 1
В более общем случае вы можете указать возможные ошибки в следующих разделах: On Error Resume Next и On Error GoTo 0.
Dim dict As Dictionary
Set dict = New Dictionary
On Error Resume Next
dict.Add 0, 0
dict.Add 0, 1
On Error GoTo 0
'dict.count = 1 with key as 0 and item as 0