Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/46: Рейтинг темы: голосов - 46, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9

Макрос для печати в Microsoft word 2010

25.05.2011, 12:02. Показов 8843. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с написанием макроса для Microsoft word 2010.
Есть документ, который имеет следующую структуру:
Заголовок_1.........стр. 3
Заголовок_2.........стр. 5
Заголовок_3.........стр. 7
Заголовок_4.........стр. 9
Заголовок_5.........стр. 14
Можно ли написать макрос, который отправлял бы на печать по отдельности Каждый заголовок с содержимым?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2011, 12:02
Ответы с готовыми решениями:

Макрос для печати в Word 2010
Ситиация такая: есть документ состоящий из 200 страниц. Нужно вывести эти страницы на печать по 4, то есть после 4 напечатанных страниц...

Макрос для MS Word 2010
Есть каталог продукции ( около 4000 товаров ), в нём есть код продукта ( форма числа xxxxxxxxxx ) и цена ( форма числа xx.xx ). Так вот,...

Конструктор ленты для Microsoft Word 2010: запуск макроса
Здравствуйте! Создаю ленту для word 10, как присвоить значку запуск макроса в VBA Word? Спасибо!

15
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 12:28
k@pustin,
образец файла выложите (не обязательно весь документ), на основе которого можно принять решение.
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
25.05.2011, 12:40  [ТС]
Цитата Сообщение от Busine2009 Посмотреть сообщение
k@pustin,
образец файла выложите (не обязательно весь документ), на основе которого можно принять решение.
Суть в том, что печататься будет на PDF-принтере, т.е. из каждого раздела в основном файле должен получиться свой PDF-файл
Вложения
Тип файла: doc Пример файла.doc (29.5 Кб, 60 просмотров)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 14:02
k@pustin,
а как вы себе представляете сам процесс печати (куда надо нажать, что надо сделать)?
1
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
25.05.2011, 14:13  [ТС]
грубо говоря, открываю файл, запускаю макрос, а он автоматом отсылает на печать по очереди нужные страницы данного документа. Или это невозможно?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 14:15
Цитата Сообщение от k@pustin Посмотреть сообщение
нужные страницы
а как макрос определяет, какие нужные, а какие нет?
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
25.05.2011, 14:28  [ТС]
Если можно, то по названию заголовков, названия меняться не будут
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 14:30
k@pustin,
а какие заголовки будут печататься?
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
25.05.2011, 14:33  [ТС]
Допустим Заголовок_01 и Заголовок_03 со своим содержимым.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 14:47
k@pustin,
а количество страниц разное может быть?
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
25.05.2011, 15:03  [ТС]
да, страницы могут меняться
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
25.05.2011, 20:39
k@pustin,
а можно опираться только на данные Содержания (в нём же указаны номера страниц)?
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
26.05.2011, 09:52  [ТС]
Можно, там же достоверные данные
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
26.05.2011, 12:08
k@pustin,
работа с активным документом. В строках 81 и 82 нужно указать названия заголовков, которые надо распечатать.
Код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Sub P9()
Dim Массив1() As String, Массив2() As String
Dim i As Long, j As Long
Dim Табулятор As Long, Длина As Long
Dim Заголовок1 As String, Заголовок2 As String
Dim Страницы As String
'Сначала проверяем, что Содержание есть в документе, чтобы не было ошибки.
If ActiveDocument.TablesOfContents.Count = 0 Then
    MsgBox "В документе нет содержания", vbCritical
    'Выходим из кода.
    Exit Sub
End If
'По каким-то необъяснимым причинам из первого абзаца содержания
'можно получить всё содержание.
'Для удобства и простоты будем использовать массив.
'Массив - это поименованная область в оперативной памяти компьютера, состоящая
'из одного или нескольких элементов.
'Сначала создадим массив Массив1(). В нём будет столько элементов
'сколько абзацев в Содержании. Также по непонятным причинам в конце
'содержания есть пустой абзац, который также относится к содержанию.
'Массив создадим с помощью Split. В конце каждого абзаца содержания есть
'знак абзаца Chr(13)- он и будет использоваться для разбивки массива Массив1 на элементы.
'ActiveDocument - обрабатывается активный документ.
'TablesOfContents(1) - первое содержание в документе (их может быть несколько).
'Paragraphs(1) - анализируется первый абзац содержания, из которого,
'по непонятным причинам, можно получить всё содержание.
'Fields(1). Содержание состоит из нескольких полей (можете не пытаться
'понять, что такое поле, - со временем поймёте).
'Будем анализировать первое поле в данном абзаце.
'Result - с помощью этой команды и получаем все данные из содержания.
Массив1() = Split(ActiveDocument.TablesOfContents(1).Range.Paragraphs(1).Range.Fields(1).Result, Chr(13))
'For ... To ... Step ... Next - называется циклом и используется для выполнения
'одного и того же действия определённое количество раз.
'Ubound - используется для определения количества элементов в массиве.
'По умолчанию почему-то порядковый номер первого элемента массива равен нулю (0).
For i = 0 To UBound(Массив1) Step 1
    'В связи с тем, что в содержании могут быть ненужные элементы
    'например пустой абзац в конце содержания, нужно отобрать только то
    'что нам нужно (названия заголовков и номера страниц).
    'Сделаем это с помощью Like. Следующее выражение можно прочитать так:
    'Если текст в элементе массива оканчивается на цифру (под цифрой понимается
    'цифра в номере страницы), то значит, это нужный элемент.
    If Массив1(i) Like "*#" Then
        'Будем создавать новый массив Массив2, с которым и будем работать.
        'Этот массив будет двухмерным и его можно мысленно представить
        'как таблицу, состоящую из строк и столбцов.
        'Данные в Массив2 будут браться из Массив1.
        'В нашем случае массив будет состоять из двух строк. А количество
        'столбцов будет зависеть от количества абзацев в содержании.
        'В первой строке будет текст содержания (заголовок в документе),
        'а во второй строке - номер страницы.
        'В переменную j будем помещать число, которое будет обозначать
        'номер столбца в Массив2. Т.к. заранее не известно, сколько будет
        'абзацев в Содержании, поэтому сразу и нельзя задать размерность
        'у массива Массив2.
        j = j + 1
        'С помощью ReDim Preserve добавляем столбец в Массив2.
        ReDim Preserve Массив2(1 To 2, 1 To j)
        'Помещаем в первую строку нового столбца текст абзаца.
        Массив2(1, j) = Массив1(i)
        'Далее нужно поместить во вторую строку нового столбца номер страницы.
        'Сделать это сложно, поэтому надо сделать много действий.
        'Ориентиром будет являться знак табуляции Chr(9) (после текста абзаца идёт
        'знак табуляции, а затем уже номер страницы).
        'Т.к. в абзаце содержания может быть несколько знаков табуляции, то
        'абзац нужно рассматривать с конца. Для этого мы перевернём абзац
        'с помощью функции StrReverse.
        'Затем с помощью функции InStr определим, каким по счёту будет знак табуляции.
        'С помощью функции Len определяем длину абзаца (вернее текста в элементе массива Массив1).
        Табулятор = Len(Массив1(i)) - InStr(StrReverse(Массив1(i)), Chr(9)) + 1
        'С помощью функции Len рассчитаем, сколько брать знаков.
        Длина = Len(Массив1(i)) - Табулятор
        'С помощью Mid уже берём нужный текст из абзаца (это чисто номер страницы)
        'и помещаем его во вторую строку нового столбца Массив2
        Массив2(2, j) = Mid(Массив1(i), Табулятор + 1, Длина)
    End If
Next i
'На данном этапе всё наше содержание содержится в Массив2.
'И работать с текстом и номерами страниц будем чисто через него.
'Помещаем в переменные заголовки, которые надо распечатать.
Заголовок1 = "Заголовок_1"
Заголовок2 = "Заголовок_3"
'Теперь определяем номера страниц, где содержатся эти заголовки.
'Ищем в первой строке каждого столбца массива Массив2 текст,
'находящийся в переменных Заголовок1 и Заголовок2.
For i = 1 To UBound(Массив2, 2) Step 1
    'Если есть (InStr будет > 0), то
    If InStr(Массив2(1, i), Заголовок1) > 0 Or _
            InStr(Массив2(1, i), Заголовок2) > 0 Then
        'формируем строку с номерами страниц, которую затем поместим в код
        'по распечатке.
        'Далее проводим проверку: последний ли это заголовок или нет
        '(это нужно чтобы определить второй номер страницы в диапазоне печати).
        If i < UBound(Массив2, 2) Then
            'Если не последний, то будем ориентироваться на номер страницы
            'следующего заголовка. Символ & служит для связывания в один текст
            'фрагментов.
            Страницы = Страницы & "," & Массив2(2, i) & "-" & Массив2(2, i + 1) - 1
        Else
            'Если последний, то второй номер страницы в диапазоне - это
            'количество страниц в документе.
            Страницы = Страницы & "," & Массив2(2, i) & "-" & _
                ActiveDocument.ComputeStatistics(wdStatisticPages)
        End If
    End If
Next i
'Если заголовков не было найдено, то выдаём сообщение и выходим из кода.
If Страницы = "" Then
    MsgBox "Нужных заголовков не было найдено"
    Exit Sub
Else
    'Убираем запятую лишнюю из начала строки с диапазоном печати.
    Страницы = Mid(Страницы, 2, Len(Страницы))
End If
'Собственно печать на принтер, который установлен по умолчанию.
'Или если программа Word открыта, то на принтер, на который задавались
'последний раз.
Application.PrintOut FileName:="", Range:=wdPrintRangeOfPages, Item:= _
    wdPrintDocumentContent, Copies:=1, Pages:=Страницы, PageType:= _
    wdPrintAllPages, ManualDuplexPrint:=False, Collate:=True, Background:= _
    False, PrintToFile:=False, PrintZoomColumn:=0, PrintZoomRow:=0, _
    PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
End Sub
1
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 9
26.05.2011, 12:24  [ТС]
Вот спасибо большое, сейчас буду пробовать!!!!!!!!!!
Как раз попытаюсь разобраться что откуда берется
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
26.05.2011, 12:37
k@pustin,
чтобы было логично и по инструкции, 113 строку нужно на эту заменить:
Visual Basic
1
Страницы = Mid(Страницы, 2)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2011, 12:37
Помогаю со студенческими работами здесь

Microsoft Office 2010 проблема при печати 2 на 1
Друзья и коллеги прошу Вашей помощи! Есть office 2010 и принтер hp p2055 ни в какую не хочет печатать 2 страницы на 1 листе. В свойствах...

Макрос двусторонней печати в Word
Добрый день форумчане! Помогите сделать макрос двусторонней печати в Word. Есть документ, который надо постоянно печатать полностью,...

Microsoft Word 2010
Все привет. Кто нибудь дайте годную ссылку скачать Microsoft Word 2010 без вируса:cry: на Винду 8. Плиз:wall::gsad:

Макрос в Word 2010 c кнопки
Как, или где можно почитать, как оформлять запуск макроса с кнопки на ленте?

Макрос Microsoft Outlook 2010: копирование вложений по имени вложения
Добрий день! Помогите написать макрос для Microsoft Outlook 2010, которий будет копиравать вложение по имени вложнения, т.е если имя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru