1402

Небольшой макрос для ворда

Пока проходил производственную практику возникла необходимость отредактировать около 300 документов в одной папке. Это были доп. соглашения к ТД, но не суть.

В общем, чтобы не париться, я, путем поиска в гугл, создал небольшую форму с макросом для замены текста во всех файлах word (.docx) в определенной папке.


Выглядит это так:

*ниже приложу ссылку для скачивания*

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

Путь до папки копируется прямо из проводника:

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

С пунктами "что заменить" и "на что заменить" я думаю все понятно.

Чекбокс "с задержкой" предназначен для слабых ПК, дабы постоянное открытие и закрытие документов не загружало память. Текстбокс рядом с чекбоксом предназначен для указания задержки в секундах, 3 секунд на самых слабых ПК более, чем достаточно.


Вот как выглядит сам код:


Private Sub CommandButton1_Click()
Dim s As String, fldr As String
fldr = TextBox1.Value & "\"
s = Dir(fldr & "*.doc")
Do While s <> ""
With Documents.Open(fldr & s)
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = TextBox2.Value
.Replacement.Text = TextBox3.Value
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
If CheckBox1.Value = True Then Call idle(TextBox4)
ActiveDocument.Save
.Close
End With
s = Dir
Loop
MsgBox ("Замена завершена!")
End Sub

И код таймера задержки:

Public Sub idle(n As Single)
Dim t As Single
t = Timer + n
DoEvents
Do While Timer < t
Loop
End Sub

Как я уже говорил, части кода взяты с просторов интернета и совмещены в один документ. Вы можете встретить что-то подобное в интернете.


Сделал наглядный пример. Создал несколько документов в папке с текстом:

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

Заменяем:

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

После замены:

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

Документ с макросом вы можете скачать по ссылке: https://yadi.sk/d/58JkrdIXtCTtx

*Работает на версиях MS Office 2010 и 2013. Также необходимо разрешить запуск макросов в настройках безопасности:

Небольшой макрос для ворда Microsoft Word, Макрос, Vba, Длиннопост, Microsoft

Надеюсь, что этот небольшой макрос поможет кому-то сэкономить время и силы при работе с документами :)

Найдены возможные дубликаты

+13
До меня дошло осознание, что 2010 офису уже 6 лет..а я до сих пор на 2007
раскрыть ветку 3
+4

слабак

Иллюстрация к комментарию
-1

Угу, а в институтах и прочих учреждениях только на 2003 сидят. Да и легче в нём работать, честно говоря, - всё на своих местах (хотя есть исключения), логично распределено и легко находится, от дизайна 2007 (и далее) всегда какое-то отторжение.

раскрыть ветку 1
+3

"Раньше было лучше."


На работе 2007-й, дома шестнадцатый. Интерфейс в них полностью настраивается. При желании его можно привести в 95% соответствие с интерфейсом 2003-го. А вот парочки мелких, но полезных функций в 2003-м уже не сыщешь, да и конвертер нужно ставить чтобы научить его открывать *.docx|*.xlsx и т.п. Причем открывать довольно долго все равно.

+12

В начало скрипта добавь Application.ScreenUpdating = False

в конец Application.ScreenUpdating = true


Работать будет быстрее, и на экране ничего мелькать не будет)

раскрыть ветку 3
+7

да, и кстати форму лучше выгружать через Unload formName, а не прятать через Hide

раскрыть ветку 2
+5

Спасибо, поправил:

https://yadi.sk/d/rV3jBL5QtCiN3 - если кому надо

раскрыть ветку 1
+14

"лучше день потерять, зато потом за пять минут долететь"

(С-) Крылья ноги и хвосты

+45

Надо еще прикрутить запуск по дате.

Уволили админа несправедливо, бабац, и через три дня, во всей документации конторы наступил лютейший трешь )


*- хотя... проще наверное скриптом повершелла засунуть все в зип под трехэтажным паролем )))))

раскрыть ветку 32
+7

Будет слишком сложно, имхо)

Я делал макрос с оглядкой на людей, которые особо не разбираются в компе, чтобы после завершения практики можно было юзать этот код :)

В Департаменте были 4 девушки/женщины, которые не знают вообще о макросах

раскрыть ветку 31
+8

Дык четыре строчки в скрипте, один ярлычок и одна задача в планировщике задач ;)


Да вот, к примеру - http://stackoverflow.com/questions/1153126/how-to-create-a-z...  


>_< 

раскрыть ветку 28
0

Привет из 2018! у тебя остался макрос на замену значений в ворде?

раскрыть ветку 1
+5

Сколько времени на изучении VBA мне придется потратить, чтобы самому написать подобный макрос? По работе периодически необходимо подобные операции делать.

раскрыть ветку 8
+1

что бы разобраться то пол года хватит.

при этом сможешь составлять макросы с первой недели а дальше пойдет. но на это нужно время отводить и не 5 минут в день.

раскрыть ветку 6
0

У нас в инсте (мы заочники еще и на СДО) приехали на сессию НА 9 дней, и было 5 лоботокарных по информатике. И за одну лабораторную нас пытались научить это сделать! Большинство справились но уже доделывая дома ))  

раскрыть ветку 5
+1
Я отталкивался от задачи: отредактировать большое количество документов. Гуглил соответствующие темы и по кусочуам собирал подходящие коды, около 4 часов за два дня потратил на это, большую часть времени в гугле
+4

Рядом с вводом имени папки есть смысл разместить кнопочку, которая будет выбор папки делать. Код для примера:

Function GetDirectory()

  With Application.FileDialog(msoFileDialogFolderPicker)

    .Title = "Выберите папку с файлами для замены"

    .ButtonName = "Выбрать"

    .Show

    If .SelectedItems.Count > 0 Then

      GetDirectory = .SelectedItems(1)

    Else

      GetDirectory = Application.Path

    End If

    End With

End Function

раскрыть ветку 1
0
Спасибо, учту :)
+5

