Ошибка 438 означает, что вы пытаетесь вызвать несуществующий элемент, который может произойти только во время выполнения, с кодом с поздней привязкой.
Поздняя привязка? VBA не может знать, каким будет действительный тип Variant
или Object
до тех пор, пока код фактически не будет запущен - когда члены связаны во время выполнения, это называется поздняя привязка . Когда члены связаны во время компиляции, это называется раннее связывание . Вы хотите, чтобы большая часть вашего кода была связана с ранними данными, чтобы вы могли обнаружить такие ошибки во время компиляции, а не во время выполнения.
Но вы ссылаетесь на библиотеку Outlook
- у вас нет веской причины для позднего связывания чего-либо здесь.
Folder.Items
содержит много типов объектов: переменная OutlookMail
имеет очень вводящее в заблуждение имя:
For Each OutlookMail In Folder.Items
Лучшее имяможет быть folderItem
или unknownItem
- потому что мы знаем, что это что-то в папке, но мы не знаем, какой это тип объекта. Все, что мы знаем об этом, это то, что это Object
:
Dim unknownItem As Object
For Each unknownItem In Folder.Items
Теперь, если тип unknkownItem
равен Outlook.MailItem
, мы можем привести к этому интерфейсу:
Dim emailItem As Outlook.MailItem
If TypeOf unknownItem Is Outlook.MailItem Then
Set emailItem = unknownItem
И теперь каждый отдельный вызов участника, который мы делаем против emailItem
, будет проверяться во время компиляции, а не во время выполнения, потому что мы знаем , что внутри этого условного блока мысмотрите на MailItem
объект.
Sheet1.Range("eMail_sender").Offset(i, 0).Value = emailItem.SenderName
Обратите внимание, что SenderName
будет в списке имен, когда вы наберете .
точку: вот как вы знаете, что вы делаете рановызов связанного члена.
Избегайте неявного позднего связывания везде, где вы можете - это означает работу с объектными переменными, которые имеют явный объявленный тип, и избегание вызовов членов против Variant
и Object
.