Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 След.
Как в VBA установить условие при обработке писем в outlook, чтобы игнорировать сообщения календаря, ошибка Type mismatch
 
В общем "кустарное", обходное решение, убираем объявление типа mi, и проверяем тип объекта в цикле. Таким образом проскакиваем события календаря и задачи.
Была еще мысль через For Each mi In myFolder.Items.Restrict("[Unread]='TRUE' And [TypeName]='MailItem'"), но такое условие не пропускает.


Код
Private Sub Application_NewMail()
 
Dim myFolder As Outlook.MAPIFolder
Dim mi
DestFolder = "D:\путь к папке\"
Set myFolder = Outlook.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
 
For Each mi In myFolder.Items.Restrict("[Unread]=TRUE")
    If mi.Class = olMail Then
        If mi.Attachments.Count > 0 Then
            For j = 1 To mi.Attachments.Count
                If InStr(1, mi.Attachments.Item(j).FileName, "Имя файла", vbTextCompare) > 0 And _
                InStr(1, mi.Attachments.Item(j).FileName, Date, vbTextCompare) > 0 Then
                    If Len(Dir(DestFolder & "файлы " & Date, vbDirectory)) = 0 Then
                        MkDir DestFolder & "файлы " & Date
                    End If
                    Debug.Print (DestFolder & mi.Attachments.Item(j).DisplayName)
                    mi.Attachments.Item(j).SaveAsFile DestFolder & "файлы " & Date & "\" & mi.Attachments.Item(j).FileName
                    mi.UnRead = False
                End If
            Next j
        End If
    End If
Next mi
End Sub
Изменено: Baot - 30.09.2020 06:49:55
Как в VBA установить условие при обработке писем в outlook, чтобы игнорировать сообщения календаря, ошибка Type mismatch
 
doober, Спасибо! код работает корректно, но к сожалению мой подход с ошибкой вопроса не решил, ошибка вылетает на обращении к следующему элементу next mi, и до отсеивания по типу элемента не доходит.
Как в VBA установить условие при обработке писем в outlook, чтобы игнорировать сообщения календаря, ошибка Type mismatch
 
Добрый день! Подскажите, использую код VBA для сохранения файлов с отчетами, соответствующих определенной маске. Все работает, но есть одна проблема, через outlook создают различные встречи и собрания, и когда такое сообщение приходит в почту, код выдает ошибку, Run-time error '13': Type mismatch. Я так понимаю, что ошибка в связи с тем, что сообщение от календаря не является письмом, а код пытается его обработать. Как-то можно добавить условие, чтобы он такие сообщения игнорировал?

Код
Private Sub Application_NewMail()

Dim myFolder As Outlook.MAPIFolder
Dim mi As MailItem
DestFolder = "D:\путь к папке\"
Set myFolder = Outlook.Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

For Each mi In myFolder.Items.Restrict("[Unread]=TRUE")
    If mi.Class = olMail Then
        If mi.Attachments.Count > 0 Then
            For j = 1 To mi.Attachments.Count
                If InStr(1, mi.Attachments.Item(j).FileName, "Имя файла", vbTextCompare) > 0 And _
                InStr(1, mi.Attachments.Item(j).FileName, Date, vbTextCompare) > 0 Then
                    If Len(Dir(DestFolder & "файлы " & Date, vbDirectory)) = 0 Then
                        MkDir DestFolder & "файлы " & Date
                    End If
                    Debug.Print (DestFolder & mi.Attachments.Item(j).DisplayName)
                    mi.Attachments.Item(j).SaveAsFile DestFolder & "файлы " & Date & "\" & mi.Attachments.Item(j).FileName
                    mi.UnRead = False
                End If
            Next j
        End If
    End If
Next mi

End Sub
Изменено: Baot - 29.09.2020 13:48:21
Вызов макроса outlook из кода в excel
 
Добрый день! Так не получится, поскольку это не вызов макроса сохраненного в outlook, а использование объекта mail из excel. Такой макрос и был изначально, но его блокирует настройка безопасности ms office (которые не согласовали изменить по политике безопасности организации). Я перенес отправку в сам outlook и там блокирования нет. Но нужно связать теперь два макроса расчеты и формирования файла в excel и непосредственно отправка в outlook.
Вызов макроса outlook из кода в excel
 
Добрый день! Поскольку ограничения политики безопасности в организации обойти не удалось, массовая рассылка из макроса VBA в excel недоступна. Я проверил код отправки письма в outlook, и он спокойно работает без всяких ограничений на адресатов. Но... но тут я столкнулся с другой проблемой, вся обработка и создание файла производится в excel в цикле, соответственно каждый цикл должен завершаться отправкой письма, но макрос по отправке письма, если он в outlook не получается вызвать...
В интернете я нашел обсуждение аж от 2008 года, где предлагается такой вариант:
Код
Public Sub macroinOutlook()
    Dim olookApp As Object
    Set olookApp = CreateObject("Outlook.Application")
    
    olookApp.SendMail
    
    Set olookApp = Nothing
End Sub


Но данный недокументированный метод вызывает ошибку 438.
Покопавшись еще нашел другое мнение:
As far as I can tell, it's not possible to run macros that are stored in Outlook from other applications. Outlook lacks the Application.Run method that is available in Word and Excel.
То есть вызвать макрос, который написан в outlook невозможно?
Изменено: Baot - 13.07.2020 13:22:14
Запрет на отправку писем из VBA
 
БМВ, В эти переменные передаются почты сотрудника и руководителя в формате строковой переменной "xxxx@company.ru". по одной почте. то есть один сотрудник, один руководитель.
Запрет на отправку писем из VBA
 
Цитата
Dyroff написал:
Попробуйте что-нибудь поменять в коде еще раз, возможно перестанет предупреждение "вылазить"
Как я и думал, "что-то" повлиявшее на появление сообщения - это адресат. Когда я тестировал макрос, я не вставлял адресатов, чтобы не спамить на сотрудников, ставилась только скрытая копия на меня. И сообщения уходили без предупреждений. Когда же я добавил в макрос адресатов, стало появляться сообщение с запретом.  код не приводил, поскольку думал, что есть решение, не связанное с кодом, ведь это не он влияет на появление сообщения, а политика безопасности. Рассчитывал, что есть обходное решение.
Код
Sub Mail_Notification()
    Dim objOutlookApp As Object, objMail As Object
    Dim sToHiddenCopy As String, sSubject As String
    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = GetObject(, "Outlook.Application")
    Err.Clear
    If objOutlookApp Is Nothing Then
        Set objOutlookApp = CreateObject("Outlook.Application")
    End If
    objOutlookApp.Session.Logon
    Set objMail = objOutlookApp.CreateItem(0)
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
 
    sTo = "здесь почта сотрудника полученная из массива по его имени, передается через глобальную переменную."
    sToCopy = "здесь почта его руководителя"
    sToHiddenCopy = "здесь моя почта"
    sSubject = "Уведомление о сроках"
    With objMail
        .to = sTo
        .CC = sToCopy
        .BCC = sToHiddenCopy
        .Subject = sSubject
        .Body = sBody
        If Dir(sAttachment, 16) <> "" Then
            .Attachments.Add sAttachment
        End If
        .Send
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Изменено: Baot - 28.05.2020 16:54:20
Запрет на отправку писем из VBA
 
Добрый день! При попытке делать рассылку на сотрудников из файла EXCEL макросом сначала, все отправлялось, потом я немного исправил код, и не знаю, что именно повлияло, но вдруг стало вылазить предупреждение об отправке, где нужно разрешать такую отправку.
Интернет дает два способа решения этой проблемы:1 - отключение параметров безопасности, я проверил, у нас на работе они заблокированы, видимо такая политика безопасности. 2 -  также пишут, что решает проблему отправка через CDO, поискал как это делается, и там нужно указать сервер, а также логин и пароль учетки, за что мне тоже может достаться от нашей службы безопасности.
Вопрос, может еще есть какой-нибудь третий вариант?
Может если макрос подписать сертификатом, поможет ли это?
Удалить переносы строк в конце предложения
 
Пытливый, спасибо большое, работает!
Удалить переносы строк в конце предложения
 
Сергей, Ваш вариант первый хорошо отработал.
Удалить переносы строк в конце предложения
 
Цитата
Если хотите на месте, то макросом.
Да, нужно на месте. Автоподбор высоты у меня делает макрос, поэтому удобнее было бы добавить к макросу еще код, но вот какой.
Удалить переносы строк в конце предложения
 
Добрый день! Наши сотрудники часто присылают файлики, где в ячейках в конце после текста куча переносов строк, пример прилагаю. Дело в том, что у меня делается автоподбор высоты, и приходится постоянно перепроверять каждый листик, поскольку руководство не любит когда "некрасиво". Иначе высота строки подбирается неверно.
Как можно удалить эти переносы? Вопрос в удалении переносов именно в конце текста. В интернете в основном варианты по сплошному удалению всех переносов в ячейке.
Перемещение кодом к нужной ячейке (визуально)
 
Добрый день, уважаемые форумчане. Постом ранее я писал, что в принципе причина обнаружена, и все заработало. Но вот визуально, все стало печально, во-первых перед глазами скачет картинка, перемещаясь в конец каждого листа, во-вторых, стало работать медленнее и подзависать. Может есть способы смещения экрана к последней ячейке, но без отражения до окончания макроса?
Перемещение кодом к нужной ячейке (визуально)
 
Нет, фишка была в том, что именно Select не выделял последнюю ячейку. Точнее выделял, но визуально не перемещался. Я что-то затупил, так легко было проверить, просто включив обновление экрана. И  как оказалось, действительно, в такой ситуации экран стал перемещаться к последней ячейке.
Перемещение кодом к нужной ячейке (визуально)
 
Добрый день!
Нужно добиться следующего эффекта: код обрабатывает множество листов, на каждом листе табличка.
После выполнения кода, при открытии любого из обработанных листов мы должны увидеть нижний, правый угол таблицы. То есть переместиться в ее конец.
Я думал, что достаточно методом Select выбрать правую нижнюю ячейку, но это не помогло. Ячейка выделятся, но когда открываешь лист, видишь верхнюю левую часть листа (ну или любую другую, где сохранил пользователь).
Нашел решение через GoTo, но оно визуально тоже не перемещает в нужное место. Может ли это быть связано, с тем что выключено обновление экрана на протяжении всего макроса?
Обращение к диапазону, object required
 
Добрый день! подскажите пожалуйста, почему недопустима такая запись?
Код
ThisWorkbook.Worksheets(1).Range(Cells(2, 1), Cells(2, 10)).ClearContents

Выдает ошибку object required.
А через передачу диапазона в переменную, и потом применение к переменной ClearContents работает...просто хотелось бы избежать лишних строчек.
Сослаться на лист в VBA
 
БМВ, Спасибо большое! работает... то есть моя ошибка, что я прописывал книгу перед листом, а ссылаться нужно сразу на лист? потому что лист и так уже определен, и понятно в какой он книге?
Сослаться на лист в VBA
 
Добрый день!

Я в коде хотел получить более компактную запись ссылаясь на лист не по прямому наименованию, а подстановкой ссылки на лист, приведу пример:
Код
For Each wsBaseSheet In wbAct.Worksheets 'цикл по всем листам в открытой книге
            sSheetNameBase = wsBaseSheet.Name ' присваиваем строковой переменной имя листа из открытой книги
            If sSheetNameBase = sSheetName Then 'сравниваем имя листа в книге и имя листа в массиве
                For b = 1 To arrCol(a) 
                    lRow1 = wbAct.wsBaseSheet.Cells(Rows.Count, b).End(xlUp).Row 

Но такой код выдает ошибку, нашел на форумах подход, что лист нужно определить через SET

Попробовал так:

Код
For Each wsBaseSheet In wbAct.Worksheets 'цикл по всем листам в открытой книге
            sSheetNameBase = wsBaseSheet.Name ' присваиваем строковой переменной имя листа из открытой книги
            Set wsWsheet = wbAct.Worksheets(" & sSheetNameBase & ") 
            If sSheetNameBase = sSheetName Then 'сравниваем имя листа в книге и имя листа в массиве
                For b = 1 To arrCol(a) 
                    lRow1 = wbAct.wsWsheet .Cells(Rows.Count, b).End(xlUp).Row 

Но тоже выдает ошибку.. как корректно можно сослаться на лист, если лист у нас определяется перебором переменной в цикле, т.е. я не могу сослаться на конкретный лист, или это невозможно?

Сравнение двух значений, If a.Value = b.Value Then
 
Спасибо!
Сравнение двух значений, If a.Value = b.Value Then
 
Добрый день! Я тут заметил, что когда делаю сравнение двух значений
по типу If a.Value = b.Value Then, то у меня сравнение идет с учетом регистра, т.е. а001аа не равно А001АА, этого как можно избежать?
Не работает метод Union
 
Большое спасибо!
Не работает метод Union
 
Добрый день! Мне нужно работать с несмежными диапазонами, гистограммы нужно добавить, только в столбы с значениями ( в примере это F и I). Но как передать несмежные диапазоны в range? Метод Union выдает ошибку. Пример прилагаю. Спасибо всем откликнувшимся.
Добавить комментарий в измененную макросом ячейку
 
Спасибо!
Добавить комментарий в измененную макросом ячейку
 
Да календарь там и сейчас есть...сделал пример без календаря
Добавить комментарий в измененную макросом ячейку
 
Добрый день! Попытался позаимствовать идею с этого сайта, по внесению в комментарии к ячейки ФИО изменяющего а также предыдущего значения до изменения.
Но почему-то выдает ошибку. Я позаимствовал только часть идеи, но как казалось вполне самостоятельную (часть где вносится коммент), в примере мониторятся изменения на листе (эту часть я не брал), и в случае их наличия добавляется комментарий, в моем же случае мне нужно по внесению данных в ячейки с пользовательской формы, прописать кто инициировал собственно это внесение данных... Подскажите в чем проблема? в данном примере я ссылаюсь на cell хотя вообще нужно на cell.offset( ,1). Но раз даже с cell не получается...
Определить нужную строку по последнему значению, Использование словаря, чтобы при задвоении определить из какой строки брать данные
 
Пардон, ошибка, упрощал пример убирал все названия
Определить нужную строку по последнему значению, Использование словаря, чтобы при задвоении определить из какой строки брать данные
 
Добрый день! Реализовал подтягивание данных на форму путем заполнения combobox1 и сравнения с диапазоном ключевых значений, и соответственно отбором других соответствующих значений из таблицы. Но, к сожалению, было обнаружено, что ключевые номера могут повторятся. Пришлось менять подход. Но не получается. Цель такая, что если номер повторяется два раза, то мы смотрим по столбцам(вправо) где последнее заполненное значение, и берем данные на форму из той строки. Я вот только понять не могу, сначала нужно пройтись словарем по всем строкам а потом запускать цикл проверки совпадения? либо можно это делать сразу в словаре?  
Не получается использовать метод AddItem в combobox пишет, Выдает ошибку данный метод не поддерживается
 
Всем спасибо большое! Понял свои ошибки)
Не получается использовать метод AddItem в combobox пишет, Выдает ошибку данный метод не поддерживается
 
Пример во вложении, файл запинается, когда пытаюсь в combobox передать значение ключа.. пытался передавать туда даже просто текстовую строку, все равно не получается, пишет, что данное свойство или метод не поддерживается.. почему?
Раньше писал что запрещен доступ, но после добавления обращения к коллекции controls ошибка изменилась...

Код позаимствован у Nordheim)
Код
Public Sub UserForm_Initialize()
Dim dic As Object, cell As Range
Dim arrList(), ikey
Dim lLastrow As Long
TextBox1.Value = Format(Date, "dd.mm.yyyy")
TextBox2.Value = Format(Date, "dd.mm.yyyy")
TextBox3.Value = Format("08:00", "hh:mm")
TextBox4.Value = Format("20:00", "hh:mm")
arrRow = Array(2, 3, 11)
For Each e In arrRow
lLastrow = ActiveSheet.Cells(Rows.Count, e).End(xlUp).Row
Set rList = ActiveSheet.Range(Cells(3, e), Cells(lLastrow, e))
Set dic = CreateObject("Scripting.Dictionary")
    For Each cell In rList
        If cell.Value <> "" Then
            If dic.exists(CStr(cell.Value)) Then dic.Item(CStr(cell.Value)) = CStr(cell.Value) Else _
            dic.Item(CStr(cell.Value)) = CStr(cell.Value)
        End If
    Next cell
For Each ikey In dic.Keys
        Me.Controls.ComboBox2.AddItem ikey
Next ikey
Next e
End Sub
Записать нужные столбцы в массив без задвоений.
 
Nordheim, В данном случае хотелось бы работать через массивы, и не пользоваться словарями. Но спасибо за идеи, возможно пригодится в другом вопросе.

SAS888, Да, прокрутил ваш код, делает то, что нужно. Сложновато воспринимать для новичка конечно) Побаиваюсь использовать Go to но здесь оно как раз решает задачу. Спасибо.
Страницы: 1 2 3 След.
Наверх