Консультация № 179368
01.07.2010, 21:01
0.00 руб.
0 8 2
Здравствуйте уважаемые эксперты, ниже следует мой макрос.
Он делает: выделенный текст в документе сначала упаковывает его во временный файл помещает, далее этот файл прикрепляет в Оутлуке пользователь отправлет письмо самостоятельно, темпашка удаляется. И тот Исходный файл открывается. Остался последний ньюанс.
А именно был например документ на 78 листах, я выделил часть, например на 63 листе, макрос всё сделал и отрывает мне исходный документ, с которого я отправил письмо уже на 1 стр., не логично, как сделать, чтобы он открыл его в том же самом месте и чтобы выделенное осталось выделенным. Подскажи как, где, куда, что надо добавить!!


'условие о том выделен ли текст, если длина текста равна нулю, то есть пустому месту - "", тогда ...
If Len(Application.Selection.Range.Text) = 0 Then
'вывести надпись указанную в кавычках
MsgBox$ "Никакой текст не выделен", vbOKOnly, "Отправка письма программой Outlook не может быть выполнена"
'выйти из программы
Exit Sub
End If

Dim TempDocPath As String 'путь для сохранения временного документа
Dim FSO As Object 'системный объект для получения имени временного файла
Dim sFileName As String 'имя временного файла
Dim SelStart As Long 'начало выделения
Dim SelEnd As Long 'конец выделения

CurrDocPath = ActiveDocument.FullName 'путь к папке Temp
TempDocPath = Environ("Temp") 'запоминаем границы выделения
SelStart = Selection.Start
SelEnd = Selection.End
'получаем имя для временного файла
Set FSO = CreateObject("Scripting.FileSystemObject")
sFileName = FSO.GetTempName() 'временное имя для файла
TempDocPath = TempDocPath & "" & Mid(sFileName, 1, InStrRev(sFileName, ".")) & "doc" 'полный путь к временному файлу
ActiveDocument.SaveAs TempDocPath, 0, AddToRecentFiles:=False 'сохраняем активный документ, как временный файл
ActiveDocument.Range(SelEnd, ActiveDocument.Range.End).Delete 'удаляем всё, что находится после выделения
ActiveDocument.Range(0, SelStart).Delete 'удаляем всё, что находится до выделения

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

Selection.Font.Color = wdColorRed 'окрасить выделенное в красный цвет
ActiveDocument.Close True 'закрываем активный документ с сохранением настроек

''''''''''''''''''''''''''''''''''''''''''
'отправка письма по Microsoft Outlook

'для работоспособности нужно добавить ссылку на библиотеку
'зайдите в меню Tools-References, найдите Microsoft Outlook Object Library, поставьте птичку

Dim objOL As Outlook.Application
Set objOL = Outlook.Application

Dim objMail As Outlook.MailItem
Set objMail = objOL.CreateItem(olMailItem)

Dim objAttach As Object
Set objAttach = objMail.Attachments

With objMail
.To = "" '"mm@mm.ru; dd@dd.ru" 'адрес e-mail для отправки письма, если несколько адресов e-mail, пишем, отделяя их точкой с запятой - ";"
.CC = "" 'копия
.Subject = "" 'это тема письма
'.Body = "Это текст письма" 'вариант отправки определённого текста
'.Body = ActiveDocument.Selection 'вариант отправки выделенного текста
.Attachments.Add TempDocPath '
'.Attachments.Add 'если надо второе вложенное письмо, тогда добавляем второй Attachments
.OriginatorDeliveryReportRequested = True 'уведомление о доставке письма
.ReadReceiptRequested = True 'уведомление о прочтении письма
.Save ' сохраним письмо
.Display 'показать окно письма, то есть показать открытую программу Outlook
'.Send 'отправить письмо автоматом
End With
Set objMail = Nothing
Set objOL = Nothing
Set objAttach = Nothing

Documents.Open CurrDocPath 'открываем старый, исходный документ
Kill TempDocPath 'удаляем временный документ
Set FSO = Nothing 'установка объекта в значение Nothing требуется для освобождения памяти, которая была выделена для создания этого объекта
Спасибо

Обсуждение

давно
Профессионал
848
1596
02.07.2010, 09:07
общий
как вариант -не нужно сохранять текущий документ (ActiveDocument.SaveAs), а потом удалять из него невыделенный текст... Думаю проще создавать новый документ, копировать в него выделенный текст, сохранять его, отправлять, удалять. При этом текущий документ остается открытым.
Неизвестный
02.07.2010, 11:44
общий
PsySex:
Спасибо за сообщение, моё мнение:
как без: ActiveDocument.SaveAs TempDocPath, 0, AddToRecentFiles:=False 'сохраняем активный документ, как временный файл
А что же я отравлять буду? Мне нужно вложенный файл.
Вы говорите:
создавать новый документ - я и так создаю
Вы говорите: копировать в него выделенный текст
Ещё же ньюансы есть чтобы форматирование сохранилось то же, что и было, а если ещё есть таблица в документе, как это себя проявит?
Одним словом может Вы то что нужно предлагаете, я особо спорить не буду. Если всё же представите скрипт или тоячно скажите где у меня на что нужно заменить
Тогда я Вам точно скажу. Спасибо
давно
Профессионал
848
1596
02.07.2010, 15:16
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Данная процедура копирует и сохраняет выделенное в файл с именем sFile.
В вашем случае вставляете ее после после определения имени файла TempDocPath
Call SaveSelected(TempDocPath)
и до слов 'отправка письма по Microsoft Outlook ваш код не нужен. Также в конце убрать Documents.Open CurrDocPath, т.к. исходный документ и не закрывался.
Код:
Sub SaveSelected(sFile as String)
Dim nSymbCnt As Long
Dim dcNew As Document
nSymbCnt = Selection.End - Selection.Start 'запоминаем колличество выделенных символов
Selection.Copy 'копируем выделенный текст в текущем документе в буфер обмена
Set dcNew = New Document 'создаем новый документ
dcNew.Activate 'делаем его активным
Selection.PasteAndFormat (wdPasteDefault) 'вставляем скопированное
Selection.Start = 0 'выбираем текст для покраски в красный цвет
Selection.End = nSymbCnt
Selection.Font.Color = wdColorRed 'красим
dcNew.SaveAs sFile, 0, AddToRecentFiles:=False 'сохраняем документ
dcNew.Close
Set dcNew = Nothing
End Sub
5
Неизвестный
02.07.2010, 16:34
общий
PsySex:
Спасибо за ответ, получилось нижеследующее, так по тексту есть проблема, как исправвить????
Скрипт:
Sub Отправка_выделенного_теста_вложенным_письмом()

'условие о том выделен ли текст, если длина текста равна нулю, то есть пустому месту - "", тогда ...
If Len(Application.Selection.Range.Text) = 0 Then
'вывести надпись указанную в кавычках
MsgBox$ "Никакой текст не выделен", vbOKOnly, "Отправка письма программой Outlook не может быть выполнена"
'выйти из программы
Exit Sub
End If

Dim TempDocPath As String 'путь для сохранения временного документа
Dim FSO As Object 'системный объект для получения имени временного файла
Dim sFileName As String 'имя временного файла
Dim SelStart As Long 'начало выделения
Dim SelEnd As Long 'конец выделения

CurrDocPath = ActiveDocument.FullName 'путь к папке Temp
TempDocPath = Environ("Temp") 'запоминаем границы выделения

Call SaveSelected(TempDocPath)

''''''''''''''''''''''''''''''''''''''''''
'отправка письма по Microsoft Outlook

'для работоспособности нужно добавить ссылку на библиотеку
'зайдите в меню Tools-References, найдите Microsoft Outlook Object Library, поставьте птичку

Dim objOL As Outlook.Application
Set objOL = Outlook.Application

Dim objMail As Outlook.MailItem
Set objMail = objOL.CreateItem(olMailItem)

Dim objAttach As Object
Set objAttach = objMail.Attachments

With objMail
.To = "" '"mm@mm.ru; dd@dd.ru" 'адрес e-mail для отправки письма, если несколько адресов e-mail, пишем, отделяя их точкой с запятой - ";"
.CC = "" 'копия
.Subject = "" 'это тема письма
'.Body = "Это текст письма" 'вариант отправки определённого текста
'.Body = ActiveDocument.Selection 'вариант отправки выделенного текста
.Attachments.Add TempDocPath 'ОШИБКА ?????????? ПАПКА НЕ МОЖЕТ БЫТЬ ВЛОЖЕНИЕМ
'.Attachments.Add 'если надо второе вложенное письмо, тогда добавляем второй Attachments
.OriginatorDeliveryReportRequested = True 'уведомление о доставке письма
.ReadReceiptRequested = True 'уведомление о прочтении письма
.Save ' сохраним письмо
.Display 'показать окно письма, то есть показать открытую программу Outlook
'.Send 'отправить письмо автоматом
End With
Set objMail = Nothing
Set objOL = Nothing
Set objAttach = Nothing

Kill TempDocPath 'удаляем временный документ
Set FSO = Nothing 'установка объекта в значение Nothing требуется для освобождения памяти, которая была выделена для создания этого объекта

End Sub

Sub SaveSelected(sFile As String)
Dim nSymbCnt As Long
Dim dcNew As Document
nSymbCnt = Selection.End - Selection.Start 'запоминаем колличество выделенных символов
Selection.Copy 'копируем выделенный текст в текущем документе в буфер обмена
Set dcNew = New Document 'создаём новый документ
dcNew.Activate 'делаем его активным
Selection.PasteAndFormat (wdPasteDefault) 'вставляем скопированное
Selection.Start = 0 'выбираем текст для покраски в красный цвет
Selection.End = nSymbCnt
Selection.Font.Color = wdColorRed 'красим
dcNew.SaveAs sFile, 0, AddToRecentFiles:=False 'сохраняем документ
dcNew.Close
Set dcNew = Nothing

End Sub
давно
Профессионал
848
1596
02.07.2010, 16:56
общий
вы код забыли для формирования имени временного файла
'получаем имя для временного файла
Код:
Set FSO = CreateObject("Scripting.FileSystemObject")
sFileName = FSO.GetTempName() 'временное имя для файла
TempDocPath = TempDocPath & "" & Mid(sFileName, 1, InStrRev(sFileName, ".")) & "doc" 'полный путь к временному файлу

потом вызывать
Call SaveSelected(TempDocPath)
Неизвестный
02.07.2010, 18:10
общий
это ответ
Здравствуйте, Ципихович Эндрю!
Если правильно поняла, получатель письма должен работать с тем же документом, что и отправитель, по почте получает фрагмент этого документа. При получении письма, у получателя Word-ом нужно открыть этот документ, найти в нем такой же фрагмент, как в письме и выделить его. Тогда у получателя должен быть известен путь к документу .
Но полученным письмом в почте автоматически документ не откроешь.
Можно указать в письме гиперссылку на документ, чтобы его открыть. Но тогда в Word'e на стороне получателя должен быть макрос, который при открытии документа проверял бы почту, искал нужное письмо, считывал из него фрагмент, искал бы его в тексте документа и выделял.
Чтобы из макроса найти нужное письмо, оно должно быть как-то помечено, например в теме.

Наверное так можно сделать, но придется потрудиться, написать еще один макрос для Word-а и установить его на стороне получателя.
Неизвестный
02.07.2010, 18:27
общий
Иноземцева Ольга Степановна:
Спасибо за ответ, я в него сильно не вчитывался, потому что проверил ответ № 1, он меня устроил полностью. А Ваше: но придется потрудиться, написать еще один макрос для Word-а и установить его на стороне получателя. Это не приемлимо, сами вдумайтесь, что предлагаете.
Неизвестный
02.07.2010, 18:27
общий
PsySex:
Спасибо большое
Форма ответа