Прошу прощения - вчера не успел сделать (поздно пришёл, пятница - все таки )
Готово, вот код:
Код
Dim adressTo$, fname$, theme$, Disclaimer$
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("$A$1:$B$1").AutoFilter Field:=2, Criteria1:="<>"
End With
Set rng = sh.Range("A1").CurrentRegion
With sh
adressTo = .Range("G2").Value
theme = .Range("H2").Value
Disclaimer = .Range("J2").Value
End With
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = adressTo
.cc = ""
.BCC = ""
.Subject = theme
.HTMLBody = "<p style=font-size:10pt;font-family:Calibri;>" & Disclaimer & _
RangetoHTML(rng)
.Display 'или Send - чтобы отправить сразу, без предварительного просмотра сформированного сообщения Outlook
End With
Set OutMail = Nothing
Set OutApp = Nothing
sh.AutoFilterMode = False
ThisWorkbook.Save
MsgBox "Письмо успешно сформировано и направлено! ", vbInformation, "Подтверждение отправки сообщения"
With Application
.EnableEvents = True
.ScreenUpdating = True
.DisplayAlerts = True
End With
Теперь по примеру: 1. Будет формироваться всегда 1 сообщение всегда одному получателю, которого мы указываем в диапазоне G2; 2. Если нужна другая логика (1 письмо = 1 строка таблицы, то предлагаю использовать цикл For Each или Do while) - если надо так, то могу сделать; 3. А что собираетесь сохранять в приложение к письму? Это всегда один и тот-же файл или подразумевается возможность выбора? Если вы сталкиваетесь с необходимостью менять приложенный файл, то предлагаю использовать метод GetOpenFIlename.
Если диапазон не статичен, то предлагаю его цеплять через свойство .UsedRange и кидать в уже обозначенную функцию rangetoHTML. Если приложите пример сделаю вечером.
Т.к. файла-примера нет, то ответ на вопрос: можно, вот так:
Код
*сохраняем диапазон с требуемой информаций в объектную переменную
Dim rnGAttach As Range 'имя объёктной переменной
Set rnGAttach = ThisWorkbook.Worksheets("Ваш лист").Range("B2:B34") 'вместо "ваш лист' укажите имя листа, с которого сохраняется диапазон ячеек в .Body
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = ThisWorkbook.Sheets("Sheet2").Range("C1").Value 'Это если адрес получателя статичен / не запрашиваете у пользователя через форму / inbox или указывается непосредственно в книге
.CC = ""
.BCC = ""
.Subject = "This is the Subject line" 'тема письма
.HTMLBody = RangetoHTML(rnGAttach) 'тело письма. в данном случае это сохранённый нами в объектную переменную диапазон и сконвертированный в html удобоваримый формат
.Display 'или .Send - чтобы отправить сразу
End With
Пример кода (вставляете в модуль пользовательской формы), который отображает в заголовке пользовательской формы (caption) текущую дату и имя пользователя Excel. Но вы можете легко доработать под свои нужды:
Если с английским дружите (хотя бы на уровне B1), то советую придерживаться этой стратегии на сайте mrexcel. Пользы будет в разы больше (просто потому, что ресурс гораздо больше и оживлённее и выбор и спектр вопросов шире - что для вас критично) при аналогичных затратах сил и времени.
Можно ещё смотреть темы в архиве по интересующим нюансам работы в VBA. к примеру пишите в поиске тему, на которой хотели бы набить руку (объединения данных из множества книг, перенос данных из Excel в Word и т.д.) и делаете своё решение попутно сверяясь с уже представленными в архивных темах.
По поводу курсов специалиста.. Если уж есть свободные деньги, время и желание (при абсолютном понимании безальтернативности) - советую посетить курсы, которые ведёт Сергей Ожиганов. Он очень талантливый педагог и хорошо шарит в предметной области.
Макрос "какой нибудь" у Николая есть в примерах:ссылка
P.S. тема похожа на плохую попытку пропиарить левую группу вконтакте. Чисто субъективное мнение - если человек с такими вопросами предлагает услуги по автоматизации в Excel, то стоит 2 или 3 раза задуматься о получении а уж тем-более об оплате таких услуг.
Предлагаю следующее решение (которое потребует создания отдельной кнопки, для закрытия UserForm, при этом, закрытие UserForm через "крестик" будет недоступно").
Код
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
' MsgBox "Используйте кнопку 'выйти' чтобы закрыть форму размещения чего-то там."
Cancel = True
End If
End Sub
+ добавить кнопку на Userform, которая будет использоваться в качестве кнопки выхода / завершения работы и повесить следующий код на событие "click":
Код
Private Sub CommandButton1_Click() -- ваша кнопка
Unload Me
'ThisWorkbook.Save 'опционально
End Sub
Вариант (используются несмежные диапазоны для копирования заголовка таблицы - фиксированный диапазон и выбранной строки. Но лучше бы Вы привели пример реальной задачи, для чего хотите использовать запрашиваемые сведения):
Код
Dim rng As Range
Dim rng2 As Range
Dim rngAttach As Range
Set rng = Nothing
Set rng2 = Nothing
On Error Resume Next
Set rng = Sheets("info_list").Range("A4:N4").SpecialCells(xlCellTypeVisible)
Set rng2 = findvalue.EntireRow.Resize(1, 14)
With ThisWorkbook.Worksheets("info_list")
Set rngAttach = .Range(rng.Address & "," & rng2.Address)
End With
Подобных тем каждый день создаётся десяток: начинать программировать в 18, 19, 20, 26, 30, 50, 70....? Что тут обсуждать? Это какой-то способ морально себя подбодрить? Или добиться одобрения или поддержки не известных Вам людей, с которыми скорее всего никогда в жизни не встретитесь?)
Поставили цель, отвели срок и вперёд. Главное зацепиться за рабочее место.А если будет переть то, чем занимаетесь, то на кусок хлеба всегда заработаете. Это в любом случае лучше, чем заниматься тем, что Вам не нравится и не приносит удовлетворения по жизни. Для мужика работа это половина жизни (бОльшая половина). Обидно потом будет - мялись, слушали кого-то на форумах и не попробовали раньше.
Полно ресурсов в .com зоне, которые в несложной, игровой манере помогут стартовать.
Советую: https://www.codecademy.com/ и code.org Если с языком проблемы, то выход есть: смотреть аналогичные школы в .ru зоне. Стоит сказать о тех, кто считает, что университеты, школы и учебники это пустая трата времени. У всех своё мнение - истины в этом вопросе нету, но стоит сказать, что когда у тебя есть наставник, то процесс обучения значительно ускоряется, что особенно актуально для позднего старта.
И да, единственный способ научиться программировать - это программировать. Поэтому большого толку не ждите от подобных площадок и зубрёжки учебников дома. Надо найти работу, пусть даже самую низкооплачиваемую (опять-таки мы о Вас ничего не знаем, насколько у Вас велика потребность в постоянном доходе, какой бюджет у Вас и т.д.) с самой низкой стартовой позицией.
1. Это отличная возможность тем кто ещё сомневается стоит ли ему иметь дело с надстройками избавиться от страха и понять, что благодаря им можно сэкономить кучу времени на тратя его на постройку своего велосипеда. 2. Это отличная возможность продвинуть надстройку и показать пользователям "на пальцах" все её достоинства и мощь.
JeyCi Мне кажется нет смысла давать ссылки пользователю-новичку на учебные материалы по языку VB6 и другим VB-образным языкам. Область их приложения и примеры с большой долей вероятности будут далеки от мс-офиса.
Если так мыслить, то можно вообще посоветовать литературу и курсы по C# и C++ (или любым другим, .COM совместимым языкам программирования)... Но это уже излишне.
По основам (без опыта программирования на VBA или с минимальным опытом): VBA и программирование в MS Office для пользователей (Ростислав Михеев) Самоучитель VBA. Технология создания пользовательских приложений (Андрей Гарнаев) Разработка приложений на VBA (Андрей Гарнаев, Лада Рудикова)
В качестве справочника и поиска идей (в качестве учебника не подходит): Excel 2013 / Excel 2010. Профессиональное программирование на VBA (Уокенбах Джон)
***Все четыре книги валяются в сети (можно найти бесплатно - если поискать).
По обучающим курсам советую в УЦ Специалист: "Excel 2016/2013 - уровень 4 Макросы на VBA", Углублённое программирование на VBA". Читают курсы: Завьялов / Ожиганов); Первого лектора можно найти в сети (бесплатно). На второго рекомендую пойти (если живёте в Москве или для Вас допустим формат вебинара).
1. Наберите в запросе "Учебный центр Специалист При МГТУ имени Баумана". 2. Далее, на сайте, вбейте "Сертификация MICROSOFT OFFICE SPECIALIST" (На эксперта 2 экзамена 77-427 и 77-428).
-Управление и обмен книгами; -Применение пользовательских форматов и макетов; -Создание расширенных формул; -Создание дополнительных диаграмм и таблиц;
Вы не рассматриваете получение бесплатных консультаций по темам, приведённым в Вашем посте (дистанционно, через Skype, к примеру)?
Поясню, что для меня это отличная возможность актуализировать имеющиеся знания по всем известному принципу в педагогике - если хочешь что-то хорошо и прочно закрепить в своей голове и/или развить навыки преподавания / тренерской деятельности - лучший способ это обучать других. По крайней мере, вы не потеряете много времени, если после 1 занятия окажется, что я не подойду на эту роль.
Вот Еще рекомендую книгу Мартина Грабера как хороший учебник по SQL для тех, кто изучает «с нуля». Эта книга повсюду лежит в сети. Можно почитать её, например, здесь:· http://www.sql.ru/docs/sql/u_sql/
Кстати, Еще стоит упомянуть о великолепном обучающем ресурсе sql-ex.ru!
Он хорош тем, что представлено множество учебных материалов (главный из которых - учебник) и среда для отработки задач и совершенствования навыков написания запросов на языке SQL (по принципу - от простого к сложному). Т.е. устанавливать на компьютер ничего не требуется - запросы пишутся прямо в форме, на сайте, и тут же показывается результат нашего запроса к БД. Сертификат (который выдаётся ресурсом, при решении задач пользователями) имеет реальную ценность для работодателей (абсолютно серьёзно).
Но мне показалось, что для тех, кто в глаза SQL не видел и не имеет хоть какого-то мало-мальски опыта написания запросов - начинать с sql-ex не стоит. Ибо сложность задач вырастает слишком уж быстро.
Как уже было сказано выше - лучше обратиться к книге Б. Форта "SQL за 10 минут" и прорешать задачи, приведённые в книге (на схемах БД, доступных к скачиванию с сайта автора) на бесплатной среде MySQL
Badamyan Очень советую посетить (или ознакомиться, в открытом доступе они есть) курсы Самородова Ф.А. (querying sql server 2012), которые он читает в Специалисте.
+ могу посоветовать очень толковую книгу для начинающих: Бен Форта - "SQL за 10 минут". А дальше уже смотреть в сторону Джона Селко...
нужна доработка макроса, чтобы он отвечал следующим критериям: В ячейках в диапазоне F5:F150 указываются даты в формате dd.mm.yy hh:mm. что нужно: a) При изменении значения в любой из ячейке указанного диапазона требуется сохранять предыдущее значение (если оно было) в offset 0, 7 cell. b) Если ячейка (строка) удаляется с рабочего листа, то всю историю изменений в offset 0,7 следует очищать.
Бюджет = 500 руб.
код из примеров, но сохраняет историю изменений в комментарии к ячейке и не обнуляет значение offset 0, 7 после удаления соответствующей ячейки из диапазона F5:F150 или строки, включающей в себя в этот диапазон.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewCellValue$, OldComment$
Dim cell As Range
'если ячейка не в отслеживаемом диапазоне, то выходим
If Intersect(Target, Range("F5:F150")) Is Nothing Then Exit Sub
'перебираем все ячейки в измененной области
For Each cell In Intersect(Target, Range("F5:F150"))
If IsEmpty(cell) Then
NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
Else
NewCellValue = Format(cell, "dd.mm.yyyy hh:mm") 'или ее содержимое
End If
On Error Resume Next
With cell.Offset(rowOffset:=0, columnOffset:=7)
OldComment = .Comment.Text & Chr(10)
.Comment.Delete 'удаляем старое примечание (если было)
.AddComment 'добавляем новое и вводим в него текст
.Comment.Text Text:=OldComment & Application.UserName & " " & _
Format(Now, "dd.mm.yyyy hh:mm") & " : " & NewCellValue
.Comment.Shape.TextFrame.AutoSize = True 'делаем автоподбор размера
.Comment.Shape.TextFrame.Characters.Font.Size = 8
End With
Next cell
End Sub
Пример конечно запутанный. Таблица №1 c ваших слов, это та таблица, которая расположена в диапазоне "K2:AP38"? Время на дорогу к клиенту это J44:J66 или J44:J77? И куда суммировать должно в какой диапазон?