Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для sjerj
48 / 9 / 0
Регистрация: 29.11.2010
Сообщений: 149

Можно ли оптимизировать код внесения данных с листа Word в таблицу

13.03.2012, 18:35. Показов 1769. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть текст в ВОРДЕ вида
"E4 E B3 ECB1 F1 F2 F0 E0 F5 B3 FE 1EF8 EA EE EB E7 20 EE EC E2 B3 E4 EE EB EB FE B8 2C 20 F9 EE 1F 30 34 2C 30 33 2E 32 2F 31 31 1E F0 2E 20 F3 1F F8 E9 EC EB B3 20 EF EF E5 E3 EF F2 E0 E2 ED E7 EA ED EA 20 C4 E5 F0 E5 E0 E1 EB EE BF 20 E2 E7" и так много много строк и листов

для работы, нужно его по группам внести в таблицу char(j) - (о ней далее по тексту кода)т.е.
первый элемент таблицы - Е4
второй Е
третий В3 и т.д.

написал код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim Kod As String
Dim i As Long
Dim j As Long
Dim imm As Range
Dim chaR() As String
 
ReDim chaR(1)
j = 1
Set imm = ActiveDocument.Range(i, ActiveDocument.Content.End - 1)
Kod = imm
Do While i <= ActiveDocument.Content.End - 1
chaR(j) = Mid(Kod, i, InStr(i, Kod, " ", vbTextCompare))
j = j + 1
ReDim Preserve chaR(j)
i = InStr(i, Kod, " ", vbTextCompare) + 1
Loop
Но так долго и тормознуто работает, что жуть! Может есть какое то более изящное (И главное быстродейственное) решение?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2012, 18:35
Ответы с готовыми решениями:

Можно ли оптимизировать код VBA Word
Есть код Dim i As Long Const he As String = &quot;0123456789ABCDEF&quot; Dim imm As Range Dim ChaR() As String DoEvents ...

Как задать SQL запрос, для внесения данных в таблицу?
Выводить умею. Проблема ввести данные. При нажатии данные берутся из StringGrid1.Cells, а заносятся в базу данных. SQL.Clear; ...

Как таблицу привязать к концу листа WORD?
Ребят, мож конечно вопрос не по ВБА, а по ворду. Но я не знаю как его решить. Очень хотелось бы услышать его решение в ВБА врианте. ...

11
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
13.03.2012, 19:02
Visual Basic
1
2
3
4
5
6
   Dim Kod As String
    Dim imm As Range
     
    Set imm = ActiveDocument.Range(0, ActiveDocument.Content.End - 1)
    Kod = imm
    m_s = Split(Kod, " ")
Добавлено через 2 минуты
Я вместо ChaR - m_s
1
 Аватар для sjerj
48 / 9 / 0
Регистрация: 29.11.2010
Сообщений: 149
13.03.2012, 20:06  [ТС]
Неподходит - split просто уберет пробелы, ChaR это название таблицы, которая будет дальше использоваться в расчетах. Нужно таблицу забить данными - т.е. словами, которые разделены пробелами.

Т.е.
ChaR(1)=E4
Char(2)=E
ChaR(3)=B3
.....
саму таблицу никуда выдавать не нужно - это промежуточный этап.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.03.2012, 20:52
Будет быстрее, если подумать и вывести изменение размерности массива вне цикла.
Например, задать вначале ему максимально вероятное значение, а после цикла сократить до j
1
 Аватар для sjerj
48 / 9 / 0
Регистрация: 29.11.2010
Сообщений: 149
13.03.2012, 21:05  [ТС]
Ну максимальное вероятное значение это как минимум activedocument.content.end делить на три (т.к. более двухбуквенных элементов не ожидается), но потом придется перебрать весь массив и переформатировать его выбросив все пустые элементы (т.е. сделав redim preserve наткнувшись на первый же пустой -1) не ужели так будет быстрее?

П.С. В коде есть ошибки, которые не влияют на принцип перебора, просто сама идея интересна, особенно для многостраничных документов.

П.П.С. И учитывая, что в школе мы mainframe-мами не обладаем
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
13.03.2012, 21:12
Split(kod," ") создает массив из элементов строки разделенных пробелом. Заноси массив в таблицу или обрабатывай, например: перевести в двоичный код, потом в символ и т.д.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.03.2012, 21:21
Цитата Сообщение от sjerj Посмотреть сообщение
но потом придется перебрать весь массив...
я как-то особо не вникал, даже код Ворда не знаю. Просто увидел - если так сделать, функциональность не нарушится.
Просто попробуйте. Имел в виду такое:

Visual Basic
1
2
3
4
5
6
7
8
'...
ReDim Preserve chaR(ActiveDocument.Content.End\3) '(по Вашим словам)
Do While i <= ActiveDocument.Content.End - 1
chaR(j) = Mid(Kod, i, InStr(i, Kod, " ", vbTextCompare))
j = j + 1
i = InStr(i, Kod, " ", vbTextCompare) + 1
Loop
ReDim Preserve chaR(j)
Но могу ошибаться. И да, 2 раза делать редим быстрее, чем в цикле каждый раз +1.

Не по теме:

У меня та же проблема. Ща буду свою программу также резать :yahoo:

1
 Аватар для sjerj
48 / 9 / 0
Регистрация: 29.11.2010
Сообщений: 149
13.03.2012, 23:22  [ТС]
Цитата Сообщение от toiai Посмотреть сообщение
Split(kod," ") создает массив из элементов строки разделенных пробелом. Заноси массив в таблицу или обрабатывай, например: перевести в двоичный код, потом в символ и т.д.
Простите, а для SPLIT в переменных нужно об]явить динамический массив (т.е. в моем случае dim Char() as string)?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
13.03.2012, 23:33
Цитата Сообщение от sjerj Посмотреть сообщение
Простите, а для SPLIT в переменных нужно об]явить динамический массив (т.е. в моем случае dim Char() as string)?
Да.
Пробел является разделителем по умолчанию, так что Split(kod," ") это то же, что Split(kod)
0
 Аватар для ironegg
1905 / 782 / 31
Регистрация: 11.02.2010
Сообщений: 1,567
14.03.2012, 06:46
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от sjerj Посмотреть сообщение
саму таблицу никуда выдавать не нужно - это промежуточный этап
а коллекция вместо таблицы подойдет?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub a()
Dim myRegExp As Object ' ñîçäà¸ì ýêçåìïëÿð RegExp'a
Dim colMatches As Object ' êîëëåêöèÿ ýòèõ îáðàçöîâ
Dim aMatch As Object ' îäèí èç ñîâïàâøèõ îáðàçöîâ
Dim testString As String ' òåñòèðóåìàÿ ñòðîêà
 
    Set myRegExp = CreateObject("vbscript.regexp") ' ñîçäà¸ì ýêçåìïëÿð RegExp'a
        myRegExp.Global = True ' áóäåì ïðîõîäèòü âñþ ñòðîêó
        myRegExp.Pattern = "\S+" ' ìàñêà ïîèñêà
    testString = "1EF8 EA EE"  ' òåêñò äëÿ òåñòà
    Set colMatches = myRegExp.Execute(testString) ' çàïóñêàåì!
    
    For Each aMatch In colMatches ' ïðîõîäèì ïî âñåé êîëëåêöèè
         Debug.Print aMatch.Value
    Next aMatch
End Sub
1
 Аватар для sjerj
48 / 9 / 0
Регистрация: 29.11.2010
Сообщений: 149
14.03.2012, 11:49  [ТС]
Для меня коллекции полная заумь . Тем более, как мне кажется вариант со SPLIT будет наиболее быстрым.
0
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
15.05.2012, 15:15
sjerj,
если массив предполагается делать с помощью Split, то нужно создать переменную, которая затем сама превратится в массив. Эта переменная должна иметь тип данных Variant:
Visual Basic
1
Dim m_s as Variant
Недостаток использования для массива типа данных Variant проявляется только если массив состоит из очень большого количества элементов - может быть миллион. Т.к. в этом случае будет занято очень много место на пластинках оперативной памяти и вообще может даже места не хватить.

Не помню, где я прочитал или где это видел, но вместо типа данных Variant можно использовать тип данных String:
Visual Basic
1
Dim m_s() as String
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2012, 15:15
Помогаю со студенческими работами здесь

Можно ли оптимизировать текст в Word для чтения на смартфоне
Здравствуйте. Можно ли оптимизировать текст в Word для чтения на смартфоне (размер текста, отступ от границ и т.д), перед экспортом в PDF?...

Можно ли оптимизировать код?
День добрый! Задача: есть полубайтовые значения - машина выдает данные от 1 до 15. Хранятся и передаются они в упакованном виде, по два...

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

Где можно выбрать ориентацию листа в word 2007
Здравствуйте. Если открыть параметры страницы Excel в 2007 , то можно видеть на вкладке , где выбор ориентация альбомная или нет...

Можно ли оптимизировать данный код?
Есть задача: Прочитать шифр: Решил вот так: k = 0 aList = for s in &quot;g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru