powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как Добавить строки в двумерный массив
13 сообщений из 13, страница 1 из 1
Как Добавить строки в двумерный массив
    #36339938
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятное дело, ReDim Preserve не помогает.....
как быть?
ну например масив a_Arr(x,y)
-----------------
на ум приходит вариант: создавать х-количество одномерных массивов а потом их объединить
Понятно, что очень муторно при y>10
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36339949
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_andПонятное дело, ReDim Preserve не помогает.....
как быть?
ну например масив a_Arr(x,y)
-----------------
на ум приходит вариант: создавать х-количество одномерных массивов а потом их объединить
Понятно, что очень муторно при y>10Не совсем понимаю, почему не помогает.
Например можно и трехмерный массив увеличивать:
Код: plaintext
1.
ReDim X( 10 ,  10 ,  10 )
ReDim Preserve X( 10 ,  10 ,  15 )
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36340018
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ReDim Preserve может увеличить только крайний "член" массива, а надо

a_aray=(1to10,1to10)
ReDim Preserve a_aray(15,10) 'выдаст ошибку
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36340022
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Djon Player,
извиняюсь.
-------------
надо чтоб
Код: plaintext
1.
2.
ReDim X( 10 ,  10 ,  10 )
ReDim Preserve X( 15 ,  10 ,  10 ) 'выдаст ошибку 
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36340275
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_andReDim Preserve может увеличить только крайний "член" массива, а надо

a_aray=(1to10,1to10)
ReDim Preserve a_aray(15,10) 'выдаст ошибкуПроверил, действительно выдаёт ошибку.
Тогда может проще немного переделать код, чтобы изменению подвергался лишь крайний член массива. Это лучше, чем создание множества одномерных массивов.
Хотя если у вас задача подразумевает изменение обоих границ массива, то этот способ не прокатит.
Если бы точно знать, что одна из границ не превысит определенного максимума, то для этой границы установить максимум. Хотя конечно плохо, что зря будет использоваться память, но если этот максимум не очень большой, то не смертельно.
Возможно можно вообще обойтись без двумерного массива, вдруг задачу можно решить по другому.
Так-же вместо двумерного массива можно использовать одномерный массив, размерностью равно произведению размерностей двумерного массива.
Например если у вас есть двумерный массив
Код: plaintext
a( 1  to imax,  1  to jmax)
можно заменить его на одномерный массив
Код: plaintext
b( 1  to imax*jmax)
Тогда можно использовать к примеру такое соответствие
Код: plaintext
a(i,j)=b(jmax*(i- 1 )+j)
Правда если изменения границ происходят по несколько раз в процессе выполнения кода, то придётся поизвращаться для того, чтобы сохранить предыдущие данные.
Чтобы как-то уменьшить извращения можно написать функцию устанавливающую соответствие между одномерным и двухмерным массивом по принципу a(i,j)=b(jmax*(i-1)+j)
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36341855
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Djon Player,
Вот такой написал код, вроде работает, но громоздка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Function MRedim(a_inp(), i_c, i_r)
'a_inp - исх. двухмерный массив
'i_c на сколько увеличиваем кол-во строк
'i_r на сколько увеличиваем кол-во столбцов
Dim a_temp()
i_c_max = UBound(a_inp,  1 )
i_r_max = UBound(a_inp,  2 )
ReDim a_temp( 1  To i_c_max + i_c,  1  To i_r_max + i_r)
For i_i =  1  To i_c_max
   For i_j =  1  To i_r_max
   a_temp(i_i, i_j) = a_inp(i_i, i_j)
   Next i_j
Next i_i
MRedim = a_temp
End Function

процедура для теста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub ar()
Dim a(), b()
ReDim a( 1  To  10 ,  1  To  10 )
MsgBox UBound(a,  1 ) & vbCrLf & UBound(a,  2 )
i_c =  5  ' на сколько увеличиваем кол-во строк
i_r =  15  ' на сколько увеличиваем кол-во столбцов
ReDim b( 1  To UBound(MRedim(a, i_c, i_r),  1 ),  1  To UBound(MRedim(a, i_c, i_r),  2 ))
MsgBox UBound(b,  1 ) & vbCrLf & UBound(b,  2 )
End Sub
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36342036
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воспользовавшись идеей Djon Player был создан след код для добавления в "псевдо" двухмерный динамический массив Public любое кол-во строк или столбцов

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

Код: plaintext
1.
2.
Function t_a(j_max, i, j)
t_a = j_max * (i -  1 ) + j
End Function

эта функция увеличивает "псевдо" массив на to_i строк и to_j столбцов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function redimM(a(), j_max, to_i, to_j)
Dim b()
ua = UBound(a)
ReDim b( 1  To ua / j_max,  1  To j_max)
For i =  1  To ua / j_max
   For j =  1  To j_max
     b(i, j) = a(t_a(j_max, i, j))
   Next j
Next i
ReDim Preserve a( 1  To (ua / j_max + to_i) * (j_max + to_j))
For i =  1  To ua / j_max
   For j =  1  To j_max
     a(t_a(j_max + to_j, i, j)) = b(i, j)
   Next j
Next i
redimM = a
End Function

для тестирования приведены две процедуры:
Код: plaintext
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.
Public a_ind() As Variant, a_j_max As Long
'----------------------------
Sub temp_3()
Dim a()
a_j_max =  500 
j_a = a_j_max
i_a =  500 

ReDim a_ind( 1  To i_a * j_a) ' объявляем массив

For i =  1  To i_a
   For j =  1  To j_a
   num = Int((Rnd *  1000 ) +  1 )
   a_ind(t_a(j_a, i, j)) = num
   Next j
Next i
ii =  15  'Int((Rnd * i_a) + 1)
jj =  20  'Int((Rnd * j_a) + 1)

MsgBox a_ind(t_a(j_a, ii, jj)) & vbCrLf & "Элементов массива: " UBound(a_ind)

a_ind = redimM(a_ind, a_j_max,  100 ,  100 ) ' переобъявляем массив
a_j_max = a_j_max +  100 
End Sub
'----------------------------
Sub temp_4()
Call temp_3
MsgBox a_ind(t_a(a_j_max,  15 ,  20 )) & vbCrLf & "Элементов массива: " UBound(a_ind)
End Sub
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36342498
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_and,

Посмотрел первый вариант реализации redimM(), понравился код, достаточно простой, я думал, что там всё намного сложнее.

А вот в процедуре ar() мне кажется есть небольшая ошибка, а точнее один и тот-же код срабатывает дважды, хотя необходимости в этом нет, а именно тут
Код: plaintext
ReDim b( 1  To UBound(MRedim(a, i_c, i_r),  1 ),  1  To UBound(MRedim(a, i_c, i_r),  2 ))

Получается, что дважды идёт изменение размерности массива a(), как мне кажется правильнее было бы примерно так
Код: plaintext
1.
2.
a=MRedim(a, i_c, i_r)
ReDim b( 1  To UBound(a,  1 ),  1  To UBound(a,  2 ))
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36342520
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_and,

Во второй реализации MRedim на первый взгляд код более сложный и скорее всего работает дольше чем первый, так как там два двойных вложенных цикла, а в первом коде лишь один двойной цикл. Более точно можно измерить счётчиком времени.
Плюс во втором коде используются операции деления, их лучше поменьше использовать, они замедляют код.
Если бы я воспользовался реализацией MRedim, то я бы взял первый вариант кода, он к тому-же и более понятный и более короткий.
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36343849
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Djon Player,
1. по поводу
Код: plaintext
1.
2.
a=MRedim(a, i_c, i_r)
ReDim b( 1  To UBound(a,  1 ),  1  To UBound(a,  2 ))
к сожалению это работать не будет, т.к. при всей простоте функция Mredim создает новый массив, а не переопределяет старый, и VBA будет ругаться на превышение диапазона a()
Еще один минус 1-го способа: для изменения размерности массива, надо каждый раз создавать новый массив

2. Изначально мной была поставлена задача изменения диапазона двухмерного массива PUBLIC , без создания другого масива(, а переопределение сущ. массива), что на мой взгляд возможно только при пользовании 2 - го, более сложного кода, использовав функций t_a и redimM

P.S. Заметил, что во втором коде лишнее
Код: plaintext
DIM a()
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36343897
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_andDjon Player,
1. по поводу
Код: plaintext
1.
2.
a=MRedim(a, i_c, i_r)
ReDim b( 1  To UBound(a,  1 ),  1  To UBound(a,  2 ))
к сожалению это работать не будет, т.к. при всей простоте функция Mredim создает новый массив, а не переопределяет старый, и VBA будет ругаться на превышение диапазона a()


Почему не будет, у меня работает, или мы о разных вещах говорим, вот пример:

Код: plaintext
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.
Private Function MRedim(a_inp(), i_c, i_r)
 'a_inp - исх. двухмерный массив
 'i_c на сколько увеличиваем кол-во строк
 'i_r на сколько увеличиваем кол-во столбцов
 Dim a_temp()
 
 i_c_max = UBound(a_inp,  1 )
 i_r_max = UBound(a_inp,  2 )
 
 ReDim a_temp( 1  To i_c_max + i_c,  1  To i_r_max + i_r)
 
 For i_i =  1  To i_c_max
  For i_j =  1  To i_r_max
   a_temp(i_i, i_j) = a_inp(i_i, i_j)
  Next i_j
 Next i_i
 
 MRedim = a_temp
End Function


Sub ar()
 Dim a()
 Dim i As Integer
 
 ReDim a( 1  To  10 ,  1  To  10 )
 i_c =  5  ' на сколько увеличиваем кол-во строк
 i_r =  15  ' на сколько увеличиваем кол-во столбцов

 MsgBox UBound(a,  1 ) & vbCrLf & UBound(a,  2 )
 
 For i =  1  To  10 
  a = MRedim(a, i_c, i_r)
  MsgBox UBound(a,  1 ) & vbCrLf & UBound(a,  2 )
 Next i
End Sub
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36344266
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Djon Player,

И в правду Работает................


?????????????????????

!!!!!!!!!!!!!!!!!!!!!!!!!!!

Значит я гений)
...
Рейтинг: 0 / 0
Как Добавить строки в двумерный массив
    #36348927
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasilisk_andDjon Player,

И в правду Работает................


?????????????????????

!!!!!!!!!!!!!!!!!!!!!!!!!!!

Значит я гений)Да, действительно работает :-)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как Добавить строки в двумерный массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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