Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Отправка письма прекращает работу Excel - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 212»
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Отправка письма прекращает работу Excel (Макросы/Sub)
Отправка письма прекращает работу Excel
pabchek Дата: Среда, 25.05.2016, 11:06 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте, все!
В конце макроса вызываю окно почты (у меня Outlook)
[vba]
Код
    Application.Dialogs(xlDialogSendMail).Show
[/vba]
Если отправить письмо сразу, то Excel вылетает. Если подождать несколько секунд (3-7) - все норм.
Outlook в других ошибках не замечен, MS офис лицензионный обновленный.
Этот феномен существует в нескольких файлах с разными макросами. Объединяет их только вызов окна почты.
Предполагаю, что проблема лечится задержкой выполнения, вроде Application.Wait (правда, еще не пробовал).
Однако, если делать задержку стандартную, то придется ждать это время и тогда, когда не нужно. А если сделать задержку маленькой, то вылетать все равно будет, хоть и не так часто.
Может кто-нибудь подсказать решение проблемы?

Образец файла не прикладываю: большой, по коммерческим соображениям; а в обрезанном этой проблемы нет, как ни старался.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеЗдравствуйте, все!
В конце макроса вызываю окно почты (у меня Outlook)
[vba]
Код
    Application.Dialogs(xlDialogSendMail).Show
[/vba]
Если отправить письмо сразу, то Excel вылетает. Если подождать несколько секунд (3-7) - все норм.
Outlook в других ошибках не замечен, MS офис лицензионный обновленный.
Этот феномен существует в нескольких файлах с разными макросами. Объединяет их только вызов окна почты.
Предполагаю, что проблема лечится задержкой выполнения, вроде Application.Wait (правда, еще не пробовал).
Однако, если делать задержку стандартную, то придется ждать это время и тогда, когда не нужно. А если сделать задержку маленькой, то вылетать все равно будет, хоть и не так часто.
Может кто-нибудь подсказать решение проблемы?

Образец файла не прикладываю: большой, по коммерческим соображениям; а в обрезанном этой проблемы нет, как ни старался.

Автор - pabchek
Дата добавления - 25.05.2016 в 11:06
pabchek Дата: Четверг, 26.05.2016, 10:45 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Мдя... Нет мыслей, тупой вопрос или без файла никак?


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеМдя... Нет мыслей, тупой вопрос или без файла никак?

Автор - pabchek
Дата добавления - 26.05.2016 в 10:45
RAN Дата: Четверг, 26.05.2016, 11:11 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4277
Репутация: 829 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub мяу()
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set File = FSO.GetFile("E:\Documents and Settings\Андр\Мои документы\4644779.xls")
    If File.Size > 100000 Then MsgBox "Мяууууу!"
    Set File = FSO.GetFile("E:\Documents and Settings\Андр\Мои документы\4644779.xlsb")
    If File.Size <= 100000 Then MsgBox "Мяу!"
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Sub мяу()
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set File = FSO.GetFile("E:\Documents and Settings\Андр\Мои документы\4644779.xls")
    If File.Size > 100000 Then MsgBox "Мяууууу!"
    Set File = FSO.GetFile("E:\Documents and Settings\Андр\Мои документы\4644779.xlsb")
    If File.Size <= 100000 Then MsgBox "Мяу!"
End Sub
[/vba]

Автор - RAN
Дата добавления - 26.05.2016 в 11:11
Karataev Дата: Четверг, 26.05.2016, 11:17 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 642
Репутация: 226 ±
Замечаний: 0% ±

Excel
...




Сообщение отредактировал Karataev - Четверг, 26.05.2016, 11:20
 
Ответить
Сообщение...

Автор - Karataev
Дата добавления - 26.05.2016 в 11:17
pabchek Дата: Четверг, 26.05.2016, 11:20 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
какой код Вы используете

В проблемных файлах я отображаю диалоговое окно, ибо нужно выбирать получателя. Или у Вас академический интерес какой код я использую?
[offtop] RAN, смотрю код, но пока еще не сообразил как это мне поможет[/offtop]


"Учиться, учиться и еще раз учиться!"
WM: R399923528092


Сообщение отредактировал pabchek - Четверг, 26.05.2016, 11:21
 
Ответить
Сообщение
какой код Вы используете

В проблемных файлах я отображаю диалоговое окно, ибо нужно выбирать получателя. Или у Вас академический интерес какой код я использую?
[offtop] RAN, смотрю код, но пока еще не сообразил как это мне поможет[/offtop]

Автор - pabchek
Дата добавления - 26.05.2016 в 11:20
RAN Дата: Четверг, 26.05.2016, 11:23 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4277
Репутация: 829 ±
Замечаний: 0% ±

2010
Элементарно, Ватсон! :D
Если файл большой, использовать задержку, если маленький - нет.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЭлементарно, Ватсон! :D
Если файл большой, использовать задержку, если маленький - нет.

Автор - RAN
Дата добавления - 26.05.2016 в 11:23
pabchek Дата: Четверг, 26.05.2016, 11:31 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
если маленький - нет

то вылетать все равно будет, хоть и не так часто

Да думал я уже про это :)
лечится задержкой выполнения, вроде Application.Wait


"Учиться, учиться и еще раз учиться!"
WM: R399923528092


Сообщение отредактировал pabchek - Четверг, 26.05.2016, 11:32
 
Ответить
Сообщение
если маленький - нет

то вылетать все равно будет, хоть и не так часто

Да думал я уже про это :)
лечится задержкой выполнения, вроде Application.Wait

Автор - pabchek
Дата добавления - 26.05.2016 в 11:31
_Boroda_ Дата: Четверг, 26.05.2016, 11:56 | Сообщение № 8
Группа: Модераторы
Ранг: Экселист
Сообщений: 9367
Репутация: 3940 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Нет мыслей, тупой вопрос или без файла никак?

Не совсем понятен вопрос. В больших файлах Excel вылетает, а в маленьких нет? Тогда, как вариант, опытным путем выяснить, на какой размер файла какую задержку нужно ставить и в макросе прописывать что-то типа
[vba]
Код
ThisWorkbook.Save 'сохраняемся
fp_ = ThisWorkbook.Path & "\" & ThisWorkbook.Name 'полный путь к файлу
fr_ = FileLen(fp_) 'размер файла
n_ = fr_ / 500 'делим размер на полученный экспериментально коэффициент
t_ = TimeValue("0:00:01") * n_ 'задержка в секундах
If Application.Wait(Now + t_) Then
    Application.Dialogs(xlDialogSendMail).Show
End If
[/vba]
Не проверял!!!


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Нет мыслей, тупой вопрос или без файла никак?

Не совсем понятен вопрос. В больших файлах Excel вылетает, а в маленьких нет? Тогда, как вариант, опытным путем выяснить, на какой размер файла какую задержку нужно ставить и в макросе прописывать что-то типа
[vba]
Код
ThisWorkbook.Save 'сохраняемся
fp_ = ThisWorkbook.Path & "\" & ThisWorkbook.Name 'полный путь к файлу
fr_ = FileLen(fp_) 'размер файла
n_ = fr_ / 500 'делим размер на полученный экспериментально коэффициент
t_ = TimeValue("0:00:01") * n_ 'задержка в секундах
If Application.Wait(Now + t_) Then
    Application.Dialogs(xlDialogSendMail).Show
End If
[/vba]
Не проверял!!!

Автор - _Boroda_
Дата добавления - 26.05.2016 в 11:56
pabchek Дата: Четверг, 26.05.2016, 12:08 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
RAN, _Boroda_, да, ваши коды работают (после рашпиля:)). Я то думал, что есть программная возможность отследить, закончил ли работу макрос. Я так понимаю, что основная моя проблема в том, что несмотря на то, что макрос передал на выполнение следующую строчку, какие-то процессы еще "доделываются" и вызывают сбой при вызове "недружелюбного" Аутлука.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеRAN, _Boroda_, да, ваши коды работают (после рашпиля:)). Я то думал, что есть программная возможность отследить, закончил ли работу макрос. Я так понимаю, что основная моя проблема в том, что несмотря на то, что макрос передал на выполнение следующую строчку, какие-то процессы еще "доделываются" и вызывают сбой при вызове "недружелюбного" Аутлука.

Автор - pabchek
Дата добавления - 26.05.2016 в 12:08
_Boroda_ Дата: Четверг, 26.05.2016, 12:28 | Сообщение № 10
Группа: Модераторы
Ранг: Экселист
Сообщений: 9367
Репутация: 3940 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А если перед отправкой написать
DoEvents
отдельной строкой?
https://msdn.microsoft.com/ru-ru/library/office/gg264522.aspx
https://support.microsoft.com/ru-ru/kb/118468


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА если перед отправкой написать
DoEvents
отдельной строкой?
https://msdn.microsoft.com/ru-ru/library/office/gg264522.aspx
https://support.microsoft.com/ru-ru/kb/118468

Автор - _Boroda_
Дата добавления - 26.05.2016 в 12:28
Матраскин Дата: Четверг, 26.05.2016, 13:15 | Сообщение № 11
Группа: Друзья
Ранг: Обитатель
Сообщений: 341
Репутация: 63 ±
Замечаний: 0% ±

20xx
Возможно стоит использовать синхронизацию?
не знаю есть ли что-то специфичное в vba, но в других языках я бы делал так. Один процесс лочится пока другой не закончил работу

p.s. глянув в гугле нашёл пример с глобальными переменными - выглядит кастыльно.


в интернете опять кто-то не прав
 
Ответить
СообщениеВозможно стоит использовать синхронизацию?
не знаю есть ли что-то специфичное в vba, но в других языках я бы делал так. Один процесс лочится пока другой не закончил работу

p.s. глянув в гугле нашёл пример с глобальными переменными - выглядит кастыльно.

Автор - Матраскин
Дата добавления - 26.05.2016 в 13:15
pabchek Дата: Четверг, 26.05.2016, 13:19 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Не помогло. Вставлял... куда я его только не вставлял)))))) Наверно, все же кривизна моего компа.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеНе помогло. Вставлял... куда я его только не вставлял)))))) Наверно, все же кривизна моего компа.

Автор - pabchek
Дата добавления - 26.05.2016 в 13:19
pabchek Дата: Четверг, 26.05.2016, 13:25 | Сообщение № 13
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Ладно, пойдем экстенсивным путем, вставлю ожидалку... Спасибо большое всем за потраченное время и дельные советы!


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеЛадно, пойдем экстенсивным путем, вставлю ожидалку... Спасибо большое всем за потраченное время и дельные советы!

Автор - pabchek
Дата добавления - 26.05.2016 в 13:25
pabchek Дата: Пятница, 27.05.2016, 11:23 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Проверил в боевых условиях. Ставил разные сроки задержки. Довел до абсурдно большой. Проблема осталась. Значит вопрос не во времени. Сбой происходит в момент нажатия кнопки "отправить" в Аутлуке. Значит, похоже, Аутлук с Экселем не дружат. :(
[vba]
Код
Sub Выбор()
...
    Application.Wait (Now + TimeValue("0:00:40"))
    Application.Dialogs(xlDialogSendMail).Show
End Sub
[/vba]


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеПроверил в боевых условиях. Ставил разные сроки задержки. Довел до абсурдно большой. Проблема осталась. Значит вопрос не во времени. Сбой происходит в момент нажатия кнопки "отправить" в Аутлуке. Значит, похоже, Аутлук с Экселем не дружат. :(
[vba]
Код
Sub Выбор()
...
    Application.Wait (Now + TimeValue("0:00:40"))
    Application.Dialogs(xlDialogSendMail).Show
End Sub
[/vba]

Автор - pabchek
Дата добавления - 27.05.2016 в 11:23
_Boroda_ Дата: Пятница, 27.05.2016, 11:48 | Сообщение № 15
Группа: Модераторы
Ранг: Экселист
Сообщений: 9367
Репутация: 3940 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Тогда описывай подробно все то, что творится - в какой момент что пишет, что делает при этом, ну и т.д.
Ну и вообще - что за макрос, что делает, зачем в конце Dialogs(xlDialogSendMail).Show? Короче - подробности нужно.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТогда описывай подробно все то, что творится - в какой момент что пишет, что делает при этом, ну и т.д.
Ну и вообще - что за макрос, что делает, зачем в конце Dialogs(xlDialogSendMail).Show? Короче - подробности нужно.

Автор - _Boroda_
Дата добавления - 27.05.2016 в 11:48
Матраскин Дата: Пятница, 27.05.2016, 12:04 | Сообщение № 16
Группа: Друзья
Ранг: Обитатель
Сообщений: 341
Репутация: 63 ±
Замечаний: 0% ±

20xx
pabchek,

[vba]
Код

Dim OutlookApp As Object, SM As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set SM = OutlookApp.CreateItem(olMailItem)
SM.To = "mail@example.ru"
SM.CC = "mail@example.ru"
SM.Subject = "Текст письма"
On Error Resume Next
SM.Body = "Текст письма"
SM.Attachments.Add ("C:\Test.xls")
SM.Display
Set SM = Nothing
Set OutlookApp = Nothing
[/vba]


в интернете опять кто-то не прав
 
Ответить
Сообщениеpabchek,

[vba]
Код

Dim OutlookApp As Object, SM As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set SM = OutlookApp.CreateItem(olMailItem)
SM.To = "mail@example.ru"
SM.CC = "mail@example.ru"
SM.Subject = "Текст письма"
On Error Resume Next
SM.Body = "Текст письма"
SM.Attachments.Add ("C:\Test.xls")
SM.Display
Set SM = Nothing
Set OutlookApp = Nothing
[/vba]

Автор - Матраскин
Дата добавления - 27.05.2016 в 12:04
pabchek Дата: Пятница, 27.05.2016, 13:48 | Сообщение № 17
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
описывай подробно

Полный текст макроса

В файле данные - 500 тыс.строк
Макросом убираю ненужные значения, сохраняю файл с именем адресата и в формате "xlsx" (без макросов).
Открывается окно почты. Вставляю адрес. Жму "Отправить". Всё. Краш программы.
Можно адрес вставлять макросом же. Но адреса периодически меняются и хотел контролировать этот момент.

[p.s.]Добавляю. Письмо при этом уходит. Файл формируется и сохраняется нормально

Матраскин, код еще не подогнал для себя. Но видел и делаю)))


"Учиться, учиться и еще раз учиться!"
WM: R399923528092


Сообщение отредактировал pabchek - Пятница, 27.05.2016, 13:56
 
Ответить
Сообщение
описывай подробно

Полный текст макроса

В файле данные - 500 тыс.строк
Макросом убираю ненужные значения, сохраняю файл с именем адресата и в формате "xlsx" (без макросов).
Открывается окно почты. Вставляю адрес. Жму "Отправить". Всё. Краш программы.
Можно адрес вставлять макросом же. Но адреса периодически меняются и хотел контролировать этот момент.

[p.s.]Добавляю. Письмо при этом уходит. Файл формируется и сохраняется нормально

Матраскин, код еще не подогнал для себя. Но видел и делаю)))

Автор - pabchek
Дата добавления - 27.05.2016 в 13:48
SLAVICK Дата: Пятница, 27.05.2016, 16:32 | Сообщение № 18
Группа: Модераторы
Ранг: Старожил
Сообщений: 1839
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
А у Вас какой outlook?
microsoft или express?

Попробуйте код отсюда:
Проверял - работает и с одним и с другим оутлуками.
[vba]
Код
Sub test()
b = OutlookExpressSend(ActiveWorkbook, "xxxxx@s.net", "Hello this is test")
End Sub
[/vba]

[vba]
Код
Function OutlookExpressSend(WB As Workbook, ByVal stRecipient As String, ByVal stSubject As String)
'For Tips see: http://www.rondebruin.nl/win/winmail/div/tips.htm
'Working in Excel 2000-2016
    Dim i As Long
    On Error Resume Next
    For i = 1 To 3
        WB.SendMail stRecipient, stSubject, True
        If Err.Number = 0 Then Exit For
    Next i
   OutlookExpressSend = Err.Number = 0
End Function
[/vba]


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеА у Вас какой outlook?
microsoft или express?

Попробуйте код отсюда:
Проверял - работает и с одним и с другим оутлуками.
[vba]
Код
Sub test()
b = OutlookExpressSend(ActiveWorkbook, "xxxxx@s.net", "Hello this is test")
End Sub
[/vba]

[vba]
Код
Function OutlookExpressSend(WB As Workbook, ByVal stRecipient As String, ByVal stSubject As String)
'For Tips see: http://www.rondebruin.nl/win/winmail/div/tips.htm
'Working in Excel 2000-2016
    Dim i As Long
    On Error Resume Next
    For i = 1 To 3
        WB.SendMail stRecipient, stSubject, True
        If Err.Number = 0 Then Exit For
    Next i
   OutlookExpressSend = Err.Number = 0
End Function
[/vba]

Автор - SLAVICK
Дата добавления - 27.05.2016 в 16:32
pabchek Дата: Среда, 01.06.2016, 11:42 | Сообщение № 19
Группа: Проверенные
Ранг: Ветеран
Сообщений: 645
Репутация: 145 ±
Замечаний: 0% ±

Excel 2007
Наконец то появилось время вернуться к этой теме.
Матраскин, SLAVICK, Спасибо большое! Ваши коды работают хорошо. Плюсанул)) Для моих целей более удобным оказался код Ярослава.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092


Сообщение отредактировал pabchek - Среда, 01.06.2016, 11:43
 
Ответить
СообщениеНаконец то появилось время вернуться к этой теме.
Матраскин, SLAVICK, Спасибо большое! Ваши коды работают хорошо. Плюсанул)) Для моих целей более удобным оказался код Ярослава.

Автор - pabchek
Дата добавления - 01.06.2016 в 11:42
SLAVICK Дата: Среда, 01.06.2016, 13:51 | Сообщение № 20
Группа: Модераторы
Ранг: Старожил
Сообщений: 1839
Репутация: 614 ±
Замечаний: 0% ±

2007,2010,2013,2016
pabchek, в соседней теме есть еще один код - так для разнообразия - проверял работает.(кстати с того же сайта.)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщениеpabchek, в соседней теме есть еще один код - так для разнообразия - проверял работает.(кстати с того же сайта.)

Автор - SLAVICK
Дата добавления - 01.06.2016 в 13:51
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Отправка письма прекращает работу Excel (Макросы/Sub)
Страница 1 из 212»
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!