С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/65: Рейтинг темы: голосов - 65, средняя оценка - 4.52
0 / 0 / 1
Регистрация: 29.07.2012
Сообщений: 16

Массив массивов в VBA или что-то похожее (см. сообщении)

29.07.2012, 22:49. Показов 13504. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, умные люди. Есть такая задача: на листах Excel различного рода таблички разного размера и конфигурации. Надо перенести данные из одного файла в другой. Всё просто, проблема лишь в том, что таблицы имеют разную конфигурацию (всякие там сдвоенные ячейки и пр.). Суть такова, что я работаю с массивами, если вид таблицы скажем так, однороден на всем протяжении, проблем вообще нет, но с нестандартными таблицами я работаю в отдельной процедуре... В эту процедуру мне надо передать массив данных в качестве параметра, но в зависимости от имени листа я должен передавать разные массивы, и я не могу сообразить, как это сделать. В справке по VB нашёл описание массива массивов, где каждый элемент в свою очередь является массивом, мне бы это подошло, но почему-то при объявлении такого массива в VBA Excel ругается. Может есть другой способ перебрать массивы и подставить их в процедуру?

Немного кода, чтобы было понятнее, о чём я прошу:

Изначально всё происходит так: перебираю в цикле список имён листов и проверяю на "стандартность", если лист нестандартный, запускаю процедуру ExclusiveFilling.

Visual Basic
1
2
3
4
5
For sht_i = 0 To 15
        ThisWorkbook.Sheets(shtArray(sht_i)).Select
            If (shtArray(sht_i) = "Имя листа ") Or (shtArray(sht_i) = "Имя листа ") ... Or (shtArray(sht_i) = "Имя листа " Then
                ExclusiveFilling (shtArray(sht_i))
...

Сейчас я передаю только имя листа, уже в процедуре по нему идёт Select и действия. В итоге я должен получить заполненный массив данных, но при выходе из подпрограммы его значение теряется. Вот я и хотел из массива массивов выбрать массив (i) и передать в процедуру скажем по ссылке, что-то вроде такого
ExclusiveFilling (<имя листа>, <массив массивов(массив (i)>)
Как же мне создать массив массивов на VBA или посоветуйте другой способ добиться желаемого... Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2012, 22:49
Ответы с готовыми решениями:

PWS не может зарегистрить что-то вроде 'msdasql.dll' или что-то похожее.
Ну вот. Сяду, думаю, вечерком и форум себе сделаю. А не тут-то было. Что-то случилось вроде с моим PWS, потому что раньше подобные вещи...

Код БД или что-то похожее
Есть разработанная в Access БД, в отчёте нужно выкладывать код. Где мне взять этот код БД?

класс или что-то похожее
У меня при нажатии на кнопку происходит такое действие: private void button2_Click(object sender, EventArgs e) { ...

8
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
29.07.2012, 23:00
<массив массивов(массив (i)> в принципе то же самое, что передать массив (i)!
Не вижу смысла загонять сначала массив в массив. Ради того, чтобы обратиться по индексу?.
Может проще передавать имя диапазона?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
29.07.2012, 23:32
Сделайте поиск по "массив массивов" в этом форуме. 4 темы однако, включая эту!
Например, тема, где есть мои 5 копеек: Cоздать несколько массивов в цикле
0
0 / 0 / 1
Регистрация: 29.07.2012
Сообщений: 16
30.07.2012, 07:07  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
<массив массивов(массив (i)> в принципе то же самое, что передать массив (i)!
Не вижу смысла загонять сначала массив в массив. Ради того, чтобы обратиться по индексу?.
Может проще передавать имя диапазона?
Суть именно в этом, в цикле надо передать массив(i) в процедуру и вернуть его уже заполненным. Массивов много и для каждого писать код для вызова процедуры, сами понимаете, не очень приятно.

Добавлено через 54 секунды
Цитата Сообщение от Казанский Посмотреть сообщение
Сделайте поиск по "массив массивов" в этом форуме. 4 темы однако, включая эту!
Например, тема, где есть мои 5 копеек: Cоздать несколько массивов в цикле


Поиском пользовался, не нашёл 4 темы, только про котрую вы говорите, но это не совсем то, что мне нужно, хотя может я ошибаюсь, надо будет перечитать. Массив массивов даже не самоцель, повторюсь, мне надо передать массив в процедуру и там его заполнить и вернуть заполненный в вызывающую процедуру, но их много вот я и подумал, что в цикле будет удобнее оперировать именно массивом массивов
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
30.07.2012, 08:07
Сейчас я передаю только имя листа
Ничто не мешает передавать несколько аргументов
но при выходе из подпрограммы его значение теряется
Глобальные не теряются, аргумент Byref не теряется. В конце концов можно использовать не Sub, а Function
0
0 / 0 / 1
Регистрация: 29.07.2012
Сообщений: 16
30.07.2012, 10:05  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
Ничто не мешает передавать несколько аргументов

Глобальные не теряются, аргумент Byref не теряется. В конце концов можно использовать не Sub, а Function
Тоже подумал о глобальных переменных, это, я так понимаю, которые идут после слова Public? Эффект тот же, после выполнения подпрограммы массив остаётся пустым, хотя внутри самой подпрограммы он заполняется, но тут может я что-то не так делаю, ещё нуб в vba, над этим подумаю, но пока результат такой же... Использование Sub или Function роли не играют, но с функцией мне по коду не удобно работать. Насчёт ByRef... Представте код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
.....
Цикл
If <условие> then
ExclusiveFilling (shtArray(sht_i),<имя массива>)
 
.....
Конец цикла
 
.....
 
Sub ExclusiveFilling(ByVal shtName As String, ByRef <имя массива>)
....
End Sub
В вызове процедуры ExclusiveFilling вместо имени массива должно подставляться имя массива, ихсодя из какого-то условия, поэтому конкретное имя я прописать не могу. Вот мне и нужен был список массивов, чтобы просто в цикле подставлять в ExclusiveFilling
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
30.07.2012, 10:18
после выполнения подпрограммы массив остаётся пустым
Такое будет если переменная объявлена не в одном месте: В процедуре не должно быть объявления

Добавлено через 3 минуты
Я к тому, что вы вначале перебираете в цикле все листы. Хотите загнать в массив массивов, а потом опять в цикле вызывать процедуру. Не могу понять почему вместо загнания массива в массив массивов нельзя сразу вызвать процедуру?
0
0 / 0 / 1
Регистрация: 29.07.2012
Сообщений: 16
30.07.2012, 18:58  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
Я к тому, что вы вначале перебираете в цикле все листы. Хотите загнать в массив массивов, а потом опять в цикле вызывать процедуру. Не могу понять почему вместо загнания массива в массив массивов нельзя сразу вызвать процедуру?
Нет, нет, я не имена листов в массив загоняю, массивы у меня идут отдельно, они описаны в начале основной процедуры. И в них (в массивы) я заношу данные с листов, под каждый лист свой массив. Вот я и хотел, чтобы на конкретный лист в подпрограмму подставился "свой" массив.


В принципе, окинув свой код критическим взглядом, пришёл к выводу, что смысла в отдельной процедуре нет, поэтому задачу решил Select Case'ом, кода больше, но работает зато... Просто стало интересно, можно был ли сделать так, как я хотел... И ещё, всё-таки, конкретно в VBA есть такое понятие, как массив массивов или это фича только в полноценном Visual Basic?
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
30.07.2012, 20:30
Всё работает и в VBA.
Набросал примитивній пример. Из-за ленности загрузку в массив сделал по именам(кстати пример организации циклов по именам. Тоже бівает полезно)
Вложения
Тип файла: rar Масив массивов.rar (7.6 Кб, 213 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2012, 20:30
Помогаю со студенческими работами здесь

Прерывание по клоку или что то похожее..
Доброе суток уважаемы форумчане,прошу помощи, зашёл в тупик... :) Столкнулся с такой проблемой, есть датчик и есть устройство мастер....

Regex или что нибудь похожее
Ребята, устал бороться, кукушка едет. Кто знает Regex или что нибудь подобное, помогите. Кто сможет уменьшить числа на одну единицу...

EWB или что-то похожее на mac os
Существуют ли вообще на mac os программы типа electronic workbench, multisim или что-то с похожим функционалом?

Откололся транзистор(или что-то похожее) на карте
Решил почистить и разобрать свою radeon hd 5970 , отверткой отколол толи резистор,толи чип,короче не знаю что это. При включении компа...

Нужна документация или что - то похожее по OpenCV
Искал на зарубежных ресурсах, но находил одну и ту же статью с конченой документацией + нерабочими примерами. Долго сидел вчитывался, а ни...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru