Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
1

Типизированный массив

02.06.2017, 11:54. Просмотров 897. Ответов 12

Добрый день! Помогите пожалуйста разобраться и составить правильный массив.
Есть сводная таблица:
Название: 14265844m.png
Просмотров: 20

Размер: 12.3 Кб

Я хочу структурировать и записать ее данные в массив. Выбрал для этого двумерный массив своего типа.
Чтобы он записывал данные как (1.1) -Квартал/Выдел.
Т.е для первой записи сводной таблицы массив будет выглядеть так:
266 -21 -Ключ массива (1.1)
266 -31 -Ключ массива (1.2)
266 - 38 -Ключ массива (1.3)

Тип объявляю так:
Visual Basic
1
2
3
4
5
Option Base 1
Private Type Mass_Of_Kv_Vy
    Kv As Variant ' -Поле квартал
    Vy As Variant ' - Поле выдел
End Type
Алгоритм следующий: через метод CurrentRegion я считываю данные из сводной таблицы в двумерный массив, затем проверяю, если колонка "квартал" заполняю первое поле "Kv" и если колонка "выдел" то заполняю второе поле "Vy".
Для первой записи сводной массив заполняется правильно, но когда обрабатываться другая запись выходит ошибка "subscript out of range", когда я меняю размерность массива.
Visual Basic
1
2
ikv = 1 ' - счетчики массива, когда нужно увеличить размерность (когда новый "квартал" или "выдел")
ivy = 1
Вот код:
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
Set pt = Worksheets(shName).PivotTables(1) '- обращаемся к сводной таблице
    Set pf = pt.PivotFields(1)
        With pf
             For Each pi In pf.PivotItems    '- Элемент сводной таблицы
                 DataRange = pi.LabelRange.Address
                 Worksheets(shName).Activate
                 Set CurrRange = Range(DataRange).CurrentRegion '- диапазон в котором данные для записи в массив
                 For Each MyRange In CurrRange
                     For Each RngFarray In MyRange
                         If MyRange.Column = 6 Then '- Обработка колонки "квартал"
                            If RngFarray.Value <> vbNullString Then
                               ReDim Preserve ResultArray(ikv, ivy)
                               ResultArray(ikv, ivy).Kv = RngFarray.Value
                            End If
                         ElseIf MyRange.Column = 7 Then '- Обработка колонки "выдел"
                                If RngFarray.Value <> vbNullString Then
                                   ReDim Preserve ResultArray(ikv, ivy)
                                   ResultArray(ikv, ivy).Vy = RngFarray.Value
                                   ivy = ivy + 1
                                End If
                        End If
                     Next RngFarray
                Next MyRange
                ikv = ikv + 1
                Next pi
Ругается на эту строчку, когда пытаюсь увеличить размерность массива до (2,4)
Visual Basic
1
 ReDim Preserve ResultArray(ikv, ivy)
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2017, 11:54
Ответы с готовыми решениями:

Сформировать типизированный файл из целых чисел, ввести в файл массив, прочитать массив, упорядочить массив по убыванию
Сформировать типизированный файл из целых чисел, ввести в файл массив, прочитать массив,...

Массив и типизированный файл.
Здравствуйте. Помогите пожалуйста с решением проблемы. Задача рабочая. Недавно проверял всё...

Записать массив структур в типизированный файл
В общем нужно записать массив структур в типизированный файл, ну и потом соответсвенно достать тот...

Записать в типизированный файл двумерный массив
Добрый день. Каким способом можно записать в типизированный файл двумерный массив?

Как сохранить типизированный массив в файл
Имеется тип type Mass=Record Enabled:Boolean; //существует mass:Integer; //масса ...

12
Alex77755
10981 / 3439 / 591
Регистрация: 13.02.2009
Сообщений: 10,218
02.06.2017, 11:59 2
Изменять можно только последнюю размерность двухмерного массива
1
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
02.06.2017, 12:24  [ТС] 3
И как тогда быть?

Добавлено через 17 минут
Посмотрел в нете, предлагают сделать массив из массива...буду пробовать
0
_shark
173 / 173 / 29
Регистрация: 11.10.2016
Сообщений: 559
02.06.2017, 14:04 4
как вариант, можно двумерный массив ResultArray(ikv, ivy) разбить на два массива arResultIKV() и arResultIVY() и переопределить их по-отдельности
1
02.06.2017, 14:04
Hugo121
6447 / 2507 / 448
Регистрация: 19.10.2012
Сообщений: 7,509
02.06.2017, 14:21 5
Подозреваю что задачу можно/нужно делать вообще иначе, например на словаре, что точно будет быстрее. Но это только подозрения...
1
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
05.06.2017, 07:10  [ТС] 6
Цитата Сообщение от Hugo121 Посмотреть сообщение
например на словаре
подскажите это как? И чем этот способ лучше массива?
0
SoftIce
es geht mir gut
11189 / 4609 / 1161
Регистрация: 27.07.2011
Сообщений: 11,310
Завершенные тесты: 1
05.06.2017, 08:03 7
Лучший ответ Сообщение было отмечено RomSam как решение

Решение

Такой вариант
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Option Base 1
 
Private Type Mass_Of_Kv_Vy
    Kv As Variant ' -Поле квартал
    Vy() As Variant ' - Поле выдел    '    !!!!!   
End Type
    
  ''''''''
  ''''''''
  ''''''''
 
Dim ResultArray() As Mass_Of_Kv_Vy
  
  ''''''''
  ''''''''
  ''''''''
 
Set pt = Worksheets(shName).PivotTables(1) '- обращаемся к сводной таблице
    Set pf = pt.PivotFields(1)
        With pf
             For Each pi In pf.PivotItems    '- Элемент сводной таблицы
                 DataRange = pi.LabelRange.Address
                 Worksheets(shName).Activate
                 Set CurrRange = Range(DataRange).CurrentRegion '- диапазон в котором данные для записи в массив
                 For Each MyRange In CurrRange
                     For Each RngFarray In MyRange
                         If MyRange.Column = 6 Then '- Обработка колонки "квартал"
                            If RngFarray.Value <> vbNullString Then
                                ReDim Preserve ResultArray(ikv)                     '    !!!!!   
                                ResultArray(ikv).Kv = RngFarray.Value             '    !!!!!   
                            End If             
                         ElseIf MyRange.Column = 7 Then '- Обработка колонки "выдел"
                                If RngFarray.Value <> vbNullString Then
                                   ReDim Preserve ResultArray(ikv).Vy(ivy)       '    !!!!!   
                                   ResultArray(ikv).Vy(ivy) = RngFarray.Value   '    !!!!!   
                                   ivy = ivy + 1
                                End If
                        End If
                     Next RngFarray
                Next MyRange
                ikv = ikv + 1
                ivy=1 '                             '    !!!!!   
                Next pi
1
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
05.06.2017, 08:22  [ТС] 8
Цитата Сообщение от SoftIce Посмотреть сообщение
Такой вариант
Т что надо) спасибо
0
Hugo121
6447 / 2507 / 448
Регистрация: 19.10.2012
Сообщений: 7,509
05.06.2017, 08:39 9
Цитата Сообщение от RomSam Посмотреть сообщение
подскажите это как?
да любой пример на scripting.dictionary берите - увидите как. Для задачи того примера.
Цитата Сообщение от RomSam Посмотреть сообщение
И чем этот способ лучше массива?
да в общем тот же массив и есть, но "индексированный".
Т.к. итоговая задача мне так и не ясна - это в общем всё. Тем более что уже есть "Т что надо)"
1
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
05.06.2017, 08:45  [ТС] 10
Цитата Сообщение от Hugo121 Посмотреть сообщение
итоговая задача мне так и не ясна
задача не очень сложная забрать данные из сводной и вставить их в специальное место в шаблоне. Основная сложность с массивом была. Пишу для себя так сказать чтобы прокачать "скилл".
0
Hugo121
6447 / 2507 / 448
Регистрация: 19.10.2012
Сообщений: 7,509
05.06.2017, 08:49 11
Ну так чтоб прокачать - есть прямой смысл качать словарь
В данном случае думаю с коллекцией.
Но задачу так и не прояснили - зачем городить такой код с массивами, чтоб просто взять данные из сводной и вставить их в специальное место в шаблоне?
0
RomSam
3 / 3 / 3
Регистрация: 11.06.2013
Сообщений: 38
05.06.2017, 09:11  [ТС] 12
Цитата Сообщение от Hugo121 Посмотреть сообщение
Но задачу так и не прояснили - зачем городить такой код с массивами, чтоб просто взять данные из сводной и вставить их в специальное место в шаблоне?
Все из за структуры шаблона. Он выглядит так (исходя из примера):
http://savepic.ru/14279540m.png
То есть по строчкам идет разбиение. (Записывается Квартал, а ниже в поле "Выдел" записываются в строчку все выдела этого квартала)
Вот сама исходная таблица с данными:
http://savepic.ru/14264180m.png
Поэтому я решил прогнать данные через сводную, а из сводной уже записать массив и затем вставить в шаблон в нужном порядке.

Согласен...возможно есть решение проще...мне в голову пришла только такая реализация...
0
Hugo121
6447 / 2507 / 448
Регистрация: 19.10.2012
Сообщений: 7,509
05.06.2017, 09:18 13
Картинки не вижу (админы не пускают), но чую что можно через словарь всё брать сразу из исходных данных.
0
05.06.2017, 09:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2017, 09:18

Перезапись из текстового файла в массив и в типизированный файл
Необходимо переписать числовые данные из текстового файла в: 1. одномерный массив, 2. ...

Аналоговые часы. Стрелки, используя типизированный массив
Народ вот сделал часы Program fdgfaf; uses graph, crt, SysUtils; var c : char; T :...

Записать в типизированный файл массив содержащий в себе динамические списки
Доброго времени суток, написал программу, что то типа словаря. Хотелось бы реализовать возможность...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.