Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Word VBA

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 
 
Обсуждаем вопросы только по Word VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Word, не относящиеся к программированию, задаем в теме Microsoft Word

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Рекомендации:
Если у Вас есть проблема, не решаемая стандартными средствами Word (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Word (на вкладке Разработчик - Запись Макросов). Подробнее здесь. В большинстве случаев получившийся код (Разработчик-Макросы-Макрос-Изменить или Разработчик-Visual Basic) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроенная помощь (F1), естественно.
 
Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылезает ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

 
Рекомендуется к прочтению:
  • Начало работы с VBA в Word 2010
  • Microsoft Visual Basic for Application. Осетрова И.С., Осипов Н. А. Учебное пособие (руководство по программированию на VBA в MS Office)  
  • Введение в VBA для приложений MS OFFICE
  • Word и его объекты. Лекция из курса «Основы офисного программирования и документы Word»
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Справка по VBA
  • Microsoft Word Visual Basic Reference - руководство по VBA (eng.)
  • Справочник по Word VBA
  • Блог Александра Гуревича  - тематический блог: советы по работе с Word и Excel и прочие материалы
  • Форум по VBA, Excel и Word Макросы в Word -тематический форум, готовые решения
  • Список полезной литературы по Word и программированию на VBA
  • Подборка решений на VBA для Word  
     
     
  • Excel VBA все вопросы по Excel VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы/готовые решения:
  • функция возвращает список закладок в документ
     
    Перечень основных ColorIndex'ов из MSDN
     
    - стартовый вопрос топика...

    Смежные темы:
    Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
    Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
    Программы » Word FAQ | Excel FAQ | Access FAQ
    Прикладное программирование » Excel VBA | Access VBA  
    Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
    Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
    Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
    Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007

  • Всего записей: 3329 | Зарегистр. 27-09-2001 | Отправлено: 03:05 01-06-2005 | Исправлено: ALeXkRU, 17:10 03-08-2021
    InSe0F



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
     
    Есть такая задачка.
    Есть word в котором допустим есть только заголовки (уровни 1,2 и 3), текст, списки булетами и с нумерацией, и картинки.
     
    Этот ворд надо перегнать в файл с простейшей html версткой (h1,h2,h3,i,b,li,img) и сохраненными картинками в png.
     
    Можно ли как-нибудь решить такую задачку или возможно ее уже кто-то до меня решил?

    Всего записей: 533 | Зарегистр. 13-03-2006 | Отправлено: 23:16 27-09-2012
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не работает. Я немного пишу в VBA Excel но Word, как софтину, никогда не понимал и не любил - у нас с ним это взаимно)  
    Вот и сейчас - с учетом подсказок, я не понимаю что надо сделать для решения этой примитивной задачи.  
    Если у кого будет минута соединить весь код - буду благодарен.  
     
    P.S. Цеплять пример не буду - там абракатабра в 5 слов, из которых два выделены жирным шрифтом. Засорение эфира только.
    Спасибо.

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 17:40 28-09-2012 | Исправлено: ol7ca, 17:41 28-09-2012
    AKBA

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    Private Sub CommandButton1_Click()
     
        Dim lNumber As Long
        Dim i As Long
         
        'Помещаем в переменную lNumber, с какого номера
        'должна начинаться нумерация бланков.
        lNumber = Me.TextBox1.Value
         
        'проверяем на согласие с условием
        If CheckBox1.Value = False Then
         
        'выводим сообщение
        MsgBox "Ошибка!" & " " & "Необходимо принять условие."
        Else
         
        'Делаем столько витков цикла, сколько бланков необходимо вывести на печать.
        For i = 1 To Me.TextBox2.Value Step 1
         
                Dim oDoc As Document
                Set oDoc = Application.Documents.Add("C:\Primer\BLANK.docm")
               
                'Помещаем в закладку "bN_1" данные из переменной lNumber.
                oDoc.Bookmarks("bN_1").Range.Text = lNumber + (i - 1)
                 
                'Помещаем в закладку "bN_2" данные из переменной lNumber.
                oDoc.Bookmarks("bN_2").Range.Text = lNumber + (i - 1)
     
                'Помещаем в закладку "bN_3" данные из переменной lNumber.
                oDoc.Bookmarks("bN_3").Range.Text = lNumber + (i - 1)
     
                'Помещаем в закладку "bN_4" данные из переменной lNumber.
                oDoc.Bookmarks("bN_4").Range.Text = lNumber + (i - 1)
             
                'Распечатываем.
                Application.PrintOut Range:=wdPrintAllDocument, Item:= _
                wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
                ManualDuplexPrint:=True, Collate:=True, Background:=True, PrintToFile:= _
                False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
                PrintZoomPaperHeight:=0
             
        'Скрываем пользовательскую форму
        UserForm1.Hide
         
        Next i
        End If
    End Sub

     
    Здесь представлен работающий код, теперь уже с пользовательской формой (в которой TextBox1 и TextBox2 для ввода значений, CheckBox1 для принятия условия, а также кнопка CommandButton1, которая является основной).
     
     По-прежнему есть некоторые моменты, которые хотелось бы улучшить:
     1 - в документе "BLANK.docm", над которым и проводятся все действия, имеется 4 закладки на 4 одинаковых числа, которые начинаются с цифры "ноль". Например, 012222. Так вот сейчас я вынужден был перед каждой закладкой поместить цифру "ноль",а в поле TextBox1 пользовательской формы UserForm1 вбивать значение без цифры "ноль", например 12222.  
     Можно ли сделать так, чтобы в поле TextBox1 я вносил значение например 012222, в поле TextBox2 я вносил значение например 2 и при этом происходила правильная отработка "lNumber + (i - 1)" и на печать выводились документы с изменёнными номерами - 012222 в первом документе и 012223 во втором документе?
     2 - во время выполнения кода открываются новые вкладки с документами, с изменёнными номерами. Как избавиться от этого, чтобы ничего не появлялось, а просто в очередь печати все документы складывались сразу и всё?
     3 - необходима двусторонняя печать документа "BLANK.docm". Принтер обладает необходимой функцией.
     
    Добавлено:
    по пункту 2 родилась вот какая идея
     

    Код:
        'закрываем активный документ без сохранения изменений, поскольку после вставки
        'текста произошла замена закладки
        ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges

     
    правильно? или есть другой, болеее правильный вариант?
     
     и ещё появились следующие вопросы (сохранена сквозная нумерация проблем):
     
    4 - текст, вводимый в TextBox1, должен проверяться на следующие условия - это должно быть число, число должно состоять из 5 цифр, и не должно начинаться на ноль.
     
    5 - текст, вводимый в TextBox2, должен проверяться на следующие условия - это должно быть число равное "1", "2" или "50".

    Всего записей: 68 | Зарегистр. 30-09-2007 | Отправлено: 20:09 29-09-2012
    Black_Lung



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AKBA
    1. передние нули отбросятся , если обязательно нужно чтобы были добавляйте "0"&Cstr(lNumber + (i - 1))
    4. if isnumeric(TextBox1)=true  then проверить на число
    ..left(TextBox1,1)="0" проверить первый ноль
    len(TextBox1)=5  - длина
     
    5. if TextBox2=1 or TextBox2=2 or TextBox2=50 then..

    Всего записей: 275 | Зарегистр. 09-10-2008 | Отправлено: 11:45 01-10-2012
    AKBA

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Black_Lung
    спасибо, сейчас буду переваривать и пробовать =)
     
    очень хотелось бы услышать комменты на тему пункта 3 особенно
     
    Добавлено:
    Black_Lung
    по пункту 1 - вообще замечательно получилось, огромное-преогромное спасибо!!!
    по пункту 4 - вопрос частично отпал, поскольку вы помогли с пунктом 1.
    по пункту 5 - вот мне непонятно что писать после слова Then
                         если идти от обратно и написать If Not TextBox2=1, то это условие ещё проверится, а как сделать чтобы каждое из них проверялось на несоответствие? потому что мне надо просто сделать - при несовпадении - сообщение показывается.
     
    Добавлено:
    по пункту 5 - решил вопрос - поставил после выражения If Not скобки
     
    Итак, оставшиеся вопросы:
    1 - двусторонняя печать
    2 - как правильно вставлять текст на место закладок, чтобы закладки при этом не удалялись?

    Всего записей: 68 | Зарегистр. 30-09-2007 | Отправлено: 19:14 01-10-2012
    Black_Lung



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как настроить двухсторонюю печать в vba
    там очень много буков, проще создать отдельно дублирующий принтер с двухсторонней печатью поумолчанию и выбирать его с помощью ActivePrinter
     

    Всего записей: 275 | Зарегистр. 09-10-2008 | Отправлено: 13:28 02-10-2012 | Исправлено: Black_Lung, 13:28 02-10-2012
    AKBA

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Black_Lung
    СПАСИБО
    я уже находил эту статью MS, там действительно слишком много буковок =)
    Последую вашему совету - настрою дубликат принтера скорее всего.

    Всего записей: 68 | Зарегистр. 30-09-2007 | Отправлено: 21:15 02-10-2012
    AKBA

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем спасибо, решил все свои вопросы.

    Всего записей: 68 | Зарегистр. 30-09-2007 | Отправлено: 22:29 03-10-2012
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Все же не выходит у меня каменный цветок. Есть ли тут умельцы, которые осилят эту задачу?
    Имеем - текст с выделенными фразами (форматирован как bold). Надо этот выделенный текст скопировать вниз документа и там создать из этого текста список. Как найти выделенный текст и сделать копи - я разобрался а как вставить это вниз и сделать список - тут не смог даже с подсказкой одного доброго форумчанина.  
    ниже файл и код.  
    (Скачать Doc2.docm с rapidshare.ru)
     
    Спасибо.
    Подробнее...

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 21:38 09-10-2012 | Исправлено: ol7ca, 22:03 09-10-2012
    koyusi

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...
    По-людски ведь просят - выкладывай на ргхост. Спецом что ли на рапиду льешь?  
     
    Код в море выше. По-уму, так надо вначале все вхождения просто скопировать вниз, под sHdr, а потом уж все махом списком форматнуть.  [/more]

    Всего записей: 87 | Зарегистр. 03-10-2012 | Отправлено: 23:39 09-10-2012 | Исправлено: koyusi, 23:43 09-10-2012
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    koyusi

    Цитата:
    ргхост
    не сработал.

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 00:52 10-10-2012
    manhattan_22

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем доброго дня.
    Прошу помощи у знатоков.
     
    Есть файл с таблицами. Внутри числа выровнены с помощью табуляции "по разделителю". Нужно это для того, чтобы положительные и отрицательные (они пишутся в скобках) числа отображались друг под другом с висячей правой скобкой.
     
     100
    (100)
     
    Этот файл существует в двух вариантах - английском и русском. Для того, чтобы выравнивание "по разделителю" работала правильно, английскую версию документа надо смотреть с английскими региональными параметрами, а русскую с русскими (то есть каждый раз лезть в Пуск - Панель управления - Язык и региональные стандарты и менять Анг на Рус, потом обратно).
     
    Вопрос собственно в следующем:
    можно ли в английский файл прописать макрос, который при открытии файла будет менять региональные параметры на английские, а при закрытии возвращать русские?
     
    Буду благодарен за любые ссылки на матчасть.

    Всего записей: 21 | Зарегистр. 23-05-2012 | Отправлено: 12:12 07-11-2012
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    manhattan_22
    Поменять настройки просто:

    Код:
    Option Explicit
     
    Private Declare Sub SetLocaleInfoA Lib "kernel32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String)
    Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
     
    Const LOCALE_SDECIMAL As Long = &HE
    Const LOCALE_STHOUSAND As Long = &HF
     
    Public Sub SetDecimalFormat()
      Dim lcid As Long
      lcid = GetUserDefaultLCID()
      SetLocaleInfoA lcid, LOCALE_SDECIMAL, ","
      SetLocaleInfoA lcid, LOCALE_STHOUSAND, " "
    End Sub

    Но я не думаю, что эти изменения подхватятся на лету.

    Всего записей: 206 | Зарегистр. 06-02-2007 | Отправлено: 10:59 08-11-2012
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Салют! Ищу скрипт, чтоб случайным образом менял регистр в русскоязычном тексте.  Коды символов верхних и нижних регистров отличаются  на 32, кроме пары ёЁ - там разница 16. Как мне это видится - парсим текст в цикле, если код текущего символа в диапазоне 192-223 - прибавляем 32 случайным образом (если рандомное число меньше 0,5 - прибавляем, если больше - оставляем как есть), если 224-255 - вычитаем случайным образом, отдельно обрабатывается пара 184;168. Или может быть есть более совершенные методы.

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 22:29 12-11-2012
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    crotoff
    Парсить - это круто сказано про последовательный перебор. Да и сравнение с 0.5 - удачно выбрано :)
     
    Я бы пошел другим путем. Сгенерил бы случайных целых в диапазоне от 1 до Len(sStr)  случайным количеством от 0.4 до 0.6 этой Len(sStr). Если текст достаточно большой, то разбить его на разумные блоки sStr(i). После этого Mid справа проверять нужный символ на диапазон и соответственно этой проверке менять через синтаксис Mid слева. Если символ совсем не подходит, то просто пропустить. Как-то так...

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 00:05 13-11-2012
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jollyboy
    а, догнал! символы выбираются случайным образом, и безусловная замена производится уже над выбранными

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 09:27 13-11-2012 | Исправлено: crotoff, 10:19 13-11-2012
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    crotoff
    Йез, йез! Пока писал расшифровку ты сам вкурил.
     
    Ты идешь перебором ВСЕХ символов в строке и случ. обр. их меняешь. На достаточно большом тексте кол-во замен будет плясать вокруг 50%.  
     
    Я же пляшу от обратного. Определяюсь - сколько надо заменить ("случайным количеством от 0.4 до 0.6 этой Len(sStr)") и обрабатываю кол-во в два раза меньше.

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 11:19 13-11-2012
    Gena1971



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    crotoff
    Если надо действительно случайно, то необходимо предусмотреть замену больших на малые (в начале предложений). Или перед началом сделать все мелкими.

    ----------
    Фашисты будущего будут называть себя антифашистами - Черчилль
    Кому я должен, я всем прощаю...

    Всего записей: 2567 | Зарегистр. 25-01-2005 | Отправлено: 14:29 13-11-2012
    jollyboy

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    crotoff
    Gena1971

    Цитата:
    предусмотреть замену больших на малые (в начале предложений). Или перед началом сделать все мелкими.

    Вот жирное действительно полезно - LCase весь текст. А UCase существенно упростит поверку диапазонов кодов.

    Всего записей: 30 | Зарегистр. 30-10-2012 | Отправлено: 15:00 13-11-2012
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gena1971
    коды "больших" лежат в другом диапазоне, впрочем как оно в Wordе я без понятия.  
    jollyboy
    Что такое Mid, LCase, UCase?
    Накидайте кстати годных функций - Длина строки, Текущий символ, Код символа и Символ кода, а если не лень, то и сам скрипт всё быстрее будет, чем в справочниках ковыряться

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 17:09 14-11-2012 | Исправлено: crotoff, 17:09 14-11-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Word VBA


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru