Строки в массив в word

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Копировать строки в массив

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Сообщений [ 10 ]

1 05.12.2013 21:53:20

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Тема: Копировать строки в массив

Здраствуйте.
Юрий М(с этого сайта: внешняя ссылка)
посоветовал этот сайт: http://wordexpert.ru/

Вот мой вопрос:
Как можно скопировать все строки файла docx
в 1-мерный массив MyArray()???

Должно получиться так:

MyArray(1)="Это 1-ая строка"
MyArray(2)="Это 2-ая строка"
...
MyArray(10)="Это последняя строка"

wink

2 Ответ от shanemac51 05.12.2013 22:21:14

  • shanemac51
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 05.03.2012
  • Сообщений: 467
  • Поблагодарили: 119

Re: Копировать строки в массив

строка или параграф(абзац)

3 Ответ от UserSuperPupsik 05.12.2013 22:45:16

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Re: Копировать строки в массив

В чём разница?
Например дан текст:

      Это 1-ая строка
Это 2-ая строка, да.
Это последняя строка, да.

А должно получится так:

MyArray(1)="      Это 1-ая строка"
MyArray(2)="Это 2-ая строка, да"
...
MyArray(10)="Это последняя строка, да"

Думаю сейчас прояснилось.
Если нет, то Вы мне объясните в чём разница, пожалуйста. wink

4 Ответ от shanemac51 05.12.2013 23:07:33

  • shanemac51
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 05.03.2012
  • Сообщений: 467
  • Поблагодарили: 119

Re: Копировать строки в массив

Перед фрагментом текста с новой ориентацией страниц и после него будут автоматически вставлены разрывы раздела . Если документ уже разбит на разделы, можно щелкнуть в любом месте нужного раздела (либо выделить несколько разделов), а затем изменить ориентацию страниц только в выбранных разделах.
===
ПАРАГРАФ=1
строк-5

5 Ответ от UserSuperPupsik 06.12.2013 00:29:18

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Re: Копировать строки в массив

shanemac51, извините я старался, но Вас не понял.При чём тут ориентация, разрывы и разделы smile
Дело в том, что я работал всегда с excel vba.
А о word vba ничего не знаю.
Можете дать хоть какой-нибудь примерчик???Чтобы было ясно о чём идет речь.
Спасибо за внимание!

6 Ответ от UserSuperPupsik 06.12.2013 00:45:31

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Re: Копировать строки в массив

Вот мой файл. Там есть (переходы на следующую строку)- простой случай smile
Можете туда положить макрос?

Post’s attachments

1.docm 10.04 Кб, 4 скачиваний с 2013-12-06 

You don’t have the permssions to download the attachments of this post.

7 Ответ от UserSuperPupsik 08.12.2013 14:53:45

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Re: Копировать строки в массив

Вот мой вопрос:
Как можно скопировать все строки файла docx
в 1-мерный массив MyArray()???

Должно получиться так:
MyArray(1)=»Это 1-ая строка»
MyArray(2)=»Это 2-ая строка»
MyArray(10)=»Это последняя строка»

Примечание: Новая Строка начинается после (перехода на следующую строку)(или на жатия «enter»)

Ответьте пожалуйста! smile

8 Ответ от aap77 10.12.2013 11:33:04

  • aap77
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 12.09.2011
  • Сообщений: 925
  • Поблагодарили: 243

Re: Копировать строки в массив

Вот функция для записи одномерного массива строк документа.

Public Function AllStroke_inArray() As Variant
Dim AWind As Window
Dim APane As Pane
Dim Pages As Pages
Dim Page As Page
Dim Rect As Rectangle
Dim LineCount As Long
Dim lst() As Variant
Dim Line As Line

    Set AWind = Application.ActiveWindow
    Set APane = AWind.ActivePane
    Set Pages = APane.Pages
'---------------------------------------------------------------------
        For Each Page In Pages
            If Page.Rectangles.Count = 1 Then
                Set Rect = Page.Rectangles(1)
            Else
                Set Rect = Page.Rectangles(2)
            End If
                LineCount = LineCount + Rect.Lines.Count
        Next Page
        LineCount = LineCount - 1
'---------------------------------------------------------------------
    ReDim Preserve lst(0 To LineCount)
    
'---------------------------------------------------------------------
    i = -1
    For Each Page In Pages
        If Page.Rectangles.Count = 1 Then
            Set Rect = Page.Rectangles(1)
        Else
            Set Rect = Page.Rectangles(2)
        End If
            For Each Line In Rect.Lines
                i = i + 1
                lst(i) = Line.Range.Text
            Next Line
    Next Page
'---------------------------------------------------------------------

    AllStroke_inArray = lst

End Function

Учтите что массив это область хранения информации, поэтому может быть функцией (Function) для присвоения ее другим переменным в других процедурах, либо свойством какого-либо класса (Property).

9 Ответ от aap77 10.12.2013 12:11:01

  • aap77
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 12.09.2011
  • Сообщений: 925
  • Поблагодарили: 243

Re: Копировать строки в массив

UserSuperPupsik, если возникают вопросы пишите.

10 Ответ от UserSuperPupsik 10.12.2013 12:36:56

  • UserSuperPupsik
  • рядовой
  • Неактивен
  • Зарегистрирован: 05.12.2013
  • Сообщений: 6

Re: Копировать строки в массив

aap77, Даже и не знаю что сказать, Вы весьма проницательный человек, Спасибо, за Ваш труд!!! big_smile
Я немного изменил код под собственные нужды:

Public lst() As Variant
Public Function CopyToArray() As Variant
Dim AWind As Window
Dim APane As Pane
Dim Pages As Pages
Dim Page As Page
Dim Rect As Rectangle
Dim LineCount As Long
'Dim lst() As Variant
Dim Line As Line

    Set AWind = Application.ActiveWindow
    Set APane = AWind.ActivePane
    Set Pages = APane.Pages
'---------------------------------------------------------------------
        For Each Page In Pages
            If Page.Rectangles.Count = 1 Then
                Set Rect = Page.Rectangles(1)
            Else
                Set Rect = Page.Rectangles(2)
            End If
                LineCount = LineCount + Rect.Lines.Count
        Next Page
        LineCount = LineCount - 1
'---------------------------------------------------------------------
    ReDim Preserve lst(0 To LineCount)
    
'---------------------------------------------------------------------
    i = -1
    For Each Page In Pages
        If Page.Rectangles.Count = 1 Then
            Set Rect = Page.Rectangles(1)
        Else
            Set Rect = Page.Rectangles(2)
        End If
            For Each Line In Rect.Lines
                i = i + 1
                lst(i) = Line.Range.Text
            Next Line
    Next Page
'---------------------------------------------------------------------

    'CopyToArray = lst

End Function

Public Sub Macros1()
CopyToArray 'копировать все строки в массив lst, внимание индексация начинается с 0
MsgBox (lst(2)) 'вывести на экран 3-ю строку
End Sub

wink

Сообщений [ 10 ]

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Похожие темы

  • Пропадают все стили при операции: Копировать => Вставить
  • как соединить строки
  • Строки в комбобокс
  • Разбивка на строки
  • Поменять строки местами: Я на А, Ю на Б, Э на В и т.д.
  • Высота строки в таблице
  • Определение конца строки
  • Как сделать полужирными строки 18, 19, 20

Копировать строки в массив

Постоянно работая с теми  либо иными инструментами и выполняя однотипные задачи, пользователь любой программы вырабатывает со временем способы наиболее рационального их исполнения. Наш сайт о Microsoft Office Word даст ответ про: как нумеровать страницы в ворде.
Но,  сталкиваясь с задачей другого типа, часто оказывается в тупике и вынужден обращаться за помощью. Наш сайт о Microsoft Office Word даст ответ про: применить формулу умножения в ворде.

На форуме сайта Ворд Эксперт пользователи различных версий Ворда делятся друг с другом вариантами решений привычных для них операций. Наш сайт о Microsoft Office Word даст ответ про: комбинация клавиш открытие буфера обмена в word.
При этом то, что кажется вам самим собой разумеющимся может быть неизвестно другому участнику и наоборот, поэтому обмен получается очень взаимовыгодным. На портале о Microsoft Office Word вы узнаете про: как проставить нумерацию в таблице.

Здесь обсуждаются настройки, форматирование документов, например, удаление лишних пробелов, оформление содержания и придания требуемых стилей разделам автоматически и так далее. Наш сайт о Microsoft Office Word даст ответ про: word а1.
Очень много внимания уделено принципам написания макросов и шаблонов, изложенным очень доступно, приведены готовые варианты. На портале о Microsoft Office Word вы узнаете про: скопировать таблицу из word.
Информацию можно отыскать по всем версиям приложения. Также можно оставить заявку на выполнение любой работы, связанный с Вордом. На портале о Microsoft Office Word вы узнаете про: убрать в word колонтитулы раздел.

Найдете на форуме и ответы на базовые вопросы, и дополнительный список источников. Обсудить проблемы, прямо не касающиеся Ворда, и оставить отзыв можно в разделе «Общение». На портале о Microsoft Office Word вы узнаете про: вставить кнопку в ворде 2007.

AnnetteKr

0 / 0 / 0

Регистрация: 30.06.2020

Сообщений: 4

1

Word

01.07.2020, 13:12. Показов 1659. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Имеется задание:
Нужен макрос MS Word, который работает с участком текста документа, выделенного пользователем. Заносит каждое слово участка текста в массив, удалив знаки препинания, сортирует массив по возрастанию
Не знаю как к этому подступить.
Написала только:

Visual Basic
1
2
Dim str As String
        str = Word.Selection  'Вставляет в строку выделенный текст



0



Narimanych

2632 / 1637 / 745

Регистрация: 23.03.2015

Сообщений: 5,149

01.07.2020, 15:42

2

Лучший ответ Сообщение было отмечено AnnetteKr как решение

Решение

AnnetteKr,

как один из вариантов:

Кликните здесь для просмотра всего текста

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 MMM()
Set RR = CreateObject("VBScript.RegExp")
With RR
       .Global = True
       .Pattern = "[A-Za-zА-Яа-яЁё]+"
     ReDim ARR(.Execute(Selection).Count) As String
     For i = 0 To .Execute(Selection).Count - 1
       ARR(i) = .Execute(Selection).Item(i)
    Next
 End With
 
 For i = 0 To UBound(ARR) - 1
    For j = i + 1 To UBound(ARR)
              If Len(ARR(j)) < Len(ARR(i)) Then
                             TMP = ARR(i)
                            ARR(i) = ARR(j)
                             ARR(j) = TMP
               End If
    Next
Next
 
 For i = 0 To UBound(ARR) - 1
   Debug.Print (ARR(i))
Next
End Sub



1



0 / 0 / 0

Регистрация: 30.06.2020

Сообщений: 4

02.07.2020, 07:03

 [ТС]

3

Narimanych, Спасибо! Сработало!
Только разобраться не могу что значит выражение: (.Execute(Selection).Count)?
И при выводе сообщения i=0 выдает пустую строку, а UBound(ARR) — 1- убирает нужное слово. Это исправила.



0



779 / 461 / 79

Регистрация: 18.05.2016

Сообщений: 1,242

Записей в блоге: 4

02.07.2020, 08:09

4

Цитата
Сообщение от AnnetteKr
Посмотреть сообщение

(.Execute(Selection).Count)

Это метод RegExp на выполнение обработки строки, т.е. получение количества строк в массиве. Регэксп — это такая штука, которой даёшь строку, паттерн и необязательную строку для замены. Он по паттерну пытается разобрать строку и возвращает список найденного или строку под замену. Умение придумывать подходящие паттерны — это особый дар



1



Модератор

Эксперт MS Access

11343 / 4661 / 749

Регистрация: 07.08.2010

Сообщений: 13,512

Записей в блоге: 4

02.07.2020, 08:15

5

Цитата
Сообщение от amd48
Посмотреть сообщение

Умение придумывать подходящие паттерны — это особый дар

увы, я никак не могу вникнуть в логику сложных паттернов, даже простые пишу с трудом, хотя методичку наверно раз 5 прочитала



1



779 / 461 / 79

Регистрация: 18.05.2016

Сообщений: 1,242

Записей в блоге: 4

02.07.2020, 09:02

6

Паттерны можно только придумывать. Читать их совсем нереально



0



0 / 0 / 0

Регистрация: 30.06.2020

Сообщений: 4

02.07.2020, 10:03

 [ТС]

7

shanemac51, а что за методичка такая?
Я только начала самостоятельно изучать язык программирования, многое еще не понимаю… Нужно как-то заполнять пробелы)



0



Модератор

Эксперт MS Access

11343 / 4661 / 749

Регистрация: 07.08.2010

Сообщений: 13,512

Записей в блоге: 4

02.07.2020, 10:15

8

Цитата
Сообщение от AnnetteKr
Посмотреть сообщение

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

вряд ли паттерны относятся к началам программирования, у вас сейчас много проблем с более нужными понятиями

я имела а виду описание по RegExp — описание параметров и команд, точного названия не помню(последняя попытка освоения была более года назад)
пока обхожусь простейшими заменами, обычно из WORD



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.07.2020, 10:15

Помогаю со студенческими работами здесь

При открытии документа word 2013 в word 2010 меняется структура текста
Здравствуйте. Для вуза сделал в ворд 2013 два реферата. Пошел распечатывать. Оказалось, что в том…

Перенос диапазона текста+рисунков+таблиц из Word в шаблон Word через макрос Excel
Доброго времени, товарищи!
Работа заставляет ценить время, и задачи типа &quot;сделай 350 однотипных…

Дан массив слов. Сформировать массив из длин этих слов и вычислить в нем максимум из четных элементов
Дан массив слов. Сформировать массив из длин этих слов и вычислить в нем максимум из четных…

Дан массив слов. Сформировать массив из длин этих слов и вычислить в нем максимум
Дан массив слов. Сформировать массив из длин этих слов и вычислить в нем максимум.

Как лучше всего сделать сохранение >100 страниц из word шаблона с заменой ключ. слов в один word файл для посл. печати?
Я вот думаю, как?

Точнее не думаю, я уже приступлю к созданию всего этого завтра, но хотел бы…

Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов
мне нужна функция, которая во входе получает строку слов и рзделителей (&quot; &quot;, &quot;,&quot;, &quot;.&quot;, &quot;_&quot;, &quot;&quot;&quot;),…

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

Или воспользуйтесь поиском по форуму:

8

Asked
11 years, 1 month ago

Viewed
7k times

I want to to get the total word document text into a variable and want to split the string into an array with newline as delimiter. How can I do that?

Dim str
str = ActiveDocument.?  

Martijn Pieters's user avatar

asked Feb 25, 2012 at 23:41

Is this a «doc» file or a «txt» file?

something like this should work

Sub Test()
Dim arr() As String
arr = Split(ActiveDocument.Content.Text, Chr(13))
End Sub

answered Feb 26, 2012 at 4:00

brettdj's user avatar

brettdjbrettdj

54.6k16 gold badges113 silver badges176 bronze badges

0

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

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

Прикрепленные файлы

  • проба.rar (25.53 КБ)

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#2

03.12.2013 18:47:38

Может так?

Скрытый текст

Или анализировать ActiveDocument.Range.Text, продумывать как разбивать этот текст для массива вывода на лист.

Изменено: anvg03.12.2013 18:48:15

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#3

03.12.2013 19:02:42

Наверное, проще. Еще не пробовал. Спасибо.

Цитата
…продумывать как разбивать этот текст для массива вывода на лист

Может, без этого?
Вопрос шире: загнать в массив, обработать-поменять-переделать-переставить. Со второй частью справлюсь, а вот как его туда заставить?

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#4

03.12.2013 19:21:26

Цитата
Может, без этого?
Вопрос шире: загнать в массив

Вот только как, в смысле — загнать? Такого «красивого» Range.Value, дающего массив, в Word ни для текста объекта Range, ни для ячеек таблиц. Можно, конечно, запросить у таблицы число строк/столбцов и циклом по ячейкам (ThisDocument.Tables(1).Cell(idRow, idCol).Range.Text) считать значения в массив, только сомневаюсь, что это будет будет быстрее, чем копировать/вставлять просто текст без форматирования.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Ясно. Я объектную модель Excel плохо знаю, а уж Word:)
Спасибо за разъяснения.

 

SkyPro

Пользователь

Сообщений: 309
Регистрация: 23.07.2013

#6

03.12.2013 20:13:53

Нашел здесь:

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 

SkyPro

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#7

03.12.2013 20:51:19

Что подтверждает: быстрее и проще копировать-вставить, а уже потом над данными издеваться.
И Вам спасиба припасена :)

1) Непонятно что означает «от home до end» ? Имеется в виду нажатие клавиш
в активном документе ? Вы уверены что правильно сформулировали вопрос и вас действительно интересуют строки внешнего представления документа (без связи
с данными). Поясню, что я имею в виду.
a) aaaaaaaaaaaaaaaaaaa;bbbbbbbbbbbbbbbb;ccccccccccccccccccccccn ddddddddd
b) aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;bbbbbbbbbbbbbbbbbbbbbbbbb;ccccccccccccccccccccc
ddddddddddddddddd

в варианте a) переход на новую строку осуществляется поле кода chr(13)
в варианте b) 2-я строка начинается без специального разделителя

2) Если » в тексте n строк, нужно выбрать от 1 до n», то это означает что выбирается весь текст что противоречит

Подскажите, пожалуйста, как выбрать конкретную строку (например, пятую),

Или мы должны догадаться
что обработка вам нужна для каждой строки?

3) Вы имеете в виду a(1) = первое слово , b(1) = второе слово, c(1) = третье слово ?

закинуть первое слово в один массив, второе слово в другой массив, третье слово в третий массив.

Или всё таки не в «другой массив» а в другой элемент массива ?
Резюмируя ещё раз : «нужно чётче формулировать вопрос»

Если предположить, что вам нужно обработать документ каждая строка которого
представляет собой параграф и содержит 3 слова разделённых «;» , то это будет выглядеть так:

Код: Выделить всё

Public Sub Example()
    Dim w As Range
    Dim a(1 To 3) As String
    Dim i As Long
    i = 1
    With ActiveDocument
        For i = 1 To .Words.Count Step 6
            a(1) = .Words(i)
            a(2) = .Words(i + 2)
            a(3) = .Words(i + 4)
            ' выводим очередные 3 слова как элементы массива a
            Debug.Print a(1), a(2), a(3)
        Next i
    End With
End Sub

Понравилась статья? Поделить с друзьями:
  • Структура интерфейса microsoft word
  • Строки в ms excel нумеруются буквами русского алфавита
  • Строчки текста в word
  • Структура интерфейс окна excel
  • Строки в excel обозначаются буквой латинского алфавита