Option Explicit
Sub Заявка()
Const TABLE_RANGE = "A7:H17"
Dim adressTo$, fname$, theme$, Disclaimer As Range
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim rng As Range
Set sh = ThisWorkbook.Sheets("Заявка") ' ссылка на листы в файле, где запустить макрос
With Application ' управление настройками программы, окнами, рабочими книгами, выполнение глобальных действий
.DisplayAlerts = False ' отключение автоматических предупреждений и диалоговых окон
.EnableEvents = False ' отключение автоматических выполнений событий
.ScreenUpdating = False ' отключение обновления экрана для ускорения макроса
End With
With sh
.AutoFilterMode = False ' отключение режима автофильтра на активном листе, убирает стрелки раскрывающихся списков из заголовков, но не удаляет сами данные
.Range(TABLE_RANGE).AutoFilter Field:=2, Criteria1:="<>" ' диапазон таблицы
End With
Set rng = sh.Range(TABLE_RANGE).CurrentRegion ' автоматический выбор всей непрерывной области данных (таблицы), примыкающей к ячейке A7, ограниченной пустыми строками и столбцами
rng.Cells(1, rng.Columns.Count).Value = Replace(rng.Cells(1, rng.Columns.Count).Value, "передал", "педерал")
Dim adressCC As String
With sh
adressTo = .Range("C2").Value ' выбор получателя(лей) сообщения
adressCC = .Range("C3").Value ' выбор получателя(лей) копии сообщения
theme = .Range("C4").Value ' выбор темы сообщения
Set Disclaimer = .Range("C5") ' выбор текста сообщения
End With
Set OutApp = CreateObject("Outlook.Application") ' создание нового экземпляра (объекта) приложения Microsoft Outlook для управления им из другого приложения (Excel или Word)
Set OutMail = OutApp.CreateItem(0) ' создание нового пустого элемента (письма) в приложении Microsoft Outlook
On Error Resume Next ' обработка игнорирование ошибок
Dim YourHTMLBody As String, iStart As Long, iEnd As Long ' вставка подписи в элемент (письмо)
YourHTMLBody = RangetoHTML(Disclaimer, sh.Range(TABLE_RANGE))
With OutMail ' свойства элемента (письма)
.To = adressTo ' получатель сообщения
.CC = adressCC ' получатели копии сообщения
.BCC = "" ' отправка элемента (письма) только основным получателям
.Subject = theme
.BodyFormat = 2 ' формат создаваемого элемента (письма) установить HTML
.HTMLBody = YourHTMLBody
.Display
End With
If rng.Rows.Count > 1 Then
Set rng = rng.Cells(2, 2).Resize(rng.Rows.Count - 1, rng.Columns.Count - 1)
With Sheets("Реестр")
rng.Copy .Cells(.Rows.Count, 2).End(xlUp).Cells(2, 1)
End With
End If
Set OutMail = Nothing
Set OutApp = Nothing
sh.AutoFilterMode = False
ThisWorkbook.Save
With Application
.EnableEvents = True
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub
Function RangetoHTML(head As Range, rng As Range) As String
' Works in Excel 2000, Excel 2002, Excel 2003, Excel 2007, Excel 2010, Outlook 2000, Outlook 2002, Outlook 2003, Outlook 2007, and Outlook 2010.
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
CopyRange head, .Cells(1, 1)
CopyRange rng, .Cells(3, 1)
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
' Publish the sheet to an .htm file.
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
' Read all data from the .htm file into the RangetoHTML subroutine.
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.ReadAll
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
' Close TempWB.
TempWB.Close savechanges:=False
' Delete the htm file.
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Private Sub CopyRange(rSource As Range, rTarget As Range)
' Copy the range and create a workbook to receive the data.
rSource.Copy
With rTarget
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues, , False, False
.PasteSpecial xlPasteFormats, , False, False
.Select
End With
Application.CutCopyMode = False
End Sub
|