#excel #vba #outlook
#excel #vba #outlook
Вопрос:
В настоящее время у меня настроен код для добавления назначения в Outlook, если ячейка в Excel содержит слово «Нет». Что я хотел бы иметь возможность сделать, так это удалить существующую встречу, если та же ячейка изменена на «N / A». Я попытался адаптировать для этого некоторый код, который я нашел в другом месте, но не могу заставить его работать, в настоящее время отображается «Ошибка компиляции: далее без for»
Sub DeleteCalendarItems()
Dim r As Long, i As Long, wb As Workbook
Dim ws As Worksheet
Dim objOutlook As Outlook.Application
Dim objNamespace As Outlook.Namespace
Dim objFolder As Outlook.MAPIFolder
Dim objAppointment As Outlook.AppointmentItem
Dim strSubject As String
Set objOutlook = Outlook.Application
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)
Set oItems = objFolder.Items
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Section 74")
r = ws.Cells(Rows.Count, 1).End(xlUp).Row 'Rows.Count should also have a reference to a wb amp; ws
For i = 2 To r
If ws.Cells(i, 9) = "N/A" Then
ws.Cells(i, 13) = "Yes"
Set objAppointment = oItems.Item(i)
With objAppointment
If .Subject = strSubject Then
objAppointment.Delete
End If
End With
End If
Next i
End Sub
Ответ №1:
Оператор A With
, If
and For
(и другие) всегда должен быть закрыт
Sub DeleteCalendarItems()
Dim wb As Workbook
Dim ws As Worksheet
Dim objOutlook As Outlook.Application
Dim objNamespace As Outlook.Namespace
Dim objFolder As Outlook.MAPIFolder
Dim objAppointment As Outlook.AppointmentItem
Dim strSubject As String
Set objOutlook = Outlook.Application
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)
Set oItems = objFolder.Items
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Section 74")
r = ES.Cells(Rows.Count, 1).End(xlUp).Row 'Rows.Count should also have a reference to a wb amp; ws
For i = 2 To r
If ES.Cells(i, 9).Value = "N/A" Then
Set objAppointment = oItems.Item(i)
With objAppointment
If .Subject = strSubject Then
objAppointment.Delete
End If
End With
End If
Next i
End Sub
Комментарии:
1. Спасибо, сейчас я пытаюсь настроить его так, чтобы при удалении в ячейку вводилось «Да» (код изменен выше), но я получаю «ошибка метода или данных не найдена»?
2. Вы ссылаетесь на
ES
то, что не определено. Вы также устанавливаете объектыwb
,ws
но никогда не используете их в коде. Если вы хотите сослаться наwb.Worksheets("Section 74")
, вам придется заменитьES
наws
3. Я уже установил ES в измененном коде, как указано выше, при отладке он выделяется
.AppointmentItem
вSet objAppointment = Outlook.AppointmentItem
4. Попробуйте
Set objAppointment = objOutlook.AppointmentItem
. Кроме того, все ваши заключительные инструкции перетасованы в вашем измененном коде. Я настоятельно рекомендую вам использовать правильные отступы.5. Теперь я получаю «Ожидаемую функцию или переменную» со
.Delete
стороныWith objAppointment.Delete
?
Ответ №2:
Мне удалось с этим справиться (каким-то образом) — мне нужно было добавить вложенный For
цикл
Sub DeleteNASec74()
Dim i As Long, j As Long
Dim wb As Workbook
Dim ws As Worksheet
Dim objOutlook As Outlook.Application
Dim objNamespace As Outlook.Namespace
Dim objFolder As Outlook.MAPIFolder
Dim objAppointment As Outlook.AppointmentItem
Set objOutlook = Outlook.Application
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)
Set oItems = objFolder.Items
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Section 74")
r = ws.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To r
For j = oItems.Count To 1 Step -1
If ws.Cells(i, 9).Value = "N/A" Then
ws.Cells(i, 13) = "Yes"
Set objAppointment = oItems.Item(j)
With objAppointment
If .Subject = "Send reminder email - " ws.Cells(i, 2).Value Then
objAppointment.Delete
End If
End With
End If
Next j
Next i
End Sub