Страницы: 1
RSS
Данные с Word в массив для последующей выгрузки на лист Excel
 
Пробую работать с документами Word. Копирование данных в Excel.
Опять же, работает-грузится. Но через копировать/вставить. Долго.
Как можно данные Word записать в массив? Можно только значения.
В Excel: задал диапазон, массив = значениям Range.
Тут не получилось.
 
Может так?
Скрытый текст

Или анализировать ActiveDocument.Range.Text, продумывать как разбивать этот текст для массива вывода на лист.
Изменено: anvg - 03.12.2013 18:48:15
 
Наверное, проще. Еще не пробовал. Спасибо.
Цитата
...продумывать как разбивать этот текст для массива вывода на лист
Может, без этого?
Вопрос шире: загнать в массив, обработать-поменять-переделать-переставить. Со второй частью справлюсь, а вот как его туда заставить?
 
Цитата
Может, без этого?
Вопрос шире: загнать в массив
Вот только как, в смысле - загнать? Такого "красивого" Range.Value, дающего массив, в Word ни для текста объекта Range, ни для ячеек таблиц. Можно, конечно, запросить у таблицы число строк/столбцов и циклом по ячейкам (ThisDocument.Tables(1).Cell(idRow, idCol).Range.Text) считать значения в массив, только сомневаюсь, что это будет будет быстрее, чем копировать/вставлять просто текст без форматирования.
 
Ясно. Я объектную модель Excel плохо знаю, а уж Word... :)
Спасибо за разъяснения.
 
Нашел здесь: http://www.cyberforum.ru/vba/thread693224.html
Может поможет :)
Код
Sub Fill_Table()
Dim tbl As Table
Dim t!, ii&, jj&, s$, w$(), i&
ActiveDocument.Range.Delete
    Set tbl = ActiveDocument.Tables.Add(Selection.Range, 200, 5)
    t = Timer
    Set tbl = ThisDocument.Tables(1) ''' [200*5]
    For ii& = 1 To tbl.Rows.Count
        For jj& = 1 To tbl.Columns.Count
            tbl.Cell(ii&, jj&).Range.Text = CStr(ii& * jj&)
        Next jj&
    Next ii&
    Debug.Print "fill table", Timer - t
    ReDim v(1 To tbl.Rows.Count, 1 To tbl.Columns.Count)
    t = Timer
    For ii& = 1 To tbl.Rows.Count
        For jj& = 1 To tbl.Columns.Count
            s = tbl.Cell(ii&, jj&).Range.Text
            v(ii, jj) = CDbl(Left$(s, Len(s) - 2))
        Next jj&
    Next ii&
    Debug.Print "read table", Timer - t
    t = Timer
    tbl.Range.Copy
                        'Excel должен быть запущен!
    With GetObject(, "excel.application").workbooks.Add(-4167).sheets(1) 'xlwbatworksheet
        .PasteSpecial "Текст", False, False
        v = .usedrange.Value
        .Parent.Close 0
    End With
    Debug.Print "Excel", Timer - t
    t = Timer
    w = Split(tbl.Range.Text, Chr$(13) & Chr$(7))
    For ii& = 1 To tbl.Rows.Count
        For jj& = 1 To tbl.Columns.Count
            v(ii, jj) = CDbl(w(i))
            i = i + 1
        Next jj&
        i = i + 1 'пустой столбец, который всегда есть справа от таблицы
    Next ii&
    Debug.Print "Split table text", Timer - t
Stop    'проконтролировать содержимое v!
End Sub 
 
Что подтверждает: быстрее и проще копировать-вставить, а уже потом над данными издеваться.
И Вам спасиба припасена :)
Страницы: 1
Читают тему
Наверх