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

» Word VBA

Автор: Brainiacs
Дата сообщения: 24.02.2012 14:56
А вот и решение по этому вопросу:


Цитата:
Option Explicit

Const wdDialogToolsTemplates = &H57

Dim strDocumentList
Dim strBadTemplate
Dim strDocument
Dim strTemplate

Dim objFSO
Dim objWord


strDocumentList = "E:\Песочница\0120\DocumentList.txt"
strBadTemplate = "\\fileserver2\USERS$\sba\My Documents\Brand Manual\Brand Manual\templates Norit russia\Templates NV\Norit NV - brief - ENG, V060403.dot"


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strDocumentList) Then
Set objWord = WScript.CreateObject("Word.Application")

With objFSO.OpenTextFile(strDocumentList)
Do Until .AtEndOfStream
strDocument = .ReadLine()

If objFSO.FileExists(strDocument) Then
WScript.Echo strDocument

With objWord.Documents.Open(strDocument)
strTemplate = objWord.Dialogs(wdDialogToolsTemplates).Template

If strTemplate = strBadTemplate Then
WScript.Echo " Template found in document [" & strDocument & "]"

.AttachedTemplate = "Normal.dotm"
.Save
End If

.Close
End With
Else
WScript.Echo "Document [" & strDocument & "] not found"
End If
Loop

.Close
End With

objWord.Quit

Set objWord = Nothing
Else
WScript.Echo "Document list [" & strDocumentList & "] not found"
End If

Set objFSO = Nothing

WScript.Quit 0


Большущее спасибо Petya V4sechkin и alexii aka Iska aka хорошие люди))
Автор: Prent
Дата сообщения: 26.02.2012 18:06
Господа, помогите пожалуйста, если это возможно.

Мне нужно получить из текста вида:

Код:
Страна_1 | Новоалексеевка | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Уралл | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Средничкин | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Городищестройдом | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Новоалексеевка | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Ломовой | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Среднегорск | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Ломовой | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Городищестройдом | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Среднегорск | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Край | доп.параметры к тексту | доп.параметры к тексту

Страна_2 | Новоалексеевка | доп.параметры к тексту | доп.параметры к тексту
Страна_2 | Ломовой | доп.параметры к тексту | доп.параметры к тексту
Страна_2 | Край | доп.параметры к тексту | доп.параметры к тексту
Страна_2 | Среднегорск | доп.параметры к тексту | доп.параметры к тексту


Страна_3 | Новоалексеевка | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Уралл | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Средничкин | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Городищестройдом | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Новоалексеевка | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Ломовой | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Среднегорск | доп.параметры к тексту | доп.параметры к тексту
Страна_2 | Край | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Ломовой | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Городищестройдом | доп.параметры к тексту | доп.параметры к тексту
Страна_2 | Край | доп.параметры к тексту | доп.параметры к тексту
Страна_1 | Уралл | доп.параметры к тексту | доп.параметры к тексту
Страна_3 | Среднегорск | доп.параметры к тексту | доп.параметры к тексту
Автор: panda3
Дата сообщения: 27.02.2012 11:14
Нафига это делать в Worde? Вот тебе скриптик, который преобразует текстовый файл в нужный формат:

Код:
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var fName = WScript.Arguments(0);
var f = FSO.OpenTextFile(fName, 1);
var fw = FSO.OpenTextFile(fName +".new", 2, true);

var countries = {};

for (var i = 0; !f.AtEndOfStream; i++)
{
    var s = f.ReadLine();
    if ( s.length == 0 )
        continue;
    s.match(/(.*?)\s*\|\s*(.*?)\s*(\|.*)/);
    if (!countries[RegExp.$1])
        countries[RegExp.$1] = [];
    countries[RegExp.$1].push([RegExp.$2, RegExp.$3]);
}
f.Close();

var arr = [];
for (i in countries)
{
    i = new String(i);
    i.arr = countries[i];
    arr.push(i);
}
arr.sort();
fw.WriteLine("В тексте есть: " + arr.join(", "));
for (i = 0; i < arr.length; i++)
{
    fw.WriteLine("\n" + arr[i] + "\n");
    var in_arr = arr[i].arr;
    in_arr.sort(function($1, $2) {
        $1 = $1[0]; $2 = $2[0];
        if ($1.length != $2.length)
            return $1.length - $2.length;
        if ($1 < $2) return -1;
        if ($1 > $2) return 1;
        return 0;
    });
    for (var j = 0; j < in_arr.length; j++)
        fw.WriteLine(in_arr[j].join(" "));
}
fw.Close();
Автор: yozhic
Дата сообщения: 01.03.2012 22:23
Подскажите, пожалуйста. Есть UserForm, после нажатия на кнопку выполняется макрос и фокус остается на форме. Какой командой перенести фокус на документ?
Автор: AndVGri
Дата сообщения: 02.03.2012 00:35
yozhic
Вызывать форму MyFrom.Show vbModeless
То есть не модально
Автор: yozhic
Дата сообщения: 02.03.2012 08:32
AndVGri
Спасибо. Я невнятно задал вопрос. Я искал вот это: Application.Activate (уже нашел :)
Автор: Marlenx
Дата сообщения: 01.04.2012 21:48
[more] [more] Excel работает как функция, как преобразовать код транслит на Word (Sub - End Sub)

Public Function CYR2LAT(ByVal sCYR As String) As String
Dim ci As Integer
Dim iChars As Integer
Dim ArrCYR
Dim ArrLAT

ArrCYR = Array("а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", _
"р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ь", "ъ", "ы", "э", "ю", "я", _
"А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
"С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ь", "Ъ", "Ы", "Э", "Ю", "Я")
ArrLAT = Array("a", "b", "v", "g", "d", "e", "zh", "z", "i", "y", "k", "l", "m", "n", "o", "p", _
"r", "s", "t", "u", "f", "kh", "ts", "ch", "sh", "shch", "", "", "y", "e", "yu", "ya", _
"A", "B", "V", "G", "D", "E", "Zh", "Z", "I", "Y", "K", "L", "M", "N", "O", "P", _
"R", "S", "T", "U", "F", "Kh", "Ts", "Ch", "Sh", "Shch", "", "", "Y", "E", "Yu", "Ya")

iChars = UBound(ArrCYR)
'Предобработка
CYR2LAT = sCYR
'Замена Ё на Е
CYR2LAT = Replace(CYR2LAT, "Ё", "Е")
CYR2LAT = Replace(CYR2LAT, "ё", "е")
'Если первая в слове Е, то меняем на Йе
CYR2LAT = ReReplace(CYR2LAT, "(^|[^А-Яа-я])Е", "$1Ye")
CYR2LAT = ReReplace(CYR2LAT, "(^|[^А-Яа-я])е", "$1ye")
'Меняем Е после гласной и ЪЬ на Йе
CYR2LAT = ReReplace(CYR2LAT, "([аяоёыиэеуюъьАЯОЁЫИЭЕУЮЪЬ])е", "$1ye")
CYR2LAT = ReReplace(CYR2LAT, "([аяоёыиэеуюъьАЯОЁЫИЭЕУЮЪЬ])Е", "$1Ye")
'Замена по массиву
For ci = 0 To iChars
CYR2LAT = Replace(CYR2LAT, ArrCYR(ci), ArrLAT(ci))
Next ci
End Function

Function ReReplace(ByVal ReplaceIn, ByVal ReplaceWhat As String, _
ByVal ReplaceWith As String, Optional ByVal IgnoreCase As Boolean = False)
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.IgnoreCase = IgnoreCase
RE.Pattern = ReplaceWhat
RE.Global = True
ReReplace = RE.Replace(ReplaceIn, ReplaceWith)
End Function [/more] [/more]
Автор: Alexey87
Дата сообщения: 07.05.2012 19:08
Подскажите пожалуйста как должен выглядеть код макроса, который сможет реализовать выбор значений из полей со списком (элементы ActiveX), находящихся в таблице (таблицу задействовал как автотекст)
или как по другому реализовать выбор данных через автотекст?

при вставке автотекста в полях со списком ничего не выбирается (2 поля, Word 2003)
Автор: life_so_good
Дата сообщения: 11.05.2012 15:28
Можно ли как-то обработать пример, средствами VB с целью превращения его в документ excel ?

Пример сокращен до нескольких строк, в реалии их может быть несколько сотен или более...

Сам пример
Автор: Gena1971
Дата сообщения: 12.05.2012 00:40
life_so_good
Интересно, откуда такой изврат получается?
Может легче просто преобразовать (распечатать) в картинку и распознать finereader`ом?
Автор: grbdv
Дата сообщения: 12.05.2012 00:57
Gena1971
Изврат
+1

life_so_good
Покажи оригинальный материал (кусок), а не модель.
А если это и есть оригинал, то лечить надо на стадии зачатия - выбрать нужный подоконник в подъезде. Щаз уже поздняк. И неинтересно, увы... Через OCR (Gena1971 +1) и то веселее.
Автор: life_so_good
Дата сообщения: 12.05.2012 08:07
grbdv
Gena1971
парни, это и есть оригинал, sap рожает через скан то это понятно... думал мб есть иной путь
Автор: grbdv
Дата сообщения: 12.05.2012 12:54
life_so_good
Грустно. Попробуй пошукай в контексте "парсер для rtf", "структура rtf". Может дешевле и эффективнее rtf, как текстовый файл распарсить? В этой теме про VB может спросить... Веб-программеры должны, по идее, часто с подобными задачами сталкиваться.

Добавлено:
life_so_good
Вот, взгляни
Это экселевский файл. Надо его положить в одну папочку вместе с primer.rtf
В редакторе VBA надо подключить библиотеку Word:
Alt+F11, Tools - Refernces - в списке найти 'Microsoft Word 11.0 Object Library' и поставить галку.
Зайти в Module1, встать внутрь процедуры sb_rtf2xls и нажать F5.

Я объектную модель Word почти не знаю, поэтому не справился с явным выделением текста из рамки. Сделал тупо в лоб - копи-пасте. Из-за этого получаются накладки в ячейках, где присутствуют табуляции. Вобщем, надо, чтобы кто-то, хорошо знающий Ворд подключился.


Код: Sub sb_rtf2xls()
Dim wrd As Object, frm As Frame, dcm As Document, rng As Range
Dim lCol&, lCC&, lRR&
Dim sPathName$

Cells.Clear ' clear sheet content

sPathName = ThisWorkbook.Path & "\" & "primer.rtf"
lCol = 8 ' set columns qty

Set wrd = CreateObject("Word.Application")
wrd.Visible = True
Set dcm = wrd.Documents.Open(sPathName)

lRR = 0: lCC = 1
For Each frm In dcm.Frames
If lCC = 1 Then
lRR = lRR + 1
lCC = lCol + 1
End If
lCC = lCC - 1
frm.Copy
Cells(lRR, lCC).PasteSpecial (xlPasteValues)
Next
Set wrd = Nothing
End Sub
Автор: GreatWorm
Дата сообщения: 17.05.2012 15:00
Подскажите, пожалуйста, как -
1. Заменить все строки начинающиеся с определенного слова? Нужно очистить текст с форума от мусора.
То есть -
Vasya66 - October 17, 2011, 09:26:09 pm
blabla blablablablablablablablablablablabla

JoX - October 17, 2011, 09:29:07 pm
blablablablablablablablablablablablablabla

На -

Vasya66
blabla blablablablablablablablablablablabla

JoX
blablablablablablablablablablablablablabla
Автор: Gena1971
Дата сообщения: 17.05.2012 16:37
GreatWorm
Подумал немного, можно заменой попробовать (надо включить подстановочные знаки)
Сначала в поле найти вставить строку (без кавычек)
"^0032-^0032^0032[ADFJMNOS][a-z]@[ehlry]^0032[0-9]{2},^0032[0-9]{4},^0032[0-9]{2}:"
в поле заменить
"000дата000" - (к примеру)
И произвести полную замену
Потом вторым заходом в поле найти (без кавычек)
"000дата000[0-9]{2}:[0-9]{2}^0032[ap]m"
заменить - очистить.
И снова полная замена.
За раз не получилось, слишком длинное выражение получается.
Это точно для приведенного примера, пробелы имеют значение.
Вроде как то так.
------
Подправил немного
Автор: grbdv
Дата сообщения: 17.05.2012 17:02
GreatWorm
Исходник ведь текстовый файл? Подгрузить библиотеку VBScript и читать исходный файл построчно. Искать первое вхождение "-" с начала строки, проверять его на обрамление одним пробелом слева и двумя справа. Если в никах тоже могут быть дефисы, то в с таком случае искать следующее вхождение. Считать от начала строки до позиции дефиса - 2. Записать в целевой файл. Экспортировать его в ворд. Можно и сразу в ворд писать.
Автор: grbdv
Дата сообщения: 17.05.2012 19:17
GreatWorm
Бзв, в смежной теме по Екселю есть отчаянные поклонники регэкспа, они, думаю, смогут и в одно движение руки смогут записать... Или даже в полдвижения :)
Автор: Alexey87
Дата сообщения: 18.05.2012 22:02
все еще нуждаюсь в решении вопроса
Автор: manhattan 22
Дата сообщения: 23.05.2012 13:02
здравствуйте.
помогите пожалуйста с такой проблемой:

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

сейчас я каждый раз вручную переключаю рег. параметры через панель управления.

подозреваю, что можно написать макрос на Document_Open, чтобы к английскому файлу были пременены нужные региональные параметры. то есть в системе будут русские настройки, а в отдельном файле английские.
Автор: Gena1971
Дата сообщения: 23.05.2012 14:13
manhattan 22
А эти файлы точно вордовские? Ворд только с текстом оперирует. И если в нем стоят запятые, то они там должны остаться и при смене региональных настроек. Может все таки exel?
Автор: manhattan 22
Дата сообщения: 23.05.2012 15:05
да, файлы точно ворд.
в таблицах стоит табуляция "по разделителю", что обеспечивает выравнивание положительных и отрицательных значений (они в скобках) с висячей последней скобкой.
если открыть англ файл с русскими настройками - разделитель групп разрядов "," ворд примет за разделитель целой и дробной части, получится что-то вроде:
12,345
678

а должно быть:
12,345
678
Автор: Gena1971
Дата сообщения: 23.05.2012 19:19
manhattan 22
Никогда не пользовался этой фичей. Но не думаю, что из документа ворда можно управлять глобальными настройками винды, кучей параметров в реестре. Может проще создать еще одного пользователя с английскими настройками и быстро переключаться между ними. По моему проще, чем настройки каждый раз править.
Автор: msmih
Дата сообщения: 28.05.2012 16:26
народ, подскажите, есть макрос, написанный с использованием richtx32.ocx, попытка запустить на word 2010 x64 вылетила в трубу. куда сейчас смотреть? и что надо менять?
Автор: reenoip
Дата сообщения: 09.07.2012 14:20
Отправили к вам, но, судя по активности вашей темы, ответа на мой вопрос мне как минимум до конца этого лета можно не ждать




p.s.
Мне можно и без конвертации, самое главное - чтобы формат при сохранении автоматически выставлялся как "Документ Word 97-2003", а не "Веб-страница".


p.p.s.
Вопрос закрыт.
Автор: YuryS2006
Дата сообщения: 24.07.2012 13:42
Доброго дня! Тема не активная, но вдруг кто откликнется...
Поставлена задача переделать некий бланк для клиентов из Excel в Word. Возникла необходимость запрограммировать поля (не в форме, а прямо в тексте!), в которые клиент может вписывать свои значения.

Имеем
поле "Сумма, руб." - текстовое,
поле "НДС" - список со значениями "0%", "10%" и "18%"
и
поле "Сумма НДС, руб.", которое должно вычисляться, как Сумма*НДС/(100+НДС) и выводиться в третье поле цифра при выборе 10% и 18% или "не облагается", при выборе 0%.


В Excel'e это все легко и просто решалось, но как сделать в word'e? Буду очень признателен, если кто-нибудь напишет скриптик на VBA
Автор: YuryS2006
Дата сообщения: 28.07.2012 17:49
Вопрос закрыт.Решение найдено
Автор: oshizelly
Дата сообщения: 04.08.2012 00:19
В Word есть некоторое количество штатных команд, изменяющих объект циклически на определённую величину. Например, пара штатных команд "Увеличить/уменьшить размер шрифта" (Grow font/Shrink font). То есть, нажали на кнопку или хоткей один раз - шрифт увеличился на 2 пункта, ещё раз нажали - ещё увеличился на 2 пункта...
А нельзя ли при помощи макроса написать аналогичный цикл для тех команд, для которых это штатно не предусмотрено? Например, увеличить/уменьшить сжатие/расширение шрифта (charackter spacing)? Пробовал создать макрос примитивной записью действий, но так цикла не получается: макрос просто запоминает конкретные выходные значения
Спасибо!
Автор: grbdv
Дата сообщения: 04.08.2012 00:29
oshizelly

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

Надо его модифицировать:

Считать в переменную текущее значение параметра, увеличить/уменьшить значение переменной на шаг равный или больший минимального, присвоить параметру новое значение переменной. Это если по-уму :)

Или проще, в лоб: параметр = параметр + шаг
Автор: oshizelly
Дата сообщения: 04.08.2012 01:55
grbdv

Цитата:
Считать в переменную текущее значение параметра, увеличить/уменьшить значение переменной на шаг равный или больший минимального, присвоить параметру новое значение переменной. Это если по-уму

Или проще, в лоб: параметр = параметр + шаг


А нельзя ли привести пример с любым произвольным элементом, хоть с тем же character spacing - grow by 1pt. Или даже два примера: как по уму, и как наоборот (в лоб)
Автор: grbdv
Дата сообщения: 04.08.2012 02:11
oshizelly
Дык, конечно можно. Давай свой код, который:
Цитата:
Пробовал создать макрос примитивной записью действий, но так цикла не получается: макрос просто запоминает конкретные выходные значения

Вот на нем и покажу :)


Добавлено:
Ну-у, тебя не дождешься :) Вот, в лоб:

Код:
Sub sb_Spasing_UP
Call sb_Spasing(1)
End Sub
Sub sb_Spasing_DN
Call sb_Spasing(-1)
End Sub
Sub sb_Spasing(pUpDn%)
With Selection.Font
.Spacing = .Spacing + pUpDn * 0.1
End With
End Sub

Страницы: 1234567891011121314151617181920212223242526

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


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