powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сокращение кода VBA
19 сообщений из 19, страница 1 из 1
Сокращение кода VBA
    #38465994
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть код VBA который рассылает пользователям ссылки на различные отчеты.
У разных пользователей могут быть схожие отчеты. Помогите сократить код.
Он имее следующий вид:

Код: vbnet
1.
2.
3.
4.
5.
a = sendEmail("пользователь1@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне.<BR><BR>Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Жатецкий_Гусь\" & Date & "_Жатецкий_Гусь.xlsx'>" & Date & " Жатецкий Гусь</a><BR><BR><a href='\\fs\Отчеты\Готовые\Наполняемость_по_промо\" & Date & "_наполняемость_по_промо.xlsx'>" & Date & " наполняемость по промо</a><BR><BR><a href='\\fs\Отчеты\Готовые\2_плюс_1\" & Date & "_2_плюс_1.xlsx'>" & Date & " 2 плюс 1</a><BR><BR><a href='\\fs\Отчеты\Готовые\Остатки_ЛЭк\" & Date & "_Остатки_ЛЭк.xlsx'>" & Date & " Остатки ЛЭк</a><BR><BR><BR><BR><a href='\\fs\Отчеты\Готовые\Прайс_пр-во\" & Date & "_прайс_пр-во.xlsx'>" & Date & " прайс производства</a><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR></i></div>")
a = sendEmail("пользователь2@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне.<BR><BR>Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Остатки_по_московским_поставщикам\" & Date & "_остатки_по_московским_поставщикам.xlsx'>" & Date & " остатки по московским поставщикам</a><BR><BR><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR></i></div>")
a = sendEmail("пользователь3@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне.<BR><BR>Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Наполняемость_по_промо\" & Date & "_наполняемость_по_промо.xlsx'>" & Date & " наполняемость по промо</a><BR><BR><a href='\\fs\Отчеты\Готовые\2_плюс_1\" & Date & "_2_плюс_1.xlsx'>" & Date & " 2 плюс 1</a><BR><BR><a href='\\fs\Отчеты\Готовые\Выпечка\" & Date & "_Выпечка.xlsx'>Выпечка</a><BR><BR><a href='\\fs\Отчеты\Готовые\Володарского_42\" & Date & "_Володарского_42.xlsx'>" & Date & " Володарского 42</a><BR><BR><a href='\\fs\Отчеты\Готовые\Остатки_ЛЭк\" & Date & "_Остатки_ЛЭк.xlsx'>" & Date & " Остатки ЛЭк</a><BR><BR><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR></i></div>")
a = sendEmail("пользователь4@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне. <BR><BR> Обновлены следующие отчёты:<BR><BR> <a href='\\fs\Отчеты\Готовые\Остатки_РМ\" & Date & "_остатки_РМ.xlsx'>" & Date & "_остатки_РМ</a> <BR><BR><a href='\\fs\Отчеты\Готовые\Остатки_по_рабочей_форме\" & Date & "_Остатки_по_рабочей_форме.xlsx'>" & Date & " Остатки по рабочей форме</a><BR><BR><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR></i></div>")
a = sendEmail("пользователь5@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне.<BR><BR>Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Наполняемость_по_промо\" & Date & "_наполняемость_по_промо.xlsx'>" & Date & " наполняемость по промо</a><BR><BR><a href='\\fs\Отчеты\Готовые\Выпечка\" & Date & "_Выпечка.xlsx'>Выпечка</a><BR><BR><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR></i></div>")



Соответственно у каждого письма есть вступление "<BR><BR>Здравствуйте.<BR><BR>Процесс авторассылки находится в тестовом режиме. При возникновении проблем с правами доступа или некорректностью ссылок прошу сообщить мне.<BR><BR>Обновлены следующие отчёты:<BR><BR>" , Списко отчетов, точнее ссылки на них, и заключение: "<BR><BR><BR><BR>С уважением <BR>аналитик отдела товародвижения<BR><BR>"

Можно как то обозвать начало, отчеты и заключение что бы сократить код?

Как правильно синтаксически не знаю написать. Должно быть на подобии:

А = "Начало письма"
Б = "отчет1"
В = "отчет2"
Г = "заключение"

a = sendEmail("пользователь1@домен.ru", "Отчёты за " & Date & "", "<div style='font: 12pt Verdana'><i> А Б , В Г </i></div>")
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466043
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Im_Max , то есть дату в середину литерала для тебя воткнуть не проблема, а строковую переменную - проблема... не тупи, а?
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466074
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina Im_Max , то есть дату в середину литерала для тебя воткнуть не проблема, а строковую переменную - проблема... не тупи, а?

Код выше писал не я. Я просто добавлял по аналогии новые отчеты или пользователей. Сейчас у меня ошибка - перепонение модуля. Мне его нужно сократить.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466084
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Im_MaxAkina Im_Max , то есть дату в середину литерала для тебя воткнуть не проблема, а строковую переменную - проблема... не тупи, а?

Код выше писал не я. Я просто добавлял по аналогии новые отчеты или пользователей. Сейчас у меня ошибка - перепонение модуля. Мне его нужно сократить.
так, создай новый модуль и перенеси часть процедур в него
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466126
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Im_Maxпропущено...


Код выше писал не я. Я просто добавлял по аналогии новые отчеты или пользователей. Сейчас у меня ошибка - перепонение модуля. Мне его нужно сократить.
так, создай новый модуль и перенеси часть процедур в него

Модуль разбит по дням недели. Можно и разбить. Тогда получится часть программа (например с ПН по СР) будет в одном модуле а часть в другом. С этим будет неудобно работать. Но если другого выхода нет, то так и зделаю. То что я написал в 1-ом посте не возможно реализовать?
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466181
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Im_Maxqwerty112пропущено...

так, создай новый модуль и перенеси часть процедур в него

Модуль разбит по дням недели. Можно и разбить. Тогда получится часть программа (например с ПН по СР) будет в одном модуле а часть в другом. С этим будет неудобно работать. Но если другого выхода нет, то так и зделаю. То что я написал в 1-ом посте не возможно реализовать?
неее, это выше моего понимания ....

ТС, давай сначала !
что ты называешь модулем ?
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466188
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Im_Maxпропущено...


Модуль разбит по дням недели. Можно и разбить. Тогда получится часть программа (например с ПН по СР) будет в одном модуле а часть в другом. С этим будет неудобно работать. Но если другого выхода нет, то так и зделаю. То что я написал в 1-ом посте не возможно реализовать?
неее, это выше моего понимания ....

ТС, давай сначала !
что ты называешь модулем ?

Захожу в Access. Объекты: Таблицы, Запросы, Формы, Отчеты, Страницы, Макросы, Модули
В них хранится код VBA.
Эти программы я запускаю через макросы.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466225
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Im_Max,

авторТогда получится часть программа (например с ПН по СР)
что такое эта "программа" ? это какая-то одна процедура, которая уже перестала "влазить" в модуль ?

покажи часть этой своей программы
она что, в зависимости от дня недели делает совершенно разные вещи ?
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466254
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Im_Max,

авторТогда получится часть программа (например с ПН по СР)
что такое эта "программа" ? это какая-то одна процедура, которая уже перестала "влазить" в модуль ?

покажи часть этой своей программы
она что, в зависимости от дня недели делает совершенно разные вещи ?

Соверщенно верно.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function rassilka()

If Weekday(Date, 2) = 1 Then

Тут идут строки какие я писал в первом посте. Пользователи получают разные отчеты в разные дни недели

End If

If Weekday(Date, 2) = 2 Then

.....................

End If


End Function




Далее что бы его запусти. Создаю макрос. В макросе команда: "Запустить программу". Выбираю "rassilka()". Теперь призапуске макроса идет рассылка отчетов.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466269
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Im_Max
Код: vbnet
1.
2.
3.
4.
5.
If Weekday(Date, 2) = 1 Then

Тут идут строки какие я писал в первом посте. Пользователи получают разные отчеты в разные дни недели

End If



и сколько таких строк
a = sendEmail ( ...
в одном дне ?

только честно ! :)
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466299
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Im_Max
Код: vbnet
1.
2.
3.
4.
5.
If Weekday(Date, 2) = 1 Then

Тут идут строки какие я писал в первом посте. Пользователи получают разные отчеты в разные дни недели

End If



и сколько таких строк
a = sendEmail ( ...
в одном дне ?

только честно ! :)

Ну если это поможет решить мою проблему :)

Пн - 49
Вт - 55
Ср - 67
Чт - 66
Пт - 52
И еще есть ряд правил: в первый день месяца, в 5 день месяца, по ПН четных недель, по ПН нечетных недель и т.д. таких строк еще 55.

До вчерашнего дня я все увеличивал и увеличивал этот модуль. Сегодня он остановился. Нужно его сократить.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466301
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
последний раз я с таким сталкивался лет 20 назад - программа на GWB в 30к строк, 90% которых тупо PRINT... но там хотя бы челу платили за количество операторов в программе...


Im_Max
Затолкай ты эти свои строки ... в таблицу! добавь поле дня недели, буде надо - и вот тебе код в двадцать строк (один цикл по рекордсету) и счастья полные штаны!
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466306
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще немного статистики:

21573 слова
194721 знака с пробелами
215857 знак с пробелами
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466308
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Да я б с удовольствием. Если бы знал как это делается. Человек до меня написал код. Я его просто копирую и дополняю.
Как по другому я не знаю. Поэтому и обратился за помощью на форум.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466331
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, сделай таблицу.

У тебя три параметра у твоей функции - значит, три поля (скажем, Address,Subject,Body) под эти тексты.
У тебя один изменяемый параметр Date - значит, выбери один плейсхолдер (собсно сам литерал Date вполне ничего).
У тебя есть полсотни правил, которые в принципе накрываются где-то 5 полями.

В таблицу занеси свои строки и параметры отбора для них (скажем, для "понедельничных" в поле DayOfWeek ставим единицу, для вторничных соответственно двойку, для второй пятницы ставим не только 5 в поле DayOfWeek, но и 2 в поле WeekOfMonth, и так далее, для нечётной недели делаем ДВЕ записи, совпадающие во всех полях, кроме поля WeekOfMonth - в одной записи там 1, в другой 3...).

Далее - одним оператором считаешь все свои условия отбора (день недели, номер недели и т.п.) на сегодня и тут же строишь строку запроса, которая выдаст тебе только те записи, которые следует обработать сегодня. В нём же заменяешь плейсхолдер на сегодняшнюю дату. Выполняешь запрос, получаешь набор записей за сегодня, уже подготовленный. Осталось в цикле перебирать по одной записи и соотв. значения передавать в сендмайл... И ВСЁ.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466338
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообщем, ТС, этот й.стыд нужно переделывать "на корню"

у тебя же Акцесс, тебе даже не нужно "искать" куда сохранить эти данные, что бы потом прочитать их из процедуры рассылки - всё ж "под рукой"
1
делаешь таб.ТиповРассылки (или ТиповСообщений, или что оно там такое)
idMessage Message1 ...Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Жатецкий_Гусь\[%Date%]_Жатецкий_Гусь.xlsx'>[%Date%] Жатецкий Гусь</a><...2 ...Обновлены следующие отчёты:<BR><BR> <a href='\\fs\Отчеты\Готовые\Остатки_РМ\[%Date%]_остатки_РМ.xlsx'>[%Date%]_остатки_РМ</...3 ....
2
делаешь таблицу получателей писем рассылки
idMail Mail idMessage Mon Thu Wed ... Sun1 пользователь1@домен.ru 1 VV...2 пользователь2@домен.ru 1 V...V3 пользователь3@домен.ru 2 ...V
это не очень правильная табличка, но тебе подойдёт
3
в итоге вся твоя процедура рассылки будет примерно такой
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function rassilka()

dim strSQL as string
dim rs as DAO.recordset
'
strSQL = _
"select a.Mail, replace(b.Message, '[%Date%]', format(date(),'dd\.mm\.yyyy')) as Message " & _
"from ПолучателиРассылки a inner join ТипыРассылки b on a.idMessage=b.idMessage " & _
"where " & Choose (Weekday(Date, 2), "Mon", "Thu", "Wed", ..., "Sun") & " = True"

set rs = currentdb.openrecordset(strSQL)
do while not rs.eof
  a = sendEmail(rs.fields("Mail"), "Отчёты за " & Date & "", rs.fields("Message"))
  rs.movenext
loop
rs.close
set rs = nothing

End Function


4
всё !

зы
пока писал, Akina уже это же предложил,
но что жж я зря "лабал" ))
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466340
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВо-первых, сделай таблицу.

У тебя три параметра у твоей функции - значит, три поля (скажем, Address,Subject,Body) под эти тексты.
У тебя один изменяемый параметр Date - значит, выбери один плейсхолдер (собсно сам литерал Date вполне ничего).
У тебя есть полсотни правил, которые в принципе накрываются где-то 5 полями.

В таблицу занеси свои строки и параметры отбора для них (скажем, для "понедельничных" в поле DayOfWeek ставим единицу, для вторничных соответственно двойку, для второй пятницы ставим не только 5 в поле DayOfWeek, но и 2 в поле WeekOfMonth, и так далее, для нечётной недели делаем ДВЕ записи, совпадающие во всех полях, кроме поля WeekOfMonth - в одной записи там 1, в другой 3...).

Далее - одним оператором считаешь все свои условия отбора (день недели, номер недели и т.п.) на сегодня и тут же строишь строку запроса, которая выдаст тебе только те записи, которые следует обработать сегодня. В нём же заменяешь плейсхолдер на сегодняшнюю дату. Выполняешь запрос, получаешь набор записей за сегодня, уже подготовленный. Осталось в цикле перебирать по одной записи и соотв. значения передавать в сендмайл... И ВСЁ.

Большое спасибо за совет. Запрос который будет выбирать только те письма, которые нужно отправлять сегодня я смогу составить, вместе с остальными данными. А вот как составить этот цикл - понятия не имею. Можно на примере одной строки?
НАпример есть таблица
Пользователь Название письма Тело письма Датапользователь1@домен.ru Отчёты "<div style='font: 12pt Verdana'><i><BR><BR>Здравствуйте...15.11.2013
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466350
Im_Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112вообщем, ТС, этот й.стыд нужно переделывать "на корню"

у тебя же Акцесс, тебе даже не нужно "искать" куда сохранить эти данные, что бы потом прочитать их из процедуры рассылки - всё ж "под рукой"
1
делаешь таб.ТиповРассылки (или ТиповСообщений, или что оно там такое)
idMessage Message1 ...Обновлены следующие отчёты:<BR><BR><a href='\\fs\Отчеты\Готовые\Жатецкий_Гусь\[%Date%]_Жатецкий_Гусь.xlsx'>[%Date%] Жатецкий Гусь</a><...2 ...Обновлены следующие отчёты:<BR><BR> <a href='\\fs\Отчеты\Готовые\Остатки_РМ\[%Date%]_остатки_РМ.xlsx'>[%Date%]_остатки_РМ</...3 ....
2
делаешь таблицу получателей писем рассылки
idMail Mail idMessage Mon Thu Wed ... Sun1 пользователь1@домен.ru 1 VV...2 пользователь2@домен.ru 1 V...V3 пользователь3@домен.ru 2 ...V
это не очень правильная табличка, но тебе подойдёт
3
в итоге вся твоя процедура рассылки будет примерно такой
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function rassilka()

dim strSQL as string
dim rs as DAO.recordset
'
strSQL = _
"select a.Mail, replace(b.Message, '[%Date%]', format(date(),'dd\.mm\.yyyy')) as Message " & _
"from ПолучателиРассылки a inner join ТипыРассылки b on a.idMessage=b.idMessage " & _
"where " & Choose (Weekday(Date, 2), "Mon", "Thu", "Wed", ..., "Sun") & " = True"

set rs = currentdb.openrecordset(strSQL)
do while not rs.eof
  a = sendEmail(rs.fields("Mail"), "Отчёты за " & Date & "", rs.fields("Message"))
  rs.movenext
loop
rs.close
set rs = nothing

End Function


4
всё !

зы
пока писал, Akina уже это же предложил,
но что жж я зря "лабал" ))

Не зря. Пока я доп вопрос писал, на него как раз и ответили.

Akina и qwerty112 ОГРОМНОЕ Вам спасибо. У меня сейчас уже конец рабочего дня. В Пн буду пробывать.
...
Рейтинг: 0 / 0
Сокращение кода VBA
    #38466377
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112пока писал, Akina уже это же предложил,
но что жж я зря "лабал" ))Почему зря? у тебя конкретный код, такая добротная основа для работы ТС. А у меня немного больше проработана система эмуляции крона. Всё вместе должно дать хороший результат, если ТС не протупит.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сокращение кода VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]