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

» Word VBA

Автор: kuvschin
Дата сообщения: 21.01.2011 15:10
Приветствую!

Есть требование по количеству знаков в строке.
Подскажите, каким образом можно соблюсти его в Word?

Спасибо!
Автор: dneprcomp
Дата сообщения: 21.01.2011 16:39
kuvschin
Ну, если грубо и быстренько делать, то я бы установил моноширокий шрифт. Набил бы нужное количество знаков и по полученной строке установил марджины для всех стрниц документа. Потом печатать только этим шрифтом и только таким размером. Правда, при выборе заглвных букв строке может не хватить места.
Каждую строку обязательно переводить на новую только через Enter.
После окончания печати марджины можно передвинуть и поменять шрифт на любой другой. И размер тоже можно менять.
А не грубо и элегантно что-то в голову не приходит.
Автор: kuvschin
Дата сообщения: 24.01.2011 09:26
Это слишком грубо ...

Может быть хотя бы подскажете, как обратиться в VBA к текущему значению "номер столбца на странице"? Что-то я никак не найду ...

Тогда можно будет найти максимальное значение этой переменной для документа ...
Автор: dneprcomp
Дата сообщения: 25.01.2011 06:54
kuvschin

Цитата:
как обратиться в VBA к текущему значению "номер столбца на странице"?

Да откуда в Word может взятся столбец? Столбец подразумевает, что все и каждый знак находятся точно и обязательно друг под другом. При использовании всевозможных фонтов и стилей такого просто быть не может.
Наиболее близким к искомому будет функция Len
http://www.oreilly.de/catalog/lrnwdpr/chapter/ch07_03.html
Там же могут пригодиться Left, Right, Mid функции. Ну и другие.
Автор: kuvschin
Дата сообщения: 25.01.2011 09:15
dneprcomp

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

Впрочем, все оказалось вполне просто ...

x = Selection.Start
x = Selection.End

эти значения дают номер символа, включая левое поле,






Автор: dneprcomp
Дата сообщения: 25.01.2011 16:40
kuvschin
Selection Object represents the current selection in a window or pane.
A selection represents either a selected (or highlighted) area in the document, or it represents the insertion point if nothing in the document is selected.

Ну, если так уж хочется называть selection столбцом, то называйте. Главное, что бы задачу помогло решить.
Автор: kuvschin
Дата сообщения: 25.01.2011 17:20
Selection - это просто курсор (в том числе). т.е. находясь в конце строки, имеем её длину в знаках ... С учетом выбранного шрифта.
Столбцом не я называю - Microsoft. трудности перевода ...
Автор: dneprcomp
Дата сообщения: 26.01.2011 00:00
kuvschin
Ну, извините. Как спросили, так и ответили. Спросили бы о позиции курсора, не пришлось бы о пресловутых "столбцах" рассуждать.

Автор: sashko1980
Дата сообщения: 02.04.2011 22:15
Подскажите, как в Word 2007 сделать следующее:

В документе есть элемент управления содержимым в виде раскрывающегося списка вида "Иванов, Петров, Сидоров". Далее в документе есть другой элемент управления содержимым, где каждой указанной выше фамилии соответствует числовой код, типа "1001, 1002, 1003".

Как сделать, чтобы при выборе фамилии в одном элементе, в другом элементе управления содержимым автоматически подставлялся нужный числовой код?
Автор: vasiliy74
Дата сообщения: 08.04.2011 14:56
не нашёл решения как работать с рецензированием при записи макросов ни как не записывается, суть автоматическое формирование протокола расхождений при работе с документом в режиме рецензирования, может кто задавался там вопросом?
Автор: yuriisv
Дата сообщения: 09.04.2011 06:13
Подскажите, как в Word 2007-2010 с помощью команды выделить вставленный фрагмент
Автор: kamadz
Дата сообщения: 10.04.2011 22:12
Уважаемые форумчане.
Очень надо решить задачу: есть текст имеющий очень много абзацев разной длинны. Надо создать макрос, который мог в случайном порядке перемешивать абзацы и еще один макрос, который мешает предложения в абзацах.

Помогите пожалуйста.
Автор: AndVGri
Дата сообщения: 11.04.2011 02:29
kamadz
Параграфы получи через Document.Paragraphs
Предложения в параграфе Document.Paragraphs(1).Range.Sentences. Отдельного объекта Sentence нет. Вот. Организуй списки параграфов, предложений в них и выбирай случайным образом для вставки, что проще, в новый документ.
Автор: oshizelly
Дата сообщения: 11.04.2011 15:20
Написал примитивный макрос, который выделяет весь текст документа и присваивает ему нужный языковой атрибут:

Код: Selection.WholeStory
Selection.LanguageID = wdEnglish
Автор: prestigo
Дата сообщения: 20.04.2011 13:57
Есть обыкновенная пользовательская форма в MS Word 2003, на ней - ListBox.
В ListBox-е не работает колесико скрола мышки для промотки списка.
Есть варианты, как заставить это произойти?
Автор: Scorry_17
Дата сообщения: 21.04.2011 15:59
Помогите, люди добрые.
Есть документ Word, в нём некоторое количество (около 4000) закладок (bookmarks). Некоторые «нулевой» длины, некоторые маркируют собой текст. Задача состоит в том, чтобы:
1. найти закладку;
2. извлечь её имя;
2. поместить курсор ввода в её начало;
3. вставить в это место извлечённое имя закладки;
4. отформатировать введённый текст каким-нибудь заготовленным character style;
5. удалить саму закладку;
6. .... и по кругу, пока не кончатся закладки в документе.

С программированием в ворде дела практически не имею, но иногда какие-то макросы худо-бедно редактирую.
Не дайте помереть одному. Помогите, плиз!

ЗЫЖ извините за несвоевременную отправку.
Автор: sashko1980
Дата сообщения: 25.04.2011 19:25
Подскажите код макроса, чтобы сделать следующее:

В документе Word 2007 есть элемент управления содержимым называемый "Исполнитель" в виде раскрывающегося списка вида "Иванов, Петров, Сидоров". Далее в документе есть другой элемент управления содержимым "Код исполнителя" (тоже в виде раскрывающегося списка), где каждой указанной выше фамилии соответствует числовой код, типа "1001, 1002, 1003".

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

Заранее спасибо.
Файл с примерами списков прилагается:

пример файла
Автор: smirnvlad
Дата сообщения: 26.04.2011 19:54
sashko1980

в первом поле исправил значения на коды, по ним и будет "синхронизация", т.е. Смирнов С.С = 1003
[more]

макрос


Код: [no]
Sub SyncContentControlByValue(Src As ContentControl, Dest As ContentControl)

Dim SrcT As String
Dim SrcV As String
Dim ccLE As ContentControlListEntry

SrcT = Src.Range.Text

For i = 1 To Src.DropdownListEntries.Count
If SrcT = Src.DropdownListEntries.Item(i).Text Then

SrcV = Src.DropdownListEntries.Item(i).Value

For k = 1 To Dest.DropdownListEntries.Count
If Dest.DropdownListEntries.Item(k).Value = SrcV Then
Dest.DropdownListEntries.Item(k).Select
Exit Sub
End If
Next

' Если не найден выбираем первый
Dest.DropdownListEntries.Item(1).Select
End If
Next

End Sub

[/no]
Автор: sashko1980
Дата сообщения: 26.04.2011 21:36
smirnvlad
Спасибо огромное, буду разбираться с кодом.

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

Пример файла ниже.
файл age.docx

Естественно, что для любого человека с навыками программирования моя задача покажется смешной, но для меня как рядового пользователя изучать синтаксис VBA сложновато.
Автор: smirnvlad
Дата сообщения: 27.04.2011 09:37
sashko1980

сейчас считаются полные года, если надо неполные - надо удалить код между комментариями
новый age.docm

[more]

Код: [no]
Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
Dim ccBDate As ContentControl, ccRDate As ContentControl, ccA As ContentControl
Dim ccRdf As String, ccBdf As String
Dim dB As Date, dR As Date

Select Case ContentControl.Tag
Case "дата регистрации", "дата рождения":
Set ccRDate = ThisDocument.SelectContentControlsByTag("дата регистрации").Item(1)
Set ccBDate = ThisDocument.SelectContentControlsByTag("дата рождения").Item(1)
Set ccA = ThisDocument.SelectContentControlsByTag("возраст при регистрации").Item(1)

ccRdf = ccRDate.DateDisplayFormat
ccBdf = ccBDate.DateDisplayFormat

On Error Resume Next

ccRDate.DateDisplayFormat = DateFormat()
ccBDate.DateDisplayFormat = ccRDate.DateDisplayFormat

dR = DateValue(ccRDate.Range.Text)
dB = DateValue(ccBDate.Range.Text)



yd = DateDiff("yyyy", dB, dR)
' Если нужна разница по годам без учета месяца и дня (не полных лет) удалить до следующего комментария
md = DateDiff("m", dB, DateAdd("m", -12 * yd, dR))
dd = DateDiff("d", dB, DateAdd("m", -12 * yd - md, dR))

If md = 0 Then
If dd < 0 Then
yd = yd - 1
End If
ElseIf md < 0 Then
yd = yd - 1
End If
' Если нужна разница по годам без учета месяца и дня (не полных лет) удалить до этого комментария

ccA.Range.Text = Str$(yd)

ccRDate.DateDisplayFormat = df
ccBDate.DateDisplayFormat = df
End Select

End Sub
[/no]
Автор: Imanima
Дата сообщения: 04.05.2011 08:38
Здравствуйте.
Помогите пожалуйста решить задачку. Дело вот в чем:
Имеем *.doc или *.docx файл. В нем находится текст. Текст разделен на абзацы. Есть программа, которая может выделять текст по абзацам: выделила абзац, через некоторое время сняла выделение и выделила следующий, потом опять сняла и так пока документ не закончится.

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

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

помогите пожалуйста с кодом. если не трудно.
Автор: AndVGri
Дата сообщения: 04.05.2011 10:23
Imanima
Так оно не трудно - такой примерно алгоритм
в тот проект, где код добавляем форму, на ней размещаем объект Image
Добавляем метод к форме, который будет вызываться кодом при смене выделения для вывода в Image.Picture = LoadPicture("d:\path\myimage.bmp").
В код смены выделений абзацев добавляем создание этой формы и вызов при смене выделения метода смены рисунка... И так далее....
Что не выходит-то?
Автор: Imanima
Дата сообщения: 04.05.2011 17:09
AndVGri
Вы наверное будете доолго смеяться. С программированием на VBA у меня никак. Ну не то чтобы совсем. Я недавно начал изучать. Можите код выложить?
Автор: Imanima
Дата сообщения: 08.05.2011 05:37
Ну что? Никто не поможет?
Автор: smirnvlad
Дата сообщения: 08.05.2011 09:34
Imanima

Цитата:
Ну что? Никто не поможет?

а "Что не выходит-то?"

Imanima
поиском по теме можно было найти код который ищет файлы в папке, соединить со своим добавить AndVGri и всё получилось бы.

[more]
1. заходим в Visual Basic
2. на проекте нажимаем правой кнопкой insert -> UserForm
3. в свойствах ставим ShowModal = false и PictureSizeMode = fmPictureSizeModeZoom запоминаем имя (скорее всего UserForm1)

В коде меняем
DirName = "C:\pictures\" 'на папку с картинками
Set myF = UserForm1 'на название добавленной формы
Set Doc = ThisDocument 'на документ с абзацами (сейчас тот в котором код)

из папки выбираются только jpg, если картинок мало - начнутся с начала

запускаем SP()


Код: [no]
Sub sleep(sec As Integer)
s = Now
While DateDiff("s", s, Now) < sec
DoEvents
Wend
End Sub

Sub SP()
Dim PicNames()

DirName = "C:\pictures\"
Set myF = UserForm1
Set Doc = ThisDocument

ParCnt = Doc.Paragraphs.Count
If ParCnt < 1 Then Exit Sub

ReDim PicNames(1 To ParCnt)
PicCnt = 0

FileName = Dir(DirName + "\*.jpg")
For i = 1 To ParCnt
If Len(FileName) = 0 Then Exit For
PicCnt = i
PicNames(PicCnt) = FileName
FileName = Dir()
Next

If ParCnt > 3 Then ParCnt = 3 ' Ограничимся 3 абзацами для проверки

For i = 1 To ParCnt
Doc.Paragraphs.Item(i).Range.Select

PicNum = i
If (PicNum > PicCnt) And (PicCnt > 0) Then
PicNum = PicNum Mod PicCnt
If PicNum = 0 Then PicNum = PicCnt
End If

sleep (1)
Selection.Collapse

If PicCnt > 0 Then
myF.Picture = LoadPicture(DirName + "\" + PicNames(PicNum))
If Not myF.Visible Then myF.Show
End If

sleep (1)
myF.Hide ' Скрываем после каждой картинки
Next
myF.Hide
End Sub
[/no]
Автор: Imanima
Дата сообщения: 08.05.2011 18:39
Не получается написать программу так, как написано выше. Абзацы выделяет программа внешняя. Нужно в ворде просто учесть факт, что был выделен абзац и показать картинку. То что AndVGri, я не понял. Может покажете как надо?
Автор: biznesoft
Дата сообщения: 10.06.2011 19:50
Вопрос следующий.
Каждое воскресенье получаю файлы в формате *. doc (ворд) - 150-200 файлов.
Нужно не открывая файлы вытянуть из каждого файла первый абзац и сохранить в новый документ ВОРД.

Основное требование - быстрое выполнение этого задания.

Все благодарю.
Автор: suomifinland
Дата сообщения: 11.06.2011 21:58
Ребята помогите...

Проблема такая, есть папка в которой более 50 файлов документов, размером от 300 Кб до 5 Мб в каждом файле есть одна и таже фраза "Статья отнесена к разделу"


Задача : Как сделать так чтобы одновременно, эта фраза, пакетно удалялась из предложенных документов. Я в макросах не сильна, если не сказать ВООБЩЕ ...

Если можно.., помогите ребята...


P.S. Word 2007, Windows 7 максимальная...
Автор: IvANANvI
Дата сообщения: 12.06.2011 00:24
biznesoft
Попытаюсь вам помочь. Сам не писал кода на VBS, взял готовый. В нем смысл в создании чистого файла Word, последовательное открытие и закрытие всех файлов DOC (rtf) в текущем каталоге с выполнением макросов Word (VBA). Желательно, чтобы макросы VBA были уже сохранены в шаблоне ворда с теми же именами. Скрипт VBS и VBA файлы должны лежать в директории с файлами.
На выходе открытый файл с 1-ми абзацами, друг за другом.

Вот ссылка на файл: http://rghost.ru/10458571


suomifinland Задача практически аналогичная, чуть переписать первый макрос ворд, под удаление постоянной строки. Второй VBA (PastePage.vba) закоментить. В VBS закоментить строки по созданию файла, а можно и не делать этого.
Автор: suomifinland
Дата сообщения: 12.06.2011 00:48
Все было бы просто замечательно, если бы не одно.., НО, я совершенная профанка в программировании, хотя и не блондинка...

Страницы: 1234567891011121314151617181920212223242526

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


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