Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
19.04.2024, 14:58:23

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Word и VBA
| | |-+  Нужно автоматически разделить таблицу с двумя столбцами на строки
Страниц: [1]   Вниз
Печать
Автор Тема: Нужно автоматически разделить таблицу с двумя столбцами на строки  (Прочитано 6911 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RiantHoff
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« : 03.02.2016, 16:17:59 »

Внутри документа существует таблица из двух столбцов с парным текстом. Пример во вложении input.docx.
Нужно разделить столбцв на клетки - провости черту над каждым фрагментом в левой колонке.
Количество строк в общем случае в одной получившийся клетке неизвестно. Так как справа левому выражению может соответствовать много текста. Пример правильного результата во вложении output.docx.
Результат хочется видеть в виде макроса.
Спасибо!
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #1 : 03.02.2016, 17:08:49 »

Результат хочется видеть в виде макроса
Стесняюсь спросить: а сами-то что для решения сделали? Я понимаю, что хочется и все такое. Но Вам не хочется научиться писать макросы - Вы хотите получить готовое решение. Если я ошибаюсь - тогда хотя бы начните - запишите все эти действия макрорекордером и попробуйте подправить. И если будет не получаться - файлы с кодом и более конкретным примером того, что именно не получается уже сюда.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
RiantHoff
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« Ответ #2 : 04.02.2016, 06:25:13 »

Вообще нужно переформативровать две колонки в одну построчно.
Но есть широкие строки, котоыре не разбиты на клетки.
Я написал макрос, который делает первую часть. Берет просто копирует все и вставляет в новый документ без форматирования. Но столкнулся с тем, что если строка не разбита на подстроки, то для таких строк он сначала берет все подстроки из левого столбца, а затем все строки из правого.
Вот макрос:
Код: (vb)
Dim oDoc As Word.Document

Set oDoc = Application.Documents.Add()
'
Dim iDoc As Document

Set iDoc = Documents.Open("incopy.doc")

iDoc.Activate
Dim MyRange As Range
' Set MyRange = ActiveDocument.Range(Start:=0, End:=100)
Set MyRange = ActiveDocument.Range

oDoc.Activate
oDoc.Range = MyRange

' MsgBox (MyRange)

oDoc.SaveAs ("outcopy.docx")
iDoc.Close
oDoc.Close

Комментарий глобального модератора Кнопка оформления кода в сообщении - "VB Code"

Столкнувшись с этим я понял, что нужно предварительно разбить широкие строки на маленькие. Попробовал макросом записать. Способом "нарисовать таблицу". Но на такой способ запись макросов не работает.
Поняв это, я написал сюда.
Да, я пытался что-то сделать, и сделал это до того, как написать сюда.
Дело в том, что я думаю, что проблема не решаема простым способом. Нужно как-то определять начало текста в левой колонке. Понять, как это сделать, я пока не смог. Нужно лучше владеть моделями объектов в VBA Word.
Вы можете помочь?
« Последнее редактирование: 04.02.2016, 10:40:39 от vikttur » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #3 : 04.02.2016, 12:36:46 »

Не очень понял почему в Output порядок слов обратный. Так задумано? Судя по описанию - нет. Примерно такой код:
Код: (vb)
Sub SplitWords()
    Dim wdTable As Table
    Dim wdCol As Column
    Dim wdCell As Cell, wdCell2 As Cell, wdRow As Row
    Dim lr As Long
    Dim s, ss As String
    Dim asSp, asSp2, li As Long, lu As Long
   
    Set wdTable = ActiveDocument.Tables(1)
    Set wdCol = wdTable.Columns(1)
    For lr = wdCol.Cells.Count To 1 Step -1
        Set wdCell = wdCol.Cells(lr)
        Set wdCell2 = wdTable.Columns(2).Cells(lr)
        asSp = Split(wdCell.Range.Text, vbCr)
        asSp2 = Split(wdCell2.Range.Text, vbCr)
        For li = UBound(asSp) To 0 Step -1
            s = asSp(li)
            If Len(s) Then
                If Asc(s) = 7 Then s = ""
            End If
            If Len(s) Then
                If UBound(asSp2) >= li Then
                    ss = ss & vbCr & asSp2(li)
                End If
                If li > 0 Then
                    Set wdRow = wdTable.Rows.Add(wdTable.Rows(lr + 1))
                Else
                    Set wdRow = wdTable.Rows(lr)
                End If
               
                wdRow.Cells(1).Range.Text = asSp(li)
                wdRow.Cells(2).Range.Text = ss
                ss = ""
            Else
                If UBound(asSp2) >= li Then
                    ss = ss & vbCr & asSp2(li)
                End If
            End If
        Next
    Next
End Sub

Запускать при активном документе с нужной таблицей. Обрабатывается только одна первая таблица. Если таблиц больше - надо добавлять цикл по всем таблицам.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
RiantHoff
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля
« Ответ #4 : 07.02.2016, 13:48:10 »

Не очень понял почему в Output порядок слов обратный. Так задумано? Судя по описанию - нет. Примерно такой код:
Нет, конечно. Почему-то ошибся.
Спасибо огромное, ваш код работает.
Так как порядок слов нужно сохраинтьь.
Я заменил два раза встречающийся кусок код
Код: (vb)
ss = ss & vbCr & asS
p2(li)
на
Код: (vb)
ss = asSp2(li) & vbCr & ss

 
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru