Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA: MSWord инициализация большого массива / 14 сообщений из 14, страница 1 из 1
30.04.2013, 07:52
    #38244728
gametetris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
Всем привет.
Работаю с MSWord 2010 - есть большой статический массив типа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim arr_bic(3011)
arr_bic(0) = Array("WORD 1", "1012765", "10000765")
arr_bic(1) = Array("WORD 2", "4525870", "20000870")
arr_bic(2) = Array("WORD 3", "4525186", "80000186")
arr_bic(3) = Array("WORD 4", "9209778", "80000778")
....
arr_bic(3009) = Array("WORD 3010", "6643799", "70000799")
arr_bic(3010) = Array("WORD 3011", "9805719", "70000719")



Вопрос - в какое место во встроенном редакторе MVBA его нужно вставить чтобы, его инициализировать, чтобы этот массив воспринимала программа и в дальнейшем его можно былобы использовать для функций поиска итп.
Пробывал вставить в функцию - он пишет ошибку типа слишком большая функция, если в отдельный модуль - массив не виден, если вставить просто вверх или вниз - он пишет что там только комментарии ' ' должны быть..
...
Рейтинг: 0 / 0
30.04.2013, 08:07
    #38244733
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris, надо его определять в модуле с кляузой PUBLIC



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public arr_bic(3011) As Variant

Public Sub InitArray()
arr_bic(0) = Array("WORD 1", "1012765", "10000765")
arr_bic(1) = Array("WORD 2", "4525870", "20000870")
arr_bic(2) = Array("WORD 3", "4525186", "80000186")
arr_bic(3) = Array("WORD 4", "9209778", "80000778")

arr_bic(3009) = Array("WORD 3010", "6643799", "70000799")
arr_bic(3010) = Array("WORD 3011", "9805719", "70000719")

End Sub



Потом один раз вызвать InitArray и работать с ним

Есть еще кляуза CONST, но что-то так и не смог через нее массив инициализировать :( может кто подскажет
...
Рейтинг: 0 / 0
30.04.2013, 10:29
    #38244909
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
Оператором Const нельзя создать массив в VBA/VB6.
Для хранения информации в документе Word можно использовать коллекцию Variables - посмотрите, например, тут: http://www.cyberforum.ru/vba/thread713657.html#post3486684
...
Рейтинг: 0 / 0
01.05.2013, 03:55
    #38245923
gametetris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
Дело в том, что в массиве более 3-х тыс. массивов, в каждом из которых 3 элемента (как в первом посте). Повторяющихся нет, все уникальные.
При запуске выдает ошибку - процедура слишком длинная. Как обойти такое ограничение или как можно по другому организовать массив?

...
Рейтинг: 0 / 0
01.05.2013, 09:59
    #38245953
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetrisДело в том, что в массиве более 3-х тыс. массивов, в каждом из которых 3 элемента (как в первом посте).
...
Как обойти такое ограничение или как можно по другому организовать массив?

имхо, на таком объёме, "не стыдно", уже и методы БД использовать ... :)
т.е. хранить этот 2-х мерный массив во внешней табличке (хотите - в Аксовском mdb, а можно и просто в ТХТ-файле)

и, потом, когда нужно - открыть на этой таб.рекордсет ... если очень хочется именно массив - можно рекордсет, "по быстрому", выгрузить в массив - Recordset.GetRows
но, это врядли нужно будет - у рекордсета свои методы "навигации" / "поиска" есть, и получше чем по массиву ...
...
Рейтинг: 0 / 0
01.05.2013, 10:14
    #38245958
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris,

1. Где сейчас хранятся эти данные (текстовый файл, таблица в Excel, таблица в Word...)?

2. Как будет использоваться массив? Почему массив массивов, а не двумерный массив?

3. Первый элемент каждого массива ("WORD 1") можно не хранить, он определяется индексом элемента.

Если хотите конкретной помощи, приложите файл с частью исходных данных, приближенных к реальности .
...
Рейтинг: 0 / 0
01.05.2013, 13:16
    #38246037
gametetris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
qwerty112имхо, на таком объёме, "не стыдно", уже и методы БД использовать ... :)
т.е. хранить этот 2-х мерный массив во внешней табличке (хотите - в Аксовском mdb, а можно и просто в ТХТ-файле)

и, потом, когда нужно - открыть на этой таб.рекордсет ... если очень хочется именно массив - можно рекордсет, "по быстрому", выгрузить в массив - Recordset.GetRows
но, это врядли нужно будет - у рекордсета свои методы "навигации" / "поиска" есть, и получше чем по массиву ...

Методы БД мне знакомы, но условие такое, что нужно ограничиться только возможностями 'единого файла Word .docm' и встроенным редактором MVBA, без привлечения Access,Excel,файлов,sql итд. =(

Казанскийgametetris,
1. Где сейчас хранятся эти данные (текстовый файл, таблица в Excel, таблица в Word...)?
2. Как будет использоваться массив? Почему массив массивов, а не двумерный массив?
3. Первый элемент каждого массива ("WORD 1") можно не хранить, он определяется индексом элемента.
Если хотите конкретной помощи, приложите файл с частью исходных данных, приближенных к реальности .

1. Сейчас данные пока хранятся во втроенном редакторе Microsoft Word 2010 - 'Microsoft Visual Basic for Application' в модуле 'ThisDocument', но инициализировать массив для работы не получилось (см. пред. пост)
Желательно его нужно там оставить и не выносить за пределы этого редактора (в отдельные файлы,excel итд..)

2. Принцип работы с массивом такой - по arr_bic(i)(1) будут найдены 0-й и 2-й элементы массива соответственно, далее эти элементы попадают в сам вордовский файл в поля TextBox'ы.
Т.е. существуют 3 TextBox'a в документе Word - в первом TextBox'е набираешь 6-ти значное число - далее идет поиск по массиву arr_bic(i)(1), если найдено соответствие - второй и третий TextBox автоматически заполняются из arr_bic(i)(0) и arr_bic(i)(2).

3. Поскольку информация в массие конфиденциальная, выкладываю сгенерированный файл - http://rghost.ru/45679470
Принцип такой же - по arr_bic(i)(1) будут найдены 0-й и 2-й элемент массива соответственно.
...
Рейтинг: 0 / 0
01.05.2013, 13:49
    #38246058
basicv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris,

говорят что в ВБА процедуры немогут быть больше 64 кб - Procedure too large . Выход - раздели её на несколько подпроцедур.
...
Рейтинг: 0 / 0
01.05.2013, 16:46
    #38246145
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris,

а почему бы не хранить инфу в текстовике(или ворд документе) в формате

0,"EAW c4Ee1Mba i ADwC2a9QIcGeagI", "412804035", "70718310561146264909"
1,"dHsM4X6 TDvK3J wdMVmTVaguLAx tb", "991650450", "23858632499019357199"
2,"A95 2 d3eB5jfe cWfjaLaLphwdC e", "220401038", "87286543082884621244"
3,"vggmyolMMSCYvMh6xh9E1 1mrDFimiM", "553681325", "72181838497381736183"
4,"v257V P3o8ybG8qY42Z 8T3SxlHyA7", "510463958", "71305011508900973802"
5,"Z7yHm XOdd3 pgCgetnG2eNnCFEiLNK", "525773559", "16266789812937587623"
6,"PiLrTn9m1dxPws6rUvi8 9Uu pG p", "339476508", "18179830168856225258"
7,"Umg hrqMJC3x CUkB tM3d rEXZf C", "238443126", "51286010222049573163"
8,"v Nc 4k yk tLI9SYQ DkxUY9Re7 Km", "668545786", "44750839920805042102"

и макросик в десяток строк
...
Рейтинг: 0 / 0
01.05.2013, 18:45
    #38246174
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetrisнужно ограничиться только возможностями 'единого файла Word .docm' и встроенным редактором MVBA, без привлечения Access,Excel,файлов,sql итд.

Желательно его нужно там оставить и не выносить за пределы этого редактора (в отдельные файлы,excel итд..)

Поскольку информация в массиве конфиденциальнаяЕсли вы считаете, что XLSM обеспечит "конфиденциальность" - вы очень глубоко заблуждаетесь. Поэтому всё же проще вынести данные в отдельный файл (пусть даже это будет CSV, путь даже данные будут "зашифрованы") и при запуске - загружать данные в память. Или вообще устроить выборку по запросу, с кэшированием - средства SQL через ADO это вполне позволяют, причем быстродействие будет сравнимо с вашим "поиском в массиве".
...
Рейтинг: 0 / 0
01.05.2013, 22:50
    #38246277
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris2. Принцип работы с массивом такой - по arr_bic(i)(1) будут найдены 0-й и 2-й элементы массива соответственно, далее эти элементы попадают в сам вордовский файл в поля TextBox'ы.
Т.е. существуют 3 TextBox'a в документе Word - в первом TextBox'е набираешь 6-ти значное число - далее идет поиск по массиву arr_bic(i)(1), если найдено соответствие - второй и третий TextBox автоматически заполняются из arr_bic(i)(0) и arr_bic(i)(2).
То есть 2-й элемент является уникальным ключом записи?
Тогда коллекция Variables подходит идеально. В приложенном документе содержится коллекция, сформированная из данных примера: ключом служит 2-й элемент, а 1-й и 3-й соединены в строку через символ Tab.
При открытии документа ключи коллекции кладутся в комбобокс.
При выборе значения в комбобоксе извлекается соотв. элемент коллекции и заполняются текстбоксы.
...
Рейтинг: 0 / 0
03.05.2013, 00:16
    #38246905
gametetris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
КазанскийВ приложенном документе содержится коллекция, сформированная из данных
омг, об этой возможности ворда я даже не знал, это как туда надо зайти, чтобы добавлять/редактировать/удалять ключи??
Пробывал Вставка->Экспресс-блоки->Поле->Автоматизация->DocVariable а дальше как? Желательно сделать пару скринов :o
...
Рейтинг: 0 / 0
03.05.2013, 07:09
    #38246971
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
gametetris, добавлять кодом, зачем вручную, рука устанет
...
Рейтинг: 0 / 0
03.05.2013, 18:21
    #38247313
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA: MSWord инициализация большого массива
Пример создания, обращения к элементу по ключу и по номеру, удаления элемента коллекции Variables. Копия из окна Immediate.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
?activedocument.Variables.Count 
 0 
activedocument.Variables("aaa")="zzz"
?activedocument.Variables.Count
 1 
?activedocument.Variables("aaa")
zzz
?activedocument.Variables(1)
zzz
activedocument.Variables(1).Delete 
?activedocument.Variables.Count
 0
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA: MSWord инициализация большого массива / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]