1) Documents.Open возвращает документ. Поэтому вместо ActiveDocument.Save лучше просто .Save, т.к. в случае всяких косяков активным может стать другой документ.

2) вместо задержек можно использовать Application.ScreenUpdating = False в начале кода и True в конце, а для индикации сделать маленький прогрессбар

3) В дополнение к п.1: не хватает проверок на корректность: Documents.Open может не сработать ( например, если есть пароль или нет файла по этому пути) и либо вылетит в ошибку, либо вернет Nothing. Для таких целей я писал класс Wrapper, с ним открытие, создание и закрытие попроще будет.


Но это для большей универсальности всё, для частных целей ок ))

раскрыть ветку 1
+3
Первый пункт приму на вооружение, благодарю)
Второй уже подсказали в комментах, там сделал исправленную версию, но все равно спасибо
Насчет третьего: у меня на ~250 документов ошибок не было, запароленных документов не было, т.к. они все типовые, но в след раз, если будет нужно, воспользуюсь советом, спасибо :)
+2

когда-то понадобилось отправить на печать только первую титульную страницу в 100+ документах

https://1drv.ms/u/s!AnTy4WPaWM0UguIhmrfp2KMfvstWQA

раскрыть ветку 4
-1

Неплохо, я тогда код в посте использовал еще для печати, меняя процесс замены на печать, только форму не создавал.

Если кому надо, могу сделать похожую форму, с указанием номеров страниц и количеством копий :)

раскрыть ветку 3
0

а что в коде надо поменять,что бы печатал по 3 копии каждого файла,я чет туплю и не могу понять)

0

а есть возможность создать макрос, чтобы печатал все страницы, кроме некоторых в документе? диапазоном очень неудобно задавать.

раскрыть ветку 1
+2

А самое главное нужно побольше таких менеджеров, которые не стесняются что-то поискать и что-то сделать. Основная масса думает что это всё работа админа (компьютерщика), и даже не это а куда проще, изменить шрифт, создать таблицу. часто до идиотизма доходит. Типа
"- Чувааааак, почини мне стол!
- АйТи этим не занимается.
- Но он же компьюуууутерный!"


Это я вам как админ говорю.


У меня был случай когда секретарша пыталась напрячь меня текст набрать, только потому что я это сделаю быстрее...

А так БРАВО таким менеджерам!!!

раскрыть ветку 1
+1

"ой ну прекрати"


А вообще, судя по моим одногрупникам, я скорее исключение, из 14 человек 10 вообще бы не догадались о возможной автоматизации и вручную редактировали каждый документ (ну или обратились бы к АйТи :) )

Проходил практику вместе с одногрупником, он вручную хотел начать это делать

+2

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

+2

Есть старая студенческая байка о том, как студенту нужно было сдавать курсовой или что то типа того на автомобильную тематику, а он его не сделал. Пытаясь выйти из ситуации, он в курсовом своего одногрупника заменил автозаменой слово "Водитель" на слово "Слесарь" и пошел сдавать, надеясь что преподаватель не будет его даже открывать. И преподаватель не открыл. Потому что этого не потребовалось. На титульном листе красовалась строчка "Рукослесарь проекта: ..."))

+2

Спасибо. Только вчера столкнулся с такой задачей. Жаль немного опоздал =С

+2

как хорошо, что notepad++ умеет это всё стоково)

особенно мне нравится там запись макросов вживую с последующим воспроизведением

раскрыть ветку 10
+1

Запись макросов есть и в офисе. Тут дело в том, что надо было исправить около 250 документов, и запись макросов слабо поможет в этом деле.

раскрыть ветку 8
+3

дык в notepad++ есть кнопка "заменить во всех открытых документах" и даже просто "в папке"


но я не сравнивал эти два редактора, у них разное предназначение, просто к слову пришлось

раскрыть ветку 7
0

Макрорекордер есть и в ворде и в экселе

+1

Спасибо большое, автор, мне уже пригодилось!

+1
Спасибо!
+1

Привет, а не проще было сразу готовое решение найти? Вот быстрое гугление куда ведет: http://chris-nullpayload.rhcloud.com/2012/07/find-and-replac...

(там на power shell, но вроде должно работать)

раскрыть ветку 3
0
раскрыть ветку 2
+1

Сори, проглядел :)

раскрыть ветку 1
+1

'... Call idle(TextBox4)'

Думаю должно быть TextBox4.Value. Хотя приведение типа к Single при вызове функции возможно само вызывает геттер.

раскрыть ветку 1
0

Да, по умолчанию берет именно значение текстбокса

+1

Наивный. теперь будешь пахать на всех фронтах с документами. будешь  "тыжпрограммистом"

раскрыть ветку 2
+2
У него производственная практика. Скоро закончится и он свалит от туда.
раскрыть ветку 1
+1
Уже закончилась)
+1

наконец сяду и сделаю курсач

+1
Красавчег
+1

Не знаю, насколько это применимо к файлам *.docx, но для экономии памяти компьютера можно исправлять данные (по крайней мере .xlsx), не открывая их напрямую, что на порядок сокращает время работы программы при работе с большим количеством файлов.

раскрыть ветку 4
+2

Насколько я знаю, они хранятся в виде xml-таблиц, поэтому возможно такое редактирование. Вот насчет ворда, не думаю, что такое возможно

раскрыть ветку 3
0

docx это ж zip с xml, так что надо распаковывать

раскрыть ветку 2
+1

Всё-таки это очень рисково менять набор символов, на другой, фиг знает что там может попасться, данное решение - только если на 100% уверен в уникальности текста (ну типа название продукта на аналогичный).

раскрыть ветку 1
+2

Да, можно испортить документ, необходимо абсолютно уникальный кусок текста указать, специально для этого оставил такую большую форму

0

Так это макрос, или скрипт?

раскрыть ветку 1
0

Макрос

0

небольшая опечатка и всё в труху XD зашибись

раскрыть ветку 2
0

Ну даже если сделал опечатку, просто заменяешь таким же образом текст с опечаткой на правильный

раскрыть ветку 1
+1

попробуй в библии заменить слово "бог" на "дьявол", а потом "исправить" :)

но я в основном про код - из таких скриптов и рождаются шифровальщики

0

Я решал похожую задачу, надо было провести множество замен в одном файле. Типа автопереводчика по заданному словарю из файла mdb. С увеличением количества слов работает все медленнее. Можно ли как-то ускорить? ScreenUpdating не помог.

0

А есть нечто подобное для Excel?

0

А как же замена по регулярным выражением? это могло бы очень сильно увеличить функциональность вашей программулины. P.S.: гугдится как RegExp

0
Чет не понял прикола)
В ворде есть стандартный инструмент по замене слов во всем тексте)
раскрыть ветку 1
0
возникла необходимость отредактировать около 300 документов в одной папке
0

а можно сделать такой же только для visio? очень надо)

0

Всем здравствуйте.


Пожалуйста, у кого осталось, перезалейте макрос, а то по ссылке автора

https://yadi.sk/d/58JkrdIXtCTtx

пишется

Начало цитаты

Ничего не найденоВладелец удалил файлы либо закрыл к ним доступ или в ссылке опечатка.Конец цитаты

Пожалуйста, очень нужно

Спасибо.

0

А может кто сделать подобное для ексель или там тот же макрос можно использовать?

раскрыть ветку 2
0

Попробуй заменить строчку s = Dir(fldr & "*.doc") на s = Dir(fldr & "*.xlsx")

Думаю, должно работать

раскрыть ветку 1
0

а если замена еще и по всей книге, то есть по вкладкам внутри одного файла?

0

Псст, привет!
У тебя сохранились исходники? Ссылки битые, а поглядеть интересно :с

раскрыть ветку 2
0
Привет! К сожалению, уже нет, недавно чистил яндекс диск, места не хватало. Исходников нет, к сожалению, только если по скринам восстанавливать
раскрыть ветку 1
0

места не хватало, и ты поудалял срипты на ворд? моя жизнь никогда не будет прежней

+1

Сгодится, молодец!

0
Вот и нашелся автор знаменитых шедевров от энци.ру! http://lurkmore.to/Энциклонг
-1

ьлд

-1
Слияние документов: шаблон в ворде, тексты для подстановки - в Excel. Пользуюсь этим вариантом.
раскрыть ветку 1
+1
Не получилось бы в моем случае, т.к. у разных сотрудников может отличатьсясоглашение, у кого-то нет определенных пунктов, у других эти пункты другие и т.д.
-5

Вау, обязательно выложи это на github!

ещё комментарий
-2

интересно конечно как автор отредактировал множество файлов типа: word (*.docx), кодом который эти файлы будет просто напросто игнорировать все.

раскрыть ветку 1
+1

Почему будет игнорировать? У меня все работало

-1

https://findandreplace.codeplex.com/

То же самое, еще и регекспами (но может я не до конца понял что там с макросами:))

-4

а не проще  в ворде нажать ctrl+h ??

раскрыть ветку 3
+3

У меня в папке было около 250 документов, которые нужно было править. Конечно можно открывать каждый и нажимать ctrl+h, но я решил облегчить себе задачу :)

раскрыть ветку 2
0

Хм, ну может, но ты ж потом проверил те документы? или надеешься что никаких глюков не было?

раскрыть ветку 1
-3

Ну кто так оформляет код?!

раскрыть ветку 7
+3

Да вроде нормально выглядит, даже пояснения сделал :(

Иллюстрация к комментарию
раскрыть ветку 6
0

Не, ну тут порядок.

Я про отступы в посте

Иллюстрация к комментарию
раскрыть ветку 1
-2

PS Не понимаю как работает счетчик "s".

s=*.doc


делать пока s<>пустому месту.



но почему s меняется, если * - означает любые символы. Теоретически, оно должно бесконечно открывать один и тот же файл

раскрыть ветку 3
Похожие посты
269

Редизайнер таблиц в Excel

Не секрет, что большинство пользователей Excel, создавая таблицы на листах, думают в первую очередь о собственном комфорте и удобстве. Так рождаются на свет красивые, со сложными "шапками", пестрые и громоздкие таблицы, которые при этом совершенно нельзя ни отфильтровать, ни отсортировать, а про автоматический отчет сводной таблицей лучше и не думать вообще.


Рано или поздно пользователь такой таблицы приходит к мысли, что "пусть будет не так красиво, зато можно работать" и начинает упрощать дизайн своей таблицы, приводя его в соответствие с классическими рекомендациями:

- простая однострочная шапка, где у каждого столбца будет свое уникальное название (имя поля)

- одна строка - одна законченная операция (сделка, продажа, проводка, проект и т.д.)

- без объединенных ячеек

- без разрывов в виде пустых строк и столбцов


Но если сделать однострочную шапку из многоэтажной или разбить один столбец на несколько достаточно просто, то реконструирование таблицы может занять много времени (особенно при больших размерах ). Имеется ввиду следующая ситуация:

из такой таблицы

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

сделать

Редизайнер таблиц в Excel Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

В терминах баз данных нижнюю таблицу обычно называют плоской (flat) - именно по таким таблицам лучше всего строить отчеты сводных таблиц (pivot tables) и проводить аналитику.


Преобразовать двумерную таблицу в плоскую можно при помощи простого макроса. Откройте редактор Visual Basic через вкладку Разработчик - Visual Basic (Developer - Visual Basic Editor) или сочетанием клавиш Alt+F11. Вставьте новый модуль (Insert - Module) и скопируйте туда текст этого макроса:

Sub Redesigner()

Dim i As Long

Dim hc As Integer, hr As Integer

Dim ns As Worksheet

hr = InputBox("Сколько строк с подписями сверху?")

hc = InputBox("Сколько столбцов с подписями слева?")

Application.ScreenUpdating = False

i = 1

Set inpdata = Selection

Set ns = Worksheets.Add

For r = (hr + 1) To inpdata.Rows.Count

For c = (hc + 1) To inpdata.Columns.Count

For j = 1 To hc

ns.Cells(i, j) = inpdata.Cells(r, j)

Next j

For k = 1 To hr

ns.Cells(i, j + k - 1) = inpdata.Cells(k, c)

Next k

ns.Cells(i, j + k - 1) = inpdata.Cells(r, c)

i = i + 1

Next c

Next r

End Sub

После этого можно закрыть редактор VBA и вернуться в Excel. Теперь можно выделить исходную таблицу (полностью, с шапкой и первым столбцом с месяцами) и запустить наш макрос через Разработчик - Макросы (Developer - Macros) или нажав сочетание Alt+F8.


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


Также есть второй вариант для работы с большими таблицами

Sub Redesigner()

Dim inpdata As Range, realdata As Range, ns As Worksheet

Dim i&, j&, k&, c&, r&, hc&, hr&

Dim out(), dataArr, hcArr, hrArr

hr = Val(InputBox("Сколько строк с подписями данных сверху?"))

hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))

Set inpdata = Selection

If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub

Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)

dataArr = realdata.Value

If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value

If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value

ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)

Set ns = Worksheets.Add

For i = 1 To UBound(dataArr, 1)

For j = 1 To UBound(dataArr, 2)

If Not IsEmpty(dataArr(i, j)) Then

k = k + 1

For c = 1 To hc: out(k, c) = hcArr(i, c): Next c

For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r

out(k, c + r - 1) = dataArr(i, j)

End If

Next j, i

ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out

End Sub

Редизайн таблиц сэкономит кучу времени, нервов и сил, чтобы в оставшееся время почитать пикабу))

Взято отсюда

Показать полностью
87

VBA Excel - вывести формулы в ячейки

Была задача по переносу вычислений из экселя. Чтобы не лезть и не смотреть формулу в каждой ячейке я написал небольшой макрос, который их выводит.

Ниже выделенного диапазона на 10 строк выводятся все формулы и значения из заполненных ячеек.

Получается вот такая штука, которую гораздо проще разобрать и перенести

VBA Excel - вывести формулы в ячейки Excel, Vba, Макрос

Сам макрос:

Sub DrawFormulas()
For Each Cell In Selection
CellFormula = Cell.Formula
If Left(CellFormula, 1) <> "=" Then CellFormula = "=" + CellFormula
If Trim(CellFormula) <> "=" Then Cell.Offset(Selection.Rows.Count + 10).Value = Cell.Address + CellFormula
Next
End Sub

591

Отслеживание входа пользователей в книгу Excel

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


Этап 1. Создаем "Лог"

Добавим в нашу книгу новый лист, куда будет записываться информация о всех пользователях и назовем его, например, Лог. На нем создадим простую шапку будущего журнала учета посетителей:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 2. Макросы фиксации входа-выхода

Теперь добавим макросы для записи на лист Лог даты-времени и имен пользователей при открытии и закрытии книги. Для этого нужно открыть редактор Visual Basic с помощью сочетания Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer) и найти в левом верхнем углу панель Project (если она не отображается, то включить ее можно сочетанием клавиш Ctrl+R):

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Двойным щелчком откройте модуль ЭтаКнига (ThisWorkbook) и вставьте туда пару наших макросов для обработки событий открытия и закрытия книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow>1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub

Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

End Sub

Попробуйте открыть-закрыть этот файл пару раз и убедитесь, что на лист Лог попадает ваше имя пользователя (логин входа в Windows) и дата-время:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 3. Улучшаем надежность

Можно было бы скрыть лист Лог и на этом остановиться, но есть одно "но": если у пользователя, который открывает нашу книгу, макросы разрешены по умолчанию либо он сам их разрешает, нажав в окне предупреждения на кнопку Включить содержимое, то все в порядке:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Но что если пользователь не разрешит выполнение макросов или они отключены у него по умолчанию? Тогда наши макросы отслеживания выполняться не будут и фиксации имени и даты не произойдет :( Как же заставить пользователя разрешить использование макросов?

Чтобы обойти эту проблемку воспользуемся небольшой тактической хитростью. Добавьте в нашу книгу еще один чистый лист, назовите его Предупреждение и вставьте на него следующий текст:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Суть в том, чтобы по умолчанию скрыть в книге все листы кроме этого, а рабочие листы с данными отображать с помощью специального макроса. Если пользователь не разрешил выполнение макросов, то он увидит в книге только один лист с предупреждением. Если же макросы разрешены, то наш макрос обработки события открытия книги скроет лист с предупреждением и отобразит листы с данными. Чтобы пользователь сам не отобразил их - используем суперскрытие вместо обычного скрытия листов (параметр xlSheetVeryHidden вместо обычного False).

Чтобы реализовать все описанное, слегка изменим наши процедуры в модуле ЭтаКнига (ThisWorkbook)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'скрываем все листы, кроме листа ПРЕДУПРЕЖДЕНИЕ

Worksheets("Предупреждение").Visible = True

For Each sh In ActiveWorkbook.Worksheets

If sh.Name = "Предупреждение" Then

sh.Visible = True

Else

sh.Visible = xlSheetVeryHidden

End If

Next sh

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub


Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

'отображаем все листы

For Each sh In ActiveWorkbook.Worksheets

sh.Visible = True

Next sh

'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ

Worksheets("Предупреждение").Visible = xlSheetVeryHidden

Worksheets("Лог").Visible = xlSheetVeryHidden

End Sub

Чтобы просмотреть скрытый Лог откройте редактор VisualBasic (Alt+F11), выделите лист на панели Project и измените его видимость на панели Properties, используя свойство Visible:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Если пользователи настолько продвинутые, что знают про суперскрытые листы и могут их отобразить через редактор Visual Basic или нарушить работу наших макросов, то можно дополнительно поставить пароль на просмотр и изменение макросов. Для этого щелкните правой кнопкой мыши по имени файла в панели Project (строка VBAProject (blackbox.xls)), выберите команду VBA Project Properties и включите флажок Lock project for viewing и задайте пароль на вкладке Protection:

Отслеживание входа пользователей в книгу Excel Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Теперь точно никто не уйдет безнаказанным.


Интересные поправки в макрос из комментария источника:

Вместо поиска последней занятой строки в таких случаях я обычно вставляю новую строку сразу после "шапки". Все предыдущие строки сдвигаются вниз, конечно. В результате немного упрощается код, сортировка получается обратная, "новые сверху", что позволяет быстрее просматривать последние записи, не прокручивая лист. При открытии - вставляется строка, её номер всегда будет 2. При закрытии файла в строку 2 добавляется время. Переполнение этого стека маловероятно, но и проверку такого переполнения проводить не нужно, просто отрезать строки ниже запланированного количества записей, без проверки.

Private Sub Workbook_Open()

Worksheets("Реестр изменений").Rows("2:2").Insert Shift:=xlDown 'вставляем между строками 1 и 2 новую строку

Worksheets("Реестр изменений").Rows("501:501").Delete Shift:=xlUp 'удаляем строку 501 (реестр на 500 строк)

Worksheets("Реестр изменений").Cells(2, 1) = Environ("USERNAME") 'запись в первую ячейку второй строки

Worksheets("Реестр изменений").Cells(2, 2) = Now 'запись во вторую ячейку второй строки

Показать полностью 5
160

Макрос для выделения дубликатов разными цветами

Как известно, чтобы выделить дубликаты цветом в Excel можно воспользоваться специальной опцией в «условном форматировании».

Достаточно выделить диапазон, задать цвет заливки, - и все повторяющиеся (или, наоборот, уникальные) значения будут выделены.

Но иногда требуется, чтобы различные повторяющиеся значения были выделены РАЗНЫМИ ЦВЕТАМИ.

В этом случае, без макросов не обойтись. Нажимаем сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставляем новый пустой модуль через меню Insert - Module и копируем туда код этого макроса:

Sub ВыделитьДубликатыРазнымиЦветами()

On Error Resume Next

' массив цветов, используемых для заливки ячеек-дубликатов

Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _

9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

Dim coll As New Collection, dupes As New Collection, _

cols As New Collection, ra As Range, cell As Range, n&

Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange)

If Err Then Exit Sub

ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False

For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes

Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)

If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)

Next cell

For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов

n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1

Next

For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет

cell.Interior.color = cols(CStr(cell.Value))

Next cell

Application.ScreenUpdating = True

End Sub

Теперь можно выделить любой диапазон с данными на листе и запустить макрос с помощью сочетания клавиш Alt+F8 или через кнопку Макросы (Macros) на вкладке Разработчик (Developer).

Макрос для выделения дубликатов разными цветами Excel, Макрос, Vba, Полезное, На заметку

Плюсом этого макроса является то, что он не виснет при выделении всего листа (или столбца) целиком и не вылетает с ошибкой, если найдено более 55 дубликатов. Макрос взят здесь

Показать полностью 1
246

Стили в Microsoft Word

В Microsoft Word есть очень мощный и полезный инструмент, который называется "Стили". Когда я только начинал плотно работать в word'е - казалось, что стили - это очень сложно и непонятно, поэтому старался их не использовать. Но разобравшись, я понял, что там всё очень просто и хочу вам сейчас это показать.


Для чего вообще нужны стили?

Часто при работе есть необходимость сделать отдельное форматирование для заголовков разного уровня (разные отступы от края, разный размер шрифта, разное начертание), для названий таблиц и фигур (например, убрать интервал после абзаца, чтоб название и тело таблицы были как-бы склеенные), просто если вы хотите выделить некоторые места в тексте другим шрифтом, отступом, кеглем.

Стили в Microsoft Word Microsoft Word, Microsoft, Видео, Длиннопост

Давайте для начала зададим стили для трех уровней заголовков, для этого просто разметим их, как нам будет удобно

Когда вас устраивает, как выглядят заголовки, можно приступать к созданию стилей, а тут всё очень просто)

Ставим курсор в любое место в тексте первого заголовка (должна мигать вертикальная палочка), далее делаем последовательность действий:

1. переходим в расширенный список стилей

2. нажимаем "Создать стиль"

3. задаем имя (желательно сначала ставить цифру, затем текст - так заметней  и удобней при работе)

4. нажимаем "Ок"

Стили в Microsoft Word Microsoft Word, Microsoft, Видео, Длиннопост

в работе для удобства и скорости я обычно стили заголовков называю "1", "1.1", "1.1.1" - так быстрее и наглядней)

Теперь самое интересное - как нужный текст сделать заголовком из созданных стилей? Просто поставить курсор в нужное место и выбрать из галереи стилей нужный вам ранее созданный стиль.

Вот так вот все просто)



Еще один существенный бонус использования стилей для заголовков - потом очень просто собрать оглавление. Для этого ставим курсор в место, куда хотим вставить оглавление, переходим во вкладку "Ссылки", нажимаем "Оглавление", затем выбираем пункт "Настраиваемое оглавление"

Стили в Microsoft Word Microsoft Word, Microsoft, Видео, Длиннопост

Во всплывающем окне сразу переходим в параметры, там вписываем уровни заголовков цифрами (1,2,3), нажимаем 2 раза "ок"

Уточнение: цифры со стилей стандартных заголовков можно не убирать - мы их не используем и они нам никак мешать не будут

Стили в Microsoft Word Microsoft Word, Microsoft, Видео, Длиннопост

Получится такое вот стандартное оглавление

Стили в Microsoft Word Microsoft Word, Microsoft, Видео, Длиннопост

Еще один бонус от использования стилей заключается  в том, что вы в любой момент можете внести в него изменение, если что-то вас перестало устраивать и обновить сам стиль - в этом случае изменения внесутся во все заголовки (или просто текст), которые используют конкретно этот стиль. Чтобы это сделать, просто внесите нужные вам изменения, а затем в галерее стилей выберите активный, нажмите правую кнопку мыши и выберите пункт "обновить "название_стиля" в соответствии с выделенным фрагментом"

Спасибо за внимание!

Надеюсь, кому-нибудь пригодится)

Показать полностью 4 2
319

Word, excel - добавление часто используемых функций в панель быстрого доступа

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

Выглядит это вот так:

Word, excel - добавление часто используемых функций в панель быстрого доступа Microsoft, Microsoft Word, Excel, Powerpoint

Чтобы это сделать, наведите курсор на нужную вам функцию и нажмите правую кнопку мыши. Во всплывающем окне выберите первую команду.

Word, excel - добавление часто используемых функций в панель быстрого доступа Microsoft, Microsoft Word, Excel, Powerpoint

Также, в эту панель можно добавлять и макросы. Для этого нужно перейти в параметры Word (Excel, PowerPoint) и выбрать там пункт "Панель быстрого доступа", либо нажать крайнюю правую кнопку на панели и там выбрать пункт "Другие команды" :

Word, excel - добавление часто используемых функций в панель быстрого доступа Microsoft, Microsoft Word, Excel, Powerpoint

Появится окно параметров. Тут нужно будет сделать последовательность действий:

1. выбрать из всплывающего списка пункт "Макросы"

2. выбрать макрос, который вы хотите добавить на панель быстрого доступа

3. нажать "Добавить"

4. нажать "Ок"

Word, excel - добавление часто используемых функций в панель быстрого доступа Microsoft, Microsoft Word, Excel, Powerpoint

Может быть, кому-то будет полезно)

Показать полностью 1
995

Наша победа! Сообществу быть!

Уважаемые подписчики, спешу вас обрадовать @SupportCommunity разрешил создать сообщество посвящённое Office. Спасибо вам за поддержку))


Сообщество будет посвящено MS Office, Libreoffice и Google docs.


Я хочу чтобы сообщество приносило пользу многим, дабы облегчить работу офисному брату))


Тех кто владеет Libreoffice и Google docs призываю вас быть активней, сообществу понадобятся модераторы, чтобы следить за порядком и публиковать полезные посты.


Ссылка на сообщество MS, Libreoffice & Google docs

8268

Лига Microsoft Office

Лига Microsoft Office Сообщество, Microsoft, Microsoft Word, Excel

Уважаемая администрация сайта и подписчики, я хочу создать Лигу Microsoft Office, в которой будут размещаться посты про Word, Excel, Access, Power Point, Outlook, Publisher и др., где пользователи смогут узнать что-то новое или поделиться своим опытом.

В настоящее время на сайте имеется много постов про Word и Excel, но они не систематизированы, однако тема интересна и заслуживает отдельного внимания. В этом сообществе я планирую публиковать обучающие посты про Excel. Кто-то также может выкладывать полезные статьи, которые пригодятся пользователям Пикабу.

Тем кому будет не интересна данная тематика смогут поставить сообщество в игнор.

Ссылки на мои посты:

Секционные диаграммы

Диаграмма «Шкала»

Диаграмма «Торнадо»

Диаграмма «план-факт»

Мгновенное заполнение в Excel

Остальные опубликованы в сообществе "Лайфхак"
Ссылка на сообщество MS, Libreoffice & Google docs

1034

Не только финансовая система может держаться на Excel

(Офисной оптимизации пост, точнее, об одном из инструментов этой самой оптимизации)


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

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Так вот, многие даже и не подозревают, сколько всего может на нём держаться, - не только российская мировая финансовая система, но и, например, целый каскад программного обеспечения в какой-нибудь организации. Сам я работал айтишником в одной организации и ввиду специфики работы всей компании, довелось разрабатывать ПО (программное обеспечение) на Excel (да, на этих страничках с табличками, где, как я думал ещё в школьные годы, проводятся всякие узкоспециализированные записи, ну кто будет оформлять документ в какой-то неудобной таблице), профи в области Excel себя не считаю, ибо есть куча белых пятен вроде финансовых функций и надстроек в которых всегда найдутся люди, которые разбираются лучше меня. Но это так, отступление.

Сами по себе формулы - очень мощный инструмент, на умении их использовать вывезло столько оптимизаторов, не владеющих программированием, что, думаю, нет еще офиса, где какой-нибудь местный Кулибин в обеденный перерыв не замутил еще какую-нибудь узкоспециализированную считалку для отдела. Но, работая с большими массивами возникает ряд проблем в использовании формул: относительность (ты получаешь не строку информации в базе данных, а динамичный результат вычисления) и оптимизация. Да, оптимизация на нескольких тысячах строк с десятком колонок и, допустим, парой связанных таблиц, это беда. Такая связка на i3 4гб оперативы просто будет повергать бедный офисный комп в ужас, заставляя его терять сознание при каждом пересчете и вылетать, если ты нарушил священный ритуал пятиминутного сохранения (знал я одного мужика, у него была такая формульная портянка, что сохранял базу он лишь два раза в день, перед обедом и уходя домой, ибо на сохранение уходило минут 20, ненавидели мы его все, ибо, уходя в отпуск, он оставлял это чудище кому-то из нас). Специфика работы была такова, что интернета у нас не было, а стороннее ПО нельзя - пользуйтесь чем дали. Окей, но автоматика же нужна, без неё никуда, потому пришлось использовать то, что есть и открывается это:

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Разработчикам показалось мало создать мощный инструмент формул, они решили впаять в и так могущественное ПО целый язык программирования (точнее его диалект) VBA (Visual Basic for Application), возможность подключать модули с других языков, использовать API (хоть и работает это ИМХО через жопу) и встроенную среду разработки (а это означает, что вообще ничего не надо качать, если у Вас есть офис, значит все что нужно, чтобы стать мамкиным программистом уже есть). Но что нам это даёт? Огромные (ну это как посмотреть) возможности для разработки ПО, преимущественно узкоспециализированного, без использования чего-либо кроме Excel; базы данных? О чём речь, Excel - это и есть БД (то ещё извращение, но для утонченных можно связать с Access или Sql), возможность проводить расчёты (циклы, тонкие переборы, фильтрация) над большими массивами информации в кустарных условиях, использовать встроенные библиотеки для работы с другими приложениями (самое важное - MS Word), возможность наконец применить Visual Basic, который ты учил лет 20 назад, а он нигде так и не пригодился, ну и самое главное, научиться основам программирования, если ты что-то шаришь, но твои лучшие успехи - верстка шаблонов сайтов на HTML, CSS с вкраплениями PHP. Также это нам даёт возможность кодить на ведре (прям совсем ведре-ведре). VB хоть и относится к ООП, но де-факто работа в нём редко сводится к пользовательским классам, всяким тонкостям и т.д., в основном он ощущается как скриптовый язык, работа приходит к чему:

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

накидать разных элементов управления (это если у нас пользовательская форма, если просто код, то вообще просто запихать всё в модуль) и привязать к ним обработчики событий. Вкурил в циклы, условные конструкции, чутка простого синтаксиса и на рабочий телефон уже звонят из Майкрософт и предлагают тебе перейти к ним (Нет). Но не буду вдаваться в разработку ведь не об этом пост, что из этого можно получить на практике? Рабочие программы с базами данных и пользовательским интерфейсом (чтобы упростить и ограничить взаимодействие пользователя с данными) или скрипты для обработки целой тонны упорядоченной (а может и нет, слава условным конструкциям) информации. Например (набросал за минуту, палками не бить):

Не только финансовая система может держаться на Excel Excel, Программирование, Офис, Оптимизация, Visual Basic, Макрос, Microsoft Word, Ms Office, Длиннопост

Немного возни и у нас есть пользовательская форма со списком сотрудников и полями, которые надо заполнить, на выходе по нажатию кнопки мы получаем готовую вордовскую справку. Для этого нужен лист с данными сотрудников, лист список справок и шаблон MS Word. Готово, вы бог офисной оптимизации. И так можно многое: отчёты, справки, товарные чеки, письма, документы разные, приказы целые, любые действия с информацией.

Сразу предупрежу всех, кто уже нацелился писать "на кой хрен ты раскопал этот старый кусок говна на заре 30го десятилетия 21го века". Пост чисто информативный, это не гайд, не самоучитель, может кому интересно, на прорыв в IT сфере ни разу не претендует, это раз, есть в нашей стране места, где развитие этой сферы отстаёт как раз на эти 20 лет, это два, ну и просто, может кому понадобится, может кто-то захочет на работе чему-то подучиться.
Какие минусы? Оптимизация всё равно сосёт бибу (но не такую, как формулы), безопасность тоже, чисто теоретически можно использовать криптографическое шифрование БД и расшифрование в ходе работы, но я не проверял, можно ли легко вскрыть защиту самого VBA проекта, да и оптимизация пососёт ещё большую бибу (да и вообще, кому это надо, ребят, это же Excel), ну а стандартную Excel защиту листов можно вскрыть обычным архивом и блокнотом. Также, недостатком я считаю ряд ограничений среды, по типу того, что без API не работает прокрутка колёсиком мыши, стабильность - excel иногда любит чудить. Совместимость - отдельные танцы с бубном для x64 и x32 (но это если используете сторонние API, модули). Ну и объяснять людям, как разрешить запуск макросов :D.
Спасибо, если дочитал этот длинный (и наверное скучный) пост до конца, если вдруг кому стало интересно могу написать ещё много чего, например, как написать сапёр на Excel, как сделать различные простенькие, но очень нужные офисные программки, как научиться этому (но.. зачем?), как использовать макрорекордер и много чего ещё, связанного с Excel. А ведь это всё ещё цветочки, есть люди, которые целые стратегические пошаговые игры в ячейках писали на том же VBA.

P.S. Если ты профи, знаешь больше и лучше меня, и видишь, что я в чём-то неправ - поправь, буду рад.

Показать полностью 3
101

Основы программирования в Microsoft Word. Работа с макросами

Предыдущие статьи:

1. Учимся работать в Microsoft Word правильно

2. Учимся работать в Microsoft Word правильно. Работа с рисунками

3. Учимся работать в LibreOffice Writer правильно


В этом уроке мы разберем среду для редактирования макросов, изучим некоторые базовые команды и научимся запускать макросы с помощью горячих клавиш.

Основное меню для работы с макросами расположено в «Вид – Макросы».

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Как записывать макрос мы разбирать не будем, потому что это слишком просто и описано уже миллион раз. Вместо этого мы будем учиться писать макросы самостоятельно.

Макросы в MS Word пишутся на упрощенной реализации языка Visual Basic – VBA

или сисярпе. В данном уроке мы написание макросов на сисярпе разбирать не будем – я этого языка попросту не знаю, т. к. не питаю особенно теплых чувств к разработкам Microsoft.

Для данного урока я написал следующие макросы, помогающие исключить из работы всплывающие окна с последующим выбором из списков (что отнимает уйму времени):


1. Для вставки нумерации рисунков и таблиц (бывает полезно, когда приходится оживлять чужой документ, набранный на печатной машинке производства Microsoft);

2. Для вставки подписей к рисункам и таблицам вида «Рисунок 1 – » и «Таблица 1 – »;

3. Для вставки ссылок на нумерацию рисунков и таблиц вида «°Рисунок , «°Таблица , где перечеркнутый текст имеет тип «hidden», то есть мы автоматизируем то, что делали вручную в статье «Учимся работать в Microsoft Word правильно. Работа с рисунками».


Велик соблазн хранить все макросы в отдельном шаблоне global_macros.dotm, как это описано здесь. Но, как выяснилось, работает это только в MS Office for MAC.

Под Windows, после переноса файла global_macros.dotm в папку STARTUP (C:\Documents and Settings\{{user}}\Application Data\Microsoft\Word\STARTUP),

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
MS Word видит этот шаблон, но в окне «Вид – Макросы» создать, изменить или удалить макросы из global_macros.dotm мы не можем.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Также при нажатии на кнопку «Отладка» мы получаем сообщение «Project is unviewable».
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Настроек, подобных «Личные параметры – Расположения файлов» в Microsoft Word 2013 for Windows я не обнаружил (возможно, это уже реализовано в MS Word 2016 или 365). Поэтому, в качестве более универсального решения, я рекомендую добавлять макросы в базовый шаблон Normal.dotm с помощью редактора Microsoft Visual Basic for Applications, который открывается из MS Word с помощью комбинации клавиш «Alt + F11».


Из-за проблем с кодировкой копировать код с русскими буквами нужно только при включенной русской раскладке.

Более хирургические варианты решения этой проблемы описаны тут.


Итак, с помощью контекстного меню «Insert – Module» к шаблону «Normal» добавляем новый модуль, в который мы будем копировать скрипт.

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
У меня этих модулей 6 штук,
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
но можно все процедуры, начинающиеся с команды Sub, поместить и в один модуль.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
После того, как мы скопируем все процедуры в шаблон Normal.dotm, мы должны увидеть в окне «Вид – Макросы» что-то типа этого.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Велик соблазн написать название процедуры по-русски, чтобы название макроса по-русски же отображалось в меню «Вид – Макросы», но не делайте этого, потому что у вас случайным образом перестанут работать горячие клавиши, назначенные на запуск макросов.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Этот эффект лично у меня проявился не сразу (через несколько дней после начала работы с макросами, изначально все назначенные горячие клавиши работали как надо), но он исчез сразу после того, как я переименовал все процедуры.

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

Для этого переходим в «Файл – Параметры – Настроить ленту – Сочетания клавиш: Настройка...»

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Затем слева в окне «Настройка клавиатуры» выбираем «Макросы», а справа макрос, для запуска которого мы хотим назначить комбинацию клавиш.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Поместив курсор в поле «Новое сочетание клавиш» и набрав его на клавиатуре, нажимаем «Назначить». На данный момент все наиболее удобные комбинации клавиш в MS Word уже назначены разработчиками, но Вы можете спокойно переназначить те из них, которые Вы не используете.
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

В данном примере мы теперь можем добавить подпись к таблице комбинацией клавиш «Ctrl + Shift +ю».


Теперь разберем три из шести написанных макросов для рисунков (макросы для таблиц абсолютно аналогичны).


В принципе, программирование на бейсике особо ничем не отличается от программирования на остальных языках. Современный бейсик похож на Python и Ruby тем, что в нем используются отступы. Комментарии (неисполняемые строки) начинаются с одинарной кавычки.


Как я уже упоминал, процедура в VBA начинается со слова Sub, и заканчивается End Sub.

Переменная объявляется с помощью команды Dim, значение переменной устанавливается с помощью команды Set.


Пожалуй, это все, что нам необходимо знать для того, чтобы начать писать простейшие скрипты.


Писать скрипты можно непосредственно в редакторе Microsoft Visual Basic for Applications (он «на лету» исполняет скрипт и показывает ошибки), но мне для демонстрации проще делать это в текстовом редакторе Notepad++.

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Опишем скрипт InsertImageSequence.bas (вставить номер рисунка).


В целом для написания собственных скриптов вам понадобится научиться работать с полями и текстом.


Логика написания скрипта такая:

1. Нам нужно добавить поле, которое выводит номер последовательности. Посмотреть вид этого поля можно в контекстном меню «Коды / значения полей», кликнув по полю, полученному традиционным способом, правой кнопкой мыши;

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Слово MERGEFORMAT в данном случае не имеет значения, т. к. это просто директива «не менять формат», которую MS Word добавляет автоматически.


2. Далее необходимо указать место, в которое мы хотим вставить текст / поле. В данном случае это текущее местонахождение выделения / курсора. Все основные операции с текстом в VBA замечательно описал Биллиг Владимир Арнольдович, и для понимания работы с объектами Range и Selection, которые мы будем использовать, я рекомендую прочитать его статью;


3. Необходимо в выделение добавить поле с присвоенным ему типом (в данном случае SEQ). Для этого мы будем использовать метод Add, описанный в документации Microsoft. Как обозначаются типы полей в скриптах описано здесь. В данном случае нам необходимо узнать, как обозначается в скрипте тип поля SEQ (wdFieldSequence), чтобы указать его в качестве параметра Type метода Add. Также необходимо указать параметры, которые мы посмотрели в пункте 1.


В итоге у нас получается что-то типа этого

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение
Сложно? Нет! Попробуем посложнее – опишем скрипт InsertCaptionToImage.bas (добавить подпись к рисунку).
Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Элементарно. Здесь просто добавились некоторые методы из статьи Биллига для добавления текста до и после поля.

Наконец, рассмотрим скрипт InsertRefToImage.bas (добавить ссылку на изображение).

Основы программирования в Microsoft Word. Работа с макросами Microsoft Word, Длиннопост, Текст, Программирование, Макрос, Обучение

Что использовалось для написания последнего скрипта:

1. Неразрывный пробел средствами VBA

2. Getting User Input in a Dialog Box

3. Word Macro for Insert Cross-Reference

4. How to: Programmatically Hide Text in Documents


Все эти замечательные рецепты ищутся в обыкновенном google по запросу, начинающемуся на «word macro» или «word vba».


В следующей статье мы рассмотрим основные правила типографики и работу со списком литературы в MS Word.


Ссылка на макросы


Ссылка на обновленный шаблон Normal.dotm

Показать полностью 16
1086

Было - стало

Если вдруг кому интересно...

Яндекс - было

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Яндекс - стало

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Google - было

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Google - стало

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft - было

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft - стало

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft Windows - было

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft Windows - стало

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft Word - было

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

Microsoft Word - стало

Было - стало Было-Стало, Ностальгия, Яндекс, Google, Microsoft, Windows, Microsoft Word, Длиннопост

(на пару картинок ругалось, но посты не аналогичные)

Показать полностью 9
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: