Dim objItem As Object
Любой вызов члена, сделанный для этого objItem
объекта, будет иметь позднее связывание. То есть решается во время выполнения. Это означает, что компилятор не знает, действительно ли objItem.Whatever
или нет, и ему все равно (ура, позднее связывание!). К сожалению, это также означает, что он не может вам помочь, и если вы вызываете член, который VBA не может найти в этом объекте во время выполнения, именно тогда и как возникает ошибка 438 «не удается найти этот член».
Одним из решений может быть тщательный анализ участников, которым вы звоните, в какую ветвь Case
.
Другим решением может быть переключение на раннее связывание , как только вы узнаете, какой тип вы имеете дело, и вернитесь к безопасности во время компиляции - имеется ссылка на библиотеку типов Outlook
, компилятор уже знает, какие типы Outlook.
Кроме того, Select Case objFolder.DefaultItemType
является постоянным для каждой итерации l oop, вы захотите это изменить. Используя TypeOf...Is
, вы можете проверить тип среды выполнения объекта objItem
по типам времени компиляции:
Select Case True
Case TypeOf objItem Is Outlook.ContactItem
'...
Case TypeOf objItem Is Outlook.TaskItem
'...
Case TypeOf objItem Is Outlook.AppointmentItem
'...
Case TypeOf objItem Is Outlook.MailItem
Dim currentMailItem As Outlook.MailItem
Set currentMailItem = objItem '<~ cast the object to MailItem
strKey = currentMailItem.Subject & "," & currentMailItem.Body & "," & currentMailItem.SentOn
... Я не очень знаком с объектной моделью Outlook, но похоже, что a Task
также является MailItem
, поэтому порядок предложений может быть важным (сначала проверьте более конкретные c типы, а затем более широкие всеобъемлющие типы).