Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Word VBA

Автор: Gena1971
Дата сообщения: 22.12.2012 20:12
PoziaSergey
Как то так

Код: Sub Zakladka()
With ActiveWindow.View
If .ShowBookmarks = False Then .ShowBookmarks = True Else .ShowBookmarks = False
End With
End Sub
Автор: mic69
Дата сообщения: 24.12.2012 09:50
Здравствуйте! Прошу помощи!

Word 2007. В шабоне вставлен элемент управления "Выбор даты" (выпадающий календарь).

Как сделать, чтобы при создании документа (на основе этого шаблона) указанное поле принимало значение "сегодня" + 1 день, т.е. - "завтра"?

То, что в шаблон нужно вставить макрос типа AutoOpen (или AutoCreate), присваивающий данному элементу определенное значение - я понимаю, но в VBA, к сожалению, не силён ... поэтому, надеюсь на помощь знатоков.

Заранее благодарю!

P.S. Элемент управления - именно "календарь", т.к. иногда нужно выбирать дату позже чем "завтра".
Автор: Dogmatek
Дата сообщения: 22.02.2013 03:12
Товарищи подскажите пожалуйста, как в Ms Office 2010 создать надстройку для Word?

Написал необходимые макросы для Ворда, но когда коснулся вопроса сохранения файла как Надстройки не смог найти информации по данному вопросу.
Знаю, что в Excel есть возможность сохранить документ в качестве надстройки (несколько уже создавал), однако в Word не получается найти способа.
Автор: Vadim39
Дата сообщения: 19.05.2013 14:18
Подскажите, пожалуйста, можно ли оптимизировать скрипт? Работает, но так медленно, что проще вручную пересчитать
Задача - вывести список всех знаков, встречающихся в документе Word.

Код: Sub pr1()
Dim sl As String, i As Long
With ActiveDocument.Range.Characters
For i = 1 To .Count
If InStr(sl, .Item(i)) = 0 Then sl = sl + .Item(i)
Next
End With

Debug.Print sl

End Sub
Автор: XPerformer
Дата сообщения: 19.05.2013 15:18
можно попытаться чуть оптимизировать

Код:
Sub pr1()
Dim sl As String, i As Long
dim ch
With ActiveDocument.Range.Characters
For i = 1 To .Count
ch = .Item(i)
If InStr(sl, ch) = 0 Then sl = sl + ch
Next
End With

Debug.Print sl

End Sub
Автор: Vadim39
Дата сообщения: 19.05.2013 20:50
XPerformer
Большое спасибо!
Выходит, основное время уходило на то, чтобы каждый раз получать "ActiveDocument.Range.Characters"
Автор: XPerformer
Дата сообщения: 19.05.2013 21:04
одно - это коллекция объектов, тяжелая структура
второе - это строка, одним массивом передается и обрабатыватеся
Автор: Vadim39
Дата сообщения: 21.05.2013 08:19
Нужно запустить из макроса диалог поиска и замены, причем курсор должен оказаться в начале поля замены.
Если вызвать Dialogs(wdDialogEditReplace).Show, то после выполнения замены появляется сообщени об ошибке. Кроме того, я не знаю как перемещать курсор внутри диалогового окна.
Если же вызывать диалог с помощью SendKeys "^h", все отлично, и следующие за ним SendKeys "{TAB}"
SendKeys "{HOME}"
ставят курсор в нужное место, но возникает другая проблема: все это работает только, в том случае, если в момент вызова раскладка клавиатуры английская, если же русская - вместо вызова диалога в документ впечатываются "h" и знак табулятора.
Если принципиального решения не существует, то может кто-нибудь подскажет, как написать скрипт для определения и управления раскладкой клавиатуры.

ЗарСпасБол!


Автор: Vadim39
Дата сообщения: 21.05.2013 18:25
Решил проблему, но совершенно идиотским способом: назначил вызов диалога замены на Ctrl_0. Почему-то SendKeys "^0" запускается из макроса при любой раскладке.
В процессе экспериментов выяснилось, что если назначить на F11, диалог не вызывается при любой раскладке клавиатуры... Полный бред
Автор: Futurism
Дата сообщения: 23.05.2013 10:41
Помогите, пожалуйста, написать скрипт для ворда, чтобы например из книги в док формате из всего массива текста взять случайным образом какие то слова и их выставить в столбец, страниц на 10.
примерно, чтобы это так выглядело
слово1
слово2
...
слово(n)

и такой столбик на 10 страниц. Единственное, чтобы слова не повторялись и выстраивались по алфавиту;)
Автор: AndVGri
Дата сообщения: 28.05.2013 08:47
Futurism
Как то так для активного документа
[more]

Код:
Private Sub ShellSort(ByRef this() As String)
Dim idFirst As Long, idLast As Long, tmp As String
Dim Stepping As Long, i As Long, pos As Long

idFirst = LBound(this): idLast = UBound(this)
Stepping = 1: pos = idLast - idFirst + 1
For i = 1 To pos
Stepping = 3& * Stepping + 1
If Stepping > pos Then Exit For
Next
Do
Stepping = Stepping \ 3&
For i = (Stepping + 1) To idLast
pos = i: tmp = this(i)
Do While (this(pos - Stepping) > tmp)
this(pos) = this(pos - Stepping)
pos = pos - Stepping
If (pos - Stepping) < 1 Then Exit Do
Loop
this(pos) = tmp
Next i
Loop Until Stepping = 1
End Sub

Public Sub CreateUnique()
Dim pReg As Object, pDict As Object, sText As String
Dim subStr() As String, i As Long, pDoc As Document
Set pReg = CreateObject("VBScript.RegExp")
pReg.Global = True: pReg.IgnoreCase = True
'настройка, что есть слово - всё остальное разделители
pReg.Pattern = "[^0-9a-zа-я]"
sText = Application.ActiveDocument.Range.Text
sText = pReg.Replace(sText, " ")
pReg.Pattern = "[ ]+"
sText = pReg.Replace(sText, " ")
Set pDict = CreateObject("Scripting.Dictionary")
pDict.CompareMode = 1: subStr = VBA.Split(sText, " ")
For i = LBound(subStr) To UBound(subStr)
pDict(subStr(i)) = subStr(i)
Next i
subStr = VBA.Split(VBA.Join(pDict.Keys, " "), " ")
ShellSort subStr
Set pDoc = Application.Documents.Add

pDoc.Range.Text = VBA.Join(subStr, vbCr)
End Sub
Автор: Vadim39
Дата сообщения: 28.05.2013 19:59
AndVGri
Очень многому научился из вашего скрипта Спасибо большое!
Подскажите, пожалуйста, а можно ли с помощью "VBScript.RegExp" выполнить такую замену: (стр1)(стр2) на (стр2)(стр1)? Если не ошибаюсь обычно для этого используется в строке поиска скобки а в строке замены "\n", но у меня почему-то не получается.
И еще, возможно ли с помощью "Scripting.Dictionary" получить информацию о количестве вхождений каждого слова?
Заранее признателен!
Автор: AndVGri
Дата сообщения: 29.05.2013 04:00
Vadim39

Цитата:
И еще, возможно ли с помощью "Scripting.Dictionary" получить информацию о количестве вхождений каждого слова?

Заменяем в коде

Код:
For i = LBound(subStr) To UBound(subStr)
If Not pDict.Exists(subStr(i)) Then
pDict.Add subStr(i), 1
Else
pDict(subStr(i)) = pDict(subStr(i)) + 1
End If
Next i
Автор: Vadim39
Дата сообщения: 29.05.2013 16:58
AndVGri
Большое спасибо!
Первый вопрос был о синтаксисе VBScript.RegExp: как указанный в паттерне шаблон передать в строку замены. Нигде не мог найти толкового описания, но в конце концов сообразил, что через "$n", где n - номер шаблона в паттерне. Правда так и не нашел способа указать в паттерне начало слова, а также способ передачи в строку замены всего найденного (в Word это делается с помощью "^&").
Автор: AndVGri
Дата сообщения: 31.05.2013 04:09
Если считать первую букву в слове буквой, идущей после пробела, то можно так

Код:
pReg.Pattern = " [а-яё]"
myStr = pReg.Replace(myStr, " Q")
Автор: Luci
Дата сообщения: 02.07.2013 09:28
Здравствуйте!
Хочу в скрипте проконтролировать наличие списка в ячейке таблицы. Скриптом перебираю ячейки, но ListGalleries.Count применить к ячейке не могу. Как мне это сделать?
P.S. Проблема решена -
Код: Cell.Range.ListParagraphs.Count
Автор: sashko1980
Дата сообщения: 11.07.2013 20:38
Столкнулся с такой трудностью:

Есть документ( word 2007), с расширением .docm, то есть с поддержкой макросов ( в самом документе есть элементы управления содержимым и макросы).
Пытаюсь этот документ сохранить как шаблон с поддержкой макросов (.dotm), чтобы на основе этого шаблона создавать новые документы с теми же работающими макросами. Проблема в том, что если на основе сохраненного шаблона создать новый документ, то макросы в нем почему-то не работают. Как добиться, чтобы макросы работали? Спасибо.
Автор: brok3n
Дата сообщения: 08.08.2013 23:54
добрый день!
попал в довольно глупую ситуацию: писал большую статью, в которой должны быть скриншоты. место каждого скриншота отмечал словом "СКРИНШОТ". в итоге этих слов набралось около 500... подскажите, как ловко заменить "СКРИНШОТ" на "(Рис 1.1)", "(Рис 1.2) и т.д. номер рисунка соответствует номеру вхождения слова СКРИНШОТ в тексте.
благодарю.
Автор: vikkiv
Дата сообщения: 09.08.2013 00:42
brok3n
(Рис 1.1) - (Рис 1.500) ? Точно что-ли? А не (Рис 2.5) .. (Рис 10.2) ?
Алгоритм прост, х=1, затем поиск первого совпадающего слова (можно с проверкой форматирования) и замена на (Рис 1.х), потом х=х+1 , запуск поиска по новой (или через цикл с кол-вом оборотов =500) или For i=1 to 500 .. next i
можно так вобщем:
Код: Sub test()
For i = 1 To 450
Content.Find.Execute FindText:=ChrW(&H421) & ChrW(&H41A) & ChrW(&H420) & ChrW(&H418) & ChrW(&H41D) & ChrW(&H428) & ChrW(&H41E) & ChrW(&H422), ReplaceWith:="(" & ChrW(&H420) & ChrW(&H438) & ChrW(&H441) & " 1." & i & ")", MatchCase:=True, Replace:=wdReplaceOne
Next i
End Sub
Автор: brok3n
Дата сообщения: 11.08.2013 02:17
vikkiv
большое спасибо! немного подкорректировал, чтобы работало )

Код: Sub test()
For i = 1 To 450
Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="СКРИНШОТ", ReplaceWith:="(Рис 1." & i & ")", MatchCase:=True, Replace:=wdReplaceOne
Next i
End Sub
Автор: vikkiv
Дата сообщения: 11.08.2013 02:49
brok3n
Ну и отлично ... это скорее у кого как, на моей станции в установленных языках кириллицы нет, соответственно VBA без костылей её не читает и не пишет, может просто к системным шрифтам привязка идёт.
а "myRange = ActiveDocument.Content" и им подобные именно с микрософтовских VBA образцов сразу распознаются =))
Автор: panda3
Дата сообщения: 12.08.2013 08:08
Ну не изврат ли, делать обычную замену текста через VBA? Вставьте в документ название "Рис. 1." с автонумерацией, вырежьте его в буфер обмена и сделайте глобальную замену слова СКРИНШОТ на содержимое буфера обмена.
Автор: brok3n
Дата сообщения: 12.08.2013 23:54
panda3
не получается именно автонумерация. подскажите, пожалуйста, и паззл будет готов )
Автор: Gena1971
Дата сообщения: 13.08.2013 03:54
brok3n
Да получается всё отлично. Поле нумерации надо добавлять.
Сразу копия поля вставится (с одной цифрой). Но если сохранить, и потом закрыть-открыть документ то она обновится и станет последовательной. При просмотре печати тоже обновляется, и просто на печать выводится уже обновлённая. Есть и сочетане клавишь для глобального обновления полей вроде.
Косяк может возникнуть, я не помню точно, возможно при нумерации внутри таблиц. Давно просто встречал такое, но вроде в таблице ворд не мог правильно проставить последовательность. Может и починили уже. А может это и не в таблице было, где то другом месте.
Но по тексту нормально делается.
Автор: Alexey87
Дата сообщения: 18.09.2013 11:58
Подскажите, пожалуйста, как скрывать/отображать определенные строки таблицы при использовании radiobutton или listbox с условием:
да - определенные строки отображаются;
нет - определенные строки скрываются;
при открытии документа таблица должна быть загружена полностью.
Автор: panda3
Дата сообщения: 19.09.2013 09:58
Alexey87
По нормальному строки нельзя скрыть в Worde, можешь использовать
Код: ActiveDocument.Tables(1).Rows(2).Range.Font.Hidden = True
Автор: Alexey87
Дата сообщения: 19.09.2013 10:37

Цитата:
но не должна быть включена настройка "показ скрытого текста"

а можно ли управлять данной настройкой на компьютере, где будет открываться документ?
если да, то как?
Автор: panda3
Дата сообщения: 23.09.2013 07:34

Код: ActiveDocument.ActiveWindow.View.ShowHiddenText = False
Автор: Lovec
Дата сообщения: 27.10.2013 18:44
Подскажите совсем новенькому в Word VBA - как мне макрос хоть на что то повесить?
В Excel я щелкаю правой кнопкой на объекте - "добавить макрос". В ворде же обыскался, но так ничего и не нашел...
Тут все по другому чем в Excel?
Автор: vikkiv
Дата сообщения: 27.10.2013 18:53
Lovec (Word 2013) File -> Options -> Customize Ribbon -> Developer (поставить галку) , Там будет "Properties" или Двойной клик где можно назначить Макрос если объект "правильный".

Страницы: 1234567891011121314151617181920212223242526

Предыдущая тема: Кластеризация изображений


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.