1

Тема: Замена отступа в таблице на знак пробела.

Может кто подскажет, буду благодарен smile
Суть проблемы: Есть таблица (после файн ридера), в первой колонке во всех ячейках текст с разными отступами примерно от 0,5 до 4,5 см. Нужно заменить отступы (в каждой ячейке он свой) на соответствующее количество знаков пробела. Наверняка можно автоматизировать, но вот как? neutral

2

Re: Замена отступа в таблице на знак пробела.

а обязательно ли нужны пробелы? Может быть просто текст в таблице выровнять по центру??? Выравнивание пробелами в документировании считается не очень хорошей идеей, если не сказать грубее.. smile

3

Re: Замена отступа в таблице на знак пробела.

Да я знаю что выравнивание пробелами признак ..... smile .
Но заказчик сказал что его система не воспринимает отступы, поэтому нужно ставить пробелы соответственно отступам, тогда получится похоже на оригинал. Вот так. Теперь сижу ломаю голову как заманить отступы соответственным количеством пробелов. Ну а в ручную менять это просто повесится проще. smile

4

Re: Замена отступа в таблице на знак пробела.

Мне кажется, что алгоритм тут простой: выделить первую колонку (столбец), убрать отступы одним разом, и добавить пробелы в каждую ячейку данного столбца перед текстом. Безусловно, делается макросом. Кстати, с макросом и выделять ничего не нужно.
Ответ, ясное дело, неполон, ибо не привожу кода макроса. Может, мои коллеги подскажут?

5

Re: Замена отступа в таблице на знак пробела.

Убрать отступы одним разом оно конечно можно но проблема в том что в каждой ячейке отступ свой, и нужно менять соответствующий отступ на соответствующее количество пробелов. neutral  Так вот не могу сообразить как указать макросу что отступ 1,35 меняется предположим на 8 пробелов, а в следующей ячейке отступ 0,76 меняется предположим на 3 пробела. И делается это в каждой таблице.

6

Re: Замена отступа в таблице на знак пробела.

Если заказчик сказал и его не удаётся переубедить, то нужно делать. Для того, чтобы знать, сколько пробелов нужно ставить, нужно знать ширину одного пробела для данного кегля. Следовательно, если шрифт во всём столбце одинаковый, то нужно найти там пробел, измерить его ширину, разделить величину отступа на ширину пробела, убрать отступ, а перед текстом вставить полученное при делении число пробелов. Желательно при этом, чтобы выравнивание было по краям или по центру, а не по ширине.
В качестве затравки предложу такую процедуру:

Sub test()
  Dim oCell As Cell 'Ячейка
  Dim oRng As Range 'Диапазон ячейки
  Dim n As Long 'Положение пробела в ячейке
  Dim SpaceWidth As Single 'Ширина пробела
  Dim SpaceCount As Integer 'необходимое количество пробелов
  
  Set oCell = Selection.Cells(1)
  Set oRng = oCell.Range
  n = oRng.MoveStartUntil(" ", wdForward)
  If n <> 0 Then 'Если пробел в строке есть
    With oRng.Characters.First
      SpaceWidth = .Next.Information(wdHorizontalPositionRelativeToTextBoundary) - _
                  .Information(wdHorizontalPositionRelativeToTextBoundary)
    End With
    With oCell.Range
      'Вычисляем необходимое количество пробелов
      SpaceCount = CLng(.ParagraphFormat.FirstLineIndent / SpaceWidth)
      'Убираем отступ
      .ParagraphFormat.FirstLineIndent = 0
      'Вставляем пробелы вместо отступа
      .InsertBefore Space(SpaceCount)
    End With
  End If
End Sub
Лучше день потерять — потом за пять минут долететь!

7

Re: Замена отступа в таблице на знак пробела.

To: viter.alex

Так как кегль 9 то ширина пробела соответственно 3,38. (если я правильно понял первоисточники) другой кегль в таблице не используется.
Ваш код работает но не совсем так как нужно smile . Меняет отступ на пробелы только в первой ячейке (вроде не совсем правильно вычисляя их количество), а дальше перебора всех ячеек столбца не происходит.
Как думаете а если пойти по такой схеме: 1. Выделение первой ячейки первого столбца (обработать нужно только первый столбец) 2. Разделить величину отступа на ширину пробела (3,38 или 3,14 это не принципиально). 3. Убрать отступ. 4. Перед текстом вставить полученное при делении число пробелов. 5. Цикл повторить до окончания таблицы.
Я только пытаюсь постичь написание макросов поэтому возможно что то говорю не то smile .
И еще вопрос макрос для Word 2007 будет работать в Word 97 или нет? А то может Ваш код работает отлично, это просто у меня Word  старый smile .
Вечером попробую разобраться в Вашем коде, если получится smile

8

Re: Замена отступа в таблице на знак пробела.

По алгоритму - 1.1 Запомнить значение отступа текущей ячейки (так как вы сами говорили, что в каждой ячейке могут быть разные отступы)..

9

Re: Замена отступа в таблице на знак пробела.

avando пишет:

не совсем правильно вычисляя их количество

На чём основано это заключение? Точно заменить не получится, т.к. количество пробелов это целое число.

avando пишет:

а дальше перебора всех ячеек столбца не происходит.

Конечно, не происходит, ведь я привёл только пример. Но эту процедуру можно переделать так, чтобы в неё передавать ячейку, отступы в которой нужно менять. Как-то так (код с коленки)

Dim oCell As Cell
For Each oCell In ActiveDocument.Tables(1).Range.Cells
  If oCell.ColumnIndex = 1 Then
    Call ReplaceIndentToSpace(oCell)
  End If
Next

А саму процедуру записать так:

Sub ReplaceIndentToSpace(ByRef oCell As Cell)
  Dim oRng As Range 'Диапазон ячейки
  Dim n As Long 'Положение пробела в ячейке
  Dim SpaceWidth As Single 'Ширина пробела
  Dim SpaceCount As Integer 'необходимое количество пробелов
  
  Set oRng = oCell.Range
  n = oRng.MoveStartUntil(" ", wdForward)
  If n <> 0 Then 'Если пробел в строке есть
    With oRng.Characters.First
      SpaceWidth = .Next.Information(wdHorizontalPositionRelativeToTextBoundary) - _
                  .Information(wdHorizontalPositionRelativeToTextBoundary)
    End With
    With oCell.Range
      'Вычисляем необходимое количество пробелов
      SpaceCount = CLng(.ParagraphFormat.FirstLineIndent / SpaceWidth)
      'Убираем отступ
      .ParagraphFormat.FirstLineIndent = 0
      'Вставляем пробелы вместо отступа
      .InsertBefore Space(SpaceCount)
    End With
  End If
End Sub
Лучше день потерять — потом за пять минут долететь!

10

Re: Замена отступа в таблице на знак пробела.

To: viter.alex

Благодарю за помощь.
Слегка подправил Ваш код, а именно в этих местах:

'Вычисляем необходимое количество пробелов
      SpaceCount = CLng(.ParagraphFormat.LeftIndent / 3.38)
     
      'Убираем отступ
      .ParagraphFormat.LeftIndent = CentimetersToPoints(0)

Все заработало отлично.
Еще раз большое спасибо.