Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Alex_off
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 5
1

Формирование таблиц Word

14.04.2013, 23:33. Просмотров 3141. Ответов 17
Метки нет (Все метки)

Доброго времени суток, господа программеры! Есть небольшая проблемка, пытаюсь ее решить, теперь и с Вашей помощью. Необходимо программными средствами создать таблицу в Word из трех различных "типовых" строк. Количество, последовательность и наполнение этих строк постоянно будет меняться. Ясно одно, что нужно создать три объекта (Range или Table) и вставлять их по мере необходимости, но как это в реальности в жизнь воплотить я не догоняю, т.к. с синтаксисом у меня проблемы. Прошу помощи, может хотя бы вектор направляющий мне дадите. Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 23:33
Ответы с готовыми решениями:

Автоматизация работы в Microsoft Word: формирование таблиц, запись данных
Люди проконсультируйте, не смотрите, что вопрос может быть не очень умный. Обычно использовал VBA...

Word: макрос для таблиц. Отформатировать определенный вид таблиц
В документе два вида таблиц. Первый тип таблиц имеет вертикальную шапку сбоку (левый столбец) и...

Формирование консолидированной таблицы из 2-ух таблиц с различными разрезами
Добрый вечер, уважаемые форумчане. Помогите, пожалуйста, решить следующую задачу. Имеется 2...

Выгрузка данных из txt файла и формирование таблиц в Excel
Здравствуйте, Форумчане! Вопрос состоит вот в чём, у меня имеются данные в формате txt файла,...

Формирование списка в Word на основании таблицы Excel
Добрый день! Столкнулся с проблемой: Мне нужно создать в Word список из одинаковых строк и...

17
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
15.04.2013, 01:59 2
Для вставки каждой строки нужно сделать отдельную процедуру и вызывать по мере надобности. В качестве параметра процедуры передавать таблицу, в которую добавляем строки.
Пример добавления трёх типовых строк, у которых различается форматирование
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub test()
    Do Until ActiveDocument.Tables(1).Rows.Count >= 15
        Call AddRow1(ActiveDocument.Tables(1))
        Call AddRow2(ActiveDocument.Tables(1))
        Call AddRow3(ActiveDocument.Tables(1))
        DoEvents
    Loop
End Sub
Sub AddRow1(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
        .Shading.BackgroundPatternColor = wdColorAqua
    End With
End Sub
Sub AddRow2(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
        .Shading.BackgroundPatternColor = wdColorBlueGray
    End With
End Sub
Sub AddRow3(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
        .Shading.BackgroundPatternColor = wdColorIndigo
    End With
End Sub
1
Alex_off
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 5
15.04.2013, 11:46  [ТС] 3
Строки добавляет, но цвет не меняет, ошибку выдает.

Run-time error "91" выдает
object variable or with block variable not set

Что не так?
0
shanemac51
Модератор
Эксперт MS Access
8709 / 3390 / 530
Регистрация: 07.08.2010
Сообщений: 9,496
Записей в блоге: 2
15.04.2013, 12:05 4
Код
Sub test_151202()
Dim j1, j2

If Word.ActiveDocument.Tables.Count = 0 Then
Word.ActiveDocument.Tables.Add Selection.Range, 1, 4
Else
j2 = Word.ActiveDocument.Tables(1).Rows.Count
Do While j2 > 1
Word.ActiveDocument.Tables(1).Rows(j2).Delete
j2 = j2 - 1
Loop
End If
j1 = 0
    Do While j1 < 5
    j1 = j1 + 1
        Call AddRow1(ActiveDocument.Tables(1))
        Call AddRow2(ActiveDocument.Tables(1))
        Call AddRow3(ActiveDocument.Tables(1))
        DoEvents
    Loop
End Sub
1
15.04.2013, 12:05
Alex_off
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 5
15.04.2013, 12:23  [ТС] 5
Спасибо за помощь!
На листе все описанные объекты есть, строки к таблице добавляются, но их форматирования не происходит, выдает ошибку.
shanemac51, текст дописал, не помогло. Выдает ошибку в том же месте (на 11ой строке начального кода).
Ничего не понимаю... Проблема в какой-то мелочи, что еще больше раздражает...
0
Скрипт
5451 / 1132 / 49
Регистрация: 15.09.2012
Сообщений: 3,426
15.04.2013, 13:14 6
Alex_off, сформируйте Word-документ с примерными данными, выложите этот документ на Форуме и на основе документа опишите вашу задачу.
0
Alex_off
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 5
15.04.2013, 15:01  [ТС] 7
Приложил шаблончик и вариант предлагаемого решения. Вариант "Делай в Excel'е" только не предлагайте...
0
Вложения
Тип файла: docx Sub test.docx (14.5 Кб, 22 просмотров)
Тип файла: docx Шаблон.docx (15.7 Кб, 17 просмотров)
Alex_off
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 5
15.04.2013, 16:45  [ТС] 8
Visual Basic
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
Sub test()
Do Until ActiveDocument.Tables(1).Rows.Count >= 15
Call AddRow1(ActiveDocument.Tables(1))
Call AddRow2(ActiveDocument.Tables(1))
Call AddRow3(ActiveDocument.Tables(1))
DoEvents
Loop
End Sub
 
Sub AddRow1(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
    .Shading.ForegroundPatternColor = wdColorAqua ‘необходимое форматирование
    End With
End Sub
 
Sub AddRow2(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
        .Shading.BackgroundPatternColor = wdColorBlack
     End With
End Sub
Sub AddRow3(ByVal ParentTable As Table)
    With ParentTable.Rows.Add()
       .Shading.BackgroundPatternColor = wdColorBrightGreen
     End With
End Sub
Добавлено через 1 час 27 минут
Цитата Сообщение от Alex_off Посмотреть сообщение
.Shading.ForegroundPatternColor = wdColorAqua ‘необходимое форматирование
Ошибка здесь вылезает...
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
15.04.2013, 16:45 9
Ошибка возникает, потому что в "шапке" есть ячейки, оъединённые по вертикали, в связи с чем отсутствует доступ к отдельным строкам. Поэтому нужно работать с ячейками. Универсальное решение мне в голову не приходит, но для частного случая можно сделать так:
Visual Basic
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
Sub test()
    Dim i As Integer
    For i = 1 To 3
        Call AddRow1(Selection.Tables(1))
        Call AddRow2(Selection.Tables(1))
        DoEvents
    Next i
End Sub
 
Sub AddRow1(ByVal ParentTable As Table)
    ParentTable.Rows.Add
    Dim oRng As Range
    Set oRng = ParentTable.Cell(1, 1).Range
    oRng.SetRange ParentTable.Cell(ParentTable.Rows.Count, 1).Range.Start, _
                  ParentTable.Cell(ParentTable.Rows.Count, ParentTable.Columns.Count).Range.End
    
    oRng.Cells.Merge
End Sub
 
Sub AddRow2(ByVal ParentTable As Table)
    ParentTable.Rows.Add
    Dim oRng As Range
    Set oRng = ParentTable.Cell(1, 1).Range
    oRng.SetRange ParentTable.Cell(ParentTable.Rows.Count, 1).Range.Start, _
                  ParentTable.Cell(ParentTable.Rows.Count, 1).Range.End
    oRng.Cells.Split 7, ParentTable.Columns.Count, True
End Sub
1
AlexBes
1 / 1 / 0
Регистрация: 16.04.2013
Сообщений: 16
16.04.2013, 01:13 10
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim i, j As Integer
Sub таблица()
'
' таблица
'
With ActivDocument.Table(1)
     For i = 3 To .Rows.Count
      For j = 3 To .Columns.Count
          If .Cell(2, i) > .Cell(j, 2) Then
             .Cell(i, j).Range = "Тело плавает"
            Else
             .Cell(i, j).Range = "Тело тонет"
          End If
       Next j
      Next i
End With
End Sub
помогите плиз, выдает ошибку
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
16.04.2013, 01:18 11
Цитата Сообщение от AlexBes Посмотреть сообщение
If .Cell(2, i) > .Cell(j, 2) Then
Одна ячейка не может быть ни больше ни меньше другой. Какую ошибку-то выдаёт?
0
AlexBes
1 / 1 / 0
Регистрация: 16.04.2013
Сообщений: 16
16.04.2013, 02:03 12
424
object required
Как сравнить эти ячейки?
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
16.04.2013, 03:19 13
Цитата Сообщение от AlexBes Посмотреть сообщение
Как сравнить эти ячейки?
Ну как-то так:
Visual Basic
1
If Val(.Cell(2, i).Range.Text) > Val(.Cell(j, 2).Range.Text) Then
1
AlexBes
1 / 1 / 0
Регистрация: 16.04.2013
Сообщений: 16
16.04.2013, 03:36 14
спасибо конечно за ответ, но у меня сравниваемые значения из таблицы в ворде (ваш вариант - из userform)
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
16.04.2013, 04:25 15
Цитата Сообщение от AlexBes Посмотреть сообщение
ваш вариант - из userform
Откуда такой вывод? Сравнивать нужно не ячейки, а числовое значение текста внутри этих ячеек, что, собственно, я и написал
0
AlexBes
1 / 1 / 0
Регистрация: 16.04.2013
Сообщений: 16
16.04.2013, 04:36 16
попробовал ваш вариант - все равно ругается, не нравится ему строчка
With ActivDocument.Table(1)
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
16.04.2013, 07:20 17
Цитата Сообщение от AlexBes Посмотреть сообщение
попробовал ваш вариант - все равно ругается, не нравится ему строчка
With ActivDocument.Table(1)
Должно быть
Visual Basic
1
With ActiveDocument.Tables(1)
Я видел эту опечатку и раньше, но посчитал случайностью.
0
AlexBes
1 / 1 / 0
Регистрация: 16.04.2013
Сообщений: 16
16.04.2013, 09:00 18
спасибо огромное, всё пошло
0
16.04.2013, 09:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 09:00

Автоматическое формирование содержания для нескольких Word документов
при создании макроса у меня появляется Application.Templates( _ ...

Форматирование таблиц в WORD
Есть форматирование таблиц в Word, не знаю как избавится от ошибки 5991 &quot;отсутствует доступ к...

Парсинг таблиц WORD
В общем, написал алгоритм перебора ячеек Cell. Вроде, все хорошо. Однако, проблема с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru