Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 14:54   #1
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию Добавить столбец в таблицу на VBA

Добрый день.

Подскажите, пожалуйста, как в коде VBA
в текущей таблице (в которой сейчас курсор находится):

1) изменить ширину 2-го столбца (скажем, задать фиксированную ширину 1.2 см)

2) добавить справа столбец. (пусть, для простоты шириной 1 см)
внимание. в таблице есть строки с объединёнными ячейками. Там добавляется куча ненужный ячеек.
Надо этого избежать. (или просто удалить "лишние" ячейки в этих строчках.) ??

Подскажите, киньте, пожалуйста, примеро кода VBA (можно примеры/кусочки...)

p.s. собственно проблемная таблица прилагается. Это именно в неё стоит задача добавить столбец...
Вложения
Тип файла: rar Table_Oper.rar (4.4 Кб, 35 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2009, 15:45   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

По поводу ширины столбца, это просто.
Код:
Selection.Tables(1).Columns(2).Width=CentimetersToPoints(1,2)
А с добавлением, подумаю.

Вот и добавление. Чтобы не мучаться, добавляю по ячейке в каждую строку. Если в строке после добавления получается две ячейки, т.е. это строка с объединенными ячейками, то ячейки в этой строке объединяются.
Код:
Sub InsertCol()
  Dim RowsCnt&, oTbl As Table, oCell As Cell, oCellFirst As Cell
  Set oTbl = Selection.Tables(1)
  Set oCellFirst = oTbl.Cell(oTbl.Rows.Count, oTbl.Columns.Count)
  For RowsCnt = 1 To oTbl.Rows.Count
    Set oCell = oTbl.Rows(RowsCnt).Cells.Add
    oCell.Width = oCellFirst.Width
    If oTbl.Rows(RowsCnt).Cells.Count = 2 Then oTbl.Rows(RowsCnt).Cells.Merge
  Next
End Sub
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 23.04.2009 в 16:08.
viter.alex вне форума Ответить с цитированием
Старый 23.04.2009, 16:35   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

СПАСИБО! БОЛЬШОЕ!
будем тестировать!

Цитата:
По поводу ширины столбца, это просто.
Selection.Tables(1).Columns(2).Widt h=CentimetersToPoints(1,2)
а... не так всё просто... для моей таблицы (с объединённым ячейками) так просто не получается
Ошибка выдаётся...
Но ладно. направление задано. буду пытаться!
p.s. Если по поводу ширины есть дополнительные идеи/трюки — с удовольствием приму информацию!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2009, 16:44   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
…p.s. Если по поводу ширины есть дополнительные идеи/трюки — с удовольствием приму информацию!
Перебирай ячейки нужного тебе столбца. Номер столбца будет постоянным, а строки меняться. Только поставь On Error Resume Next, чтобы избежать ошибок, когда наткнешься на объединенную строку.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 24.04.2009, 01:12   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Уф! Вымучил... Начинаю понимать нелюбовь к таблицам Word секретарш и верстальщиков.

Код:
Sub ToBeSureInWidth() 'добавляет в таблицу колонку, шириной равную последней'
Dim LastColNum As Byte, ColWidth As Single, ColWidth2 As Single, i As Integer
Dim ColHeader As String

With ActiveDocument.Tables(1).Rows(1).Cells
ColWidth = .Item(.Count).Width 'ширина добавляемого "столбца" (ColWidth)'
.Item(.Count).Select
With Selection: ColHeader = Left(.Text, Len(.Text) - 2): .Collapse: End With
MsgBox ColHeader
End With

Do
    i = i + 1
    With ActiveDocument.Tables(1).Rows(i)
        LastColNum = .Cells.Count
        .Cells(LastColNum).Select
    End With
                
    With Selection
        ColWidth2 = .Cells.Width 'ширина "столбца" перед добавляемым'
        .MoveRight
        .InsertCells ShiftCells:=wdInsertCellsShiftRight 'добавляем ячейку'
        .Cells.Width = ColWidth
        If i = 1 Then Selection.TypeText ColHeader 'заголовок нового столбца'
                If ColWidth2 > ColWidth + 5 Then '+ 5 точек - для надёжности'
                .MoveLeft Count:=2, Extend:=wdExtend
                .Cells.Merge 'объединяем 2 ячейки, если ширина 1-й > ColWidth'
                End If
    End With
            
Loop Until ActiveDocument.Tables(1).Rows(i).IsLast

End Sub

Сергей, обратная операция — или по Ctrl-Z (кстати, очень красиво!), или нужен новый макрос.
Макрос запускается кнопкой TG (гл. меню→Надстройки), а если кнопки не видно, используйте альт-G.
Вложения
Тип файла: doc Table_Oper.doc (58.5 Кб, 46 просмотров)

Последний раз редактировалось Sasha_Smirnov; 24.04.2009 в 18:21.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 27.04.2009, 10:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

viter.alex и Sasha_Smirnov!
Большое спасибо за помощь!!

Пришлось, правда, напильничком код довести до рабочего состояния.
Но, главное, результат достигнут.

p.s. а для изменения ширины столбцов с объединёнными ячейками сработал такой код:
Код:
On Error Resume Next

i = 0
Do
    i = i + 1    
    With oTbl.Rows(i)
        i1 = .Cells(1).Width
        i3 = 0
        If i1 < 420 Then
          i3 = .Cells(3).Width
          .Cells(1).Width = 78
          .Cells(2).Width = 34
          If i3 < 330 Then
            .Cells(3).Width = 240
            .Cells(4).Width = 45
            .Cells(5).Width = 46
            .Cells(6).Width = 46
          Else
            .Cells(3).Width = 377
          End If
        Else
          .Cells(1).Width = 489
        End If
    End With         
Loop Until oTbl.Rows(i).IsLast
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.04.2009, 10:47   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А зачем сравнивать с конкретными числами ширину ячеек?

Объединенная ячейка по ширине равна ширине таблицы.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 27.04.2009, 14:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Объединенная ячейка по ширине равна ширине таблицы.
нет. это не так. не забывайте, что объединёнными могут быть не все ячейки в строке. И тут в моём случае (правда в пример это, к сожалению, не попало) третья ячейка объединяет в себе все ячейки до конца строки...
поэтому её ширина = ширина таблицы - ширина_1-го столбца - ширина_2-го_столбца...

p.s. впрочем. это всё уже имеет только теоретическое значение - ибо практическая задача уже успешно решена...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить все поля в таблицу с кода tarakan1983 БД в Delphi 5 24.03.2009 18:14
в 10-й столбец во все 100 ячеек добавить информацию 1ndigo Microsoft Office Excel 9 03.12.2008 17:57
Добавить таблицу в MS ACCESS Seqular БД в Delphi 5 21.02.2007 02:14