Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA for Word

159 views
Skip to first unread message

Paul A. Puchkov

unread,
Jul 13, 1999, 3:00:00 AM7/13/99
to
Hi, All!
Нет ли здесь знатоков, которые могут помочь решить следующую задачу. У меня
есть в Word'е табличка в две колонки типа прайса: название - цена. Хочется
сделать табличку "под обрез", т.е. ширину второй колонки сделать минимально
возможной для того, чтобы цена не переносилась в две строки. Суммарная
ширина строки, естественно, должна оставаться постоянной. Первый подход к
снаряду оказался достаточно медленным - я анализировал количество символов в
числе и выставлял ширину первой и второй ячейки в данной строке в некие
фиксированные (найденные ранее) значения. Работает, но очень долго. Хочется
убыстрить. Один из способов убыстрения, который мне пришел в голову,
проанализировать, сколько строк текста (Line) в строке таблицы (Row) и, если
высота Row - одна строка Line (а таких Row много), то ничего делать не надо.
Осталось понять, как определить высоту строки таблицы в строках текста.
Атрибут ActiveDocument.Tables(1).Rows(i).Height не помогает - поскольку
высота установлена, естественно, в авто, эта штука равна 999999.
Переключение в At Least не спасает - в ...Height попадает значение этого
этлиста, а вовсе не реальная высота ячейки. Как быть? Может, есть другие,
более простые варианты? Автоподбор не работает, у меня, во всяком случае, не
получилось - сбивается общая ширина строки или вообще (при длинной текстовой
части) начинает переносить цену.
Заранее благодарен, Павел Пучков.

Vitaliy Slobodyan

unread,
Jul 14, 1999, 3:00:00 AM7/14/99
to

Paul A. Puchkov wrote in message <7mfhm3$6f0$1...@news.radio-msu.net>...

>более простые варианты? Автоподбор не работает, у меня, во всяком случае,
не
>получилось - сбивается общая ширина строки или вообще (при длинной
текстовой
>части) начинает переносить цену.


А поподробнее, как ты автоподбор делаешь?


Paul A. Puchkov

unread,
Jul 14, 1999, 3:00:00 AM7/14/99
to
Vitaliy Slobodyan пишет в сообщении

>> Автоподбор не работает, у меня, во всяком
>> случае, не получилось - сбивается общая ширина
>> строки или вообще (при длинной текстовой
>> части) начинает переносить цену.
>А поподробнее, как ты автоподбор делаешь?
Я имел в виду обычный автоподбор ширины в таблице Word. Именно он и не
работает. Я же заранее вычислил ширину второй колонки (а как следствие, и
первой, т.к. общая ширина таблицы должна быть постоянной) для 3, 4, 5, ...
цифр, загнал их в массив, а далее написал
For Each r In ActiveDocument.Tables(1).Range.Rows
r.Cells(2).Select
Ndx = Selection.Characters.Count
r.Cells(1).SetWidth ColumnWidth:=W1(Ndx), _
RulerStyle:=wdAdjustNone
r.Cells(2).SetWidth ColumnWidth:=W2(Ndx), _
RulerStyle:=wdAdjustNone
Next r
Работает, но очень медленно, таблица из 1000 строк обсчитывается больше часа
на втором пне. Несколько убыстрить удалось тем, что для начала определил
типичную ширину второй колонки (4 знака до точки) и с самого начала выставил
всю таблицу в эту ширину. Потом смотрю на длину числа в ячейке и, если у
него 4 знака до точки, ничего не делаю. Но все равно долго.
Идея в том, чтобы узнать, а имеет ли смысл вообще изменять данную строку,
т.к. если высота строки таблицы - ровно одна строка текста, то можно все
оставить, как есть - все и так хорошо. Но как найти эту высоту? У меня пока
не получается. Попробовал написать
k1 = r.Range.Information(wdFirstCharacterLineNumber)
k2 = r.Next.Range.Information(wdFirstCharacterLineNumber)
k = k2 - k1
Здесь, получается, k=высота ячейки в строках текста, но сама функция
Information работает настолько долго, что напрочь съедается все преимущество
от скиппирования строки. К тому же документ многоколоночный, и при переходе
на следующую колонку высота становится отрицательной. И высоту последней
строчки этим способом посчитать не удается
К своему стыду не нашел в Help'е способ узнать текущее местоположение
курсора, точнее, номер строки, в котором он находится (номер символа в Story
могу, но это ничего не дает). Может, кто подскажет? Подозреваю, что это
должно быть как-то очень легко. Если получится, то можно подвинуть курсор в
начало ячейки, затем в конец, и если номер строки не изменится - ничего
делать не надо.
Но, возможно, есть какой-то намного более простой путь? Подскажите, кто
может!

Arkady Chernyak

unread,
Jul 15, 1999, 3:00:00 AM7/15/99
to
Hi Paul!

Что значит не работает? Попробуй так:

Sub AdjustColumns()
With ActiveDocument.Tables(1)
.Columns(2).AutoFit ' Должно работать
'Задаем общую ширину таблицы в пунктах (здесь ~15см)
.Columns(1).Width = 425 - .Columns(2).Width
End With
End Sub

--
Good Luck!
Аркадий


Paul A. Puchkov <pa...@inecs.com> wrote in message news:7mhji5$857$1...@ddt.demos.su...

Paul A. Puchkov

unread,
Jul 15, 1999, 3:00:00 AM7/15/99
to
Arkady Chernyak пишет в сообщении <7mis2t$hg8$1...@ddt.demos.su> ...

>> >> Автоподбор не работает, у меня, во всяком
>> >> случае, не получилось - сбивается общая ширина
>> >> строки или вообще (при длинной текстовой
>> >> части) начинает переносить цену.
>Что значит не работает? Попробуй так:
>
>Sub AdjustColumns()
> With ActiveDocument.Tables(1)
> .Columns(2).AutoFit ' Должно работать
> 'Задаем общую ширину таблицы в пунктах (здесь ~15см)
> .Columns(1).Width = 425 - .Columns(2).Width
> End With
>End Sub
В том то и дело, что мне хочется выставить ширину второй колонки индивидуально
для каждой строки, потому что если вторая ячейка (цена) маленькая, а первая
(наименование) достаточно длинная, есть шанс, ужав цену, расширить поле
наименования и сэкономить на этом текстовую строку. Ручная верстка показывает,
что таких строк много, и за счет них удается втиснуть таблицу на меньшее число
листов.
К тому же автофит - дурацкий: ежели в колонке есть пустые ячейки (от заголовка
раздела, скажем), он начинает уплотнять "в среднем", и число разбивается аж на
три строки (по результатам работы вышеотквоченного примера)

Arkady Chernyak

unread,
Jul 17, 1999, 3:00:00 AM7/17/99
to
Hi Paul!

Тогда могу предложить более медленный метод (148 строк за 62 секунды на Р166ММХ), но более быстрый, чем приведенный тобой в предыдущем письме.

Sub TableFormatEx()
Dim inpTableWidth As Single
Dim CurRow As Row
inpTableWidth = InputBox("Введите ширину таблицы", "Adjust Columns") * 28.35
Application.ScreenUpdating = False
With Selection.Tables(1)
.Columns(2).Select
With Selection.ParagraphFormat
.Alignment = wdAlignParagraphRight
.FirstLineIndent = 0 ' Если попадаются ячейки
.LeftIndent = 0 ' с форматом параграфов,
.RightIndent = 0 ' иначе можно удалить.
End With
For Each CurRow In .Rows
With CurRow
If .Cells(2).Range.Characters.Count > 1 Then
.Cells.AutoFit ' Применяем только к непустым ячейкам
.Cells(1).SetWidth inpTableWidth - .Cells(2).Width, wdAdjustNone
Else
.Cells(2).Delete
.Cells(1).SetWidth inpTableWidth, wdAdjustNone
End If
End With
Next CurRow
End With
Selection.Collapse (wdCollapseStart)
Application.ScreenUpdating = True
End Sub

--
Good Luck!
Аркадий

Paul A. Puchkov <pa...@inecs.com> wrote in message news:7mkin4$a1v$1...@ddt.demos.su...

Paul A. Puchkov

unread,
Jul 18, 1999, 3:00:00 AM7/18/99
to
Arkady Chernyak пишет в сообщении
>Тогда могу предложить более медленный метод (148 строк за 62 секунды на
>Р166ММХ), но более быстрый, чем приведенный тобой в предыдущем письме.
THNKS, but I have 2 questions:
1. Почему Вы считаете, что автофит работает быстрее, чем принудительное задание
ширины ячейки? Это действительно так?
2. Все равно хочется не применять преобразований к Row, которые и так состоят из
одной строки текста. Повторяю вопрос - как определить, сколько текстовых строк
содержит одна Row таблицы?


Arkady Chernyak

unread,
Jul 20, 1999, 3:00:00 AM7/20/99
to
Hi Paul!

Paul A. Puchkov <pa...@radio-msu.net> wrote in message...


> THNKS, but I have 2 questions:
> 1. Почему Вы считаете, что автофит работает быстрее, чем принудительное задание
> ширины ячейки? Это действительно так?

Да, если эту ширину нужно сначала вычислить. Если задавать непосредственно числом, то автофит немного медленнее.

> 2. Все равно хочется не применять преобразований к Row, которые и так состоят из
> одной строки текста. Повторяю вопрос - как определить, сколько текстовых строк
> содержит одна Row таблицы?

Почему не хочется? Время сэкономить на этом ИМХО не удастся, т.к. оно уйдет на проверку.

--
Good Luck!
Аркадий


Paul A. Puchkov

unread,
Jul 21, 1999, 3:00:00 AM7/21/99
to
Arkady Chernyak пишет в сообщении
>> 1. Почему Вы считаете, что автофит работает быстрее, чем принудительное
задание
>> ширины ячейки? Это действительно так?
>Да, если эту ширину нужно сначала вычислить. Если задавать непосредственно
числом, то
>автофит немного медленнее.
Ну, вычислить дело не трудное. Их всего 5 типоразмеров.

>> 2. Все равно хочется не применять преобразований к Row, которые и так состоят
из
>> одной строки текста. Повторяю вопрос - как определить, сколько текстовых
строк
>> содержит одна Row таблицы?
>Почему не хочется? Время сэкономить на этом ИМХО не удастся, т.к. оно уйдет на
проверку.
А изменение ширины колонки приводит к вызову внутреннего алгоритма выравнивания
текста в ячейке, что, имхо, не очень быстро. У меня была идея попробовать
реализовать проверку на "ничего не делание", замерить время и сравнить
результаты. А сейчас просто "заело". Неужели нет _простого_ способа определить
высоту ячейки таблицы в строках текста???
И вообще, я не нашел в хелпе способа узнать номер строки на листе, в которой
находится текущий курсор. В самом Ворде этот номер высвечивается в середине
нижней рамки. А как вытащить его в VBA?

Lev Tikhonov

unread,
Jul 21, 1999, 3:00:00 AM7/21/99
to

> А изменение ширины колонки приводит к вызову внутреннего алгоритма
выравнивания
> текста в ячейке, что, имхо, не очень быстро. У меня была идея попробовать
> реализовать проверку на "ничего не делание", замерить время и сравнить
> результаты. А сейчас просто "заело". Неужели нет _простого_ способа
определить
> высоту ячейки таблицы в строках текста???
> И вообще, я не нашел в хелпе способа узнать номер строки на листе, в
которой
> находится текущий курсор. В самом Ворде этот номер высвечивается в
середине
> нижней рамки. А как вытащить его в VBA?

Посмтори хелп по

Selection.Information wdVerticalPositionRelativeToTextBoundary

Лев.

0 new messages