Страницы: 1 2 След.
RSS
Работа с массивами. Размерности массивов
 
Сообщения перенесены в новую тему [МОДЕРАОР]

У нас есть вариативная переменная arr. Мы её использовали до этого в коде, и (так как больше её данные не нужны) использовали дальше в коде, просто заполнив заново? Безо всякого очищения и ReDim???
А что - так можно было? :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Если размерность массива не задана при объявлении, то  ее можно менять при использовании.
 
Цитата
vikttur написал:
её можно менять при использовании
спасибо! То есть она сама меняется в процессе наполнения - правильно я понял?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Нет, неправильно. Массив можно заполнить значениями диапазона. После использования заполнить из другого диапазона с другим  размером...
Можно задать размерность и заполнять массив (хоть весь, хоть часть его).

Цитата
TheBestOfTheBest: при выводе на лист будет выведен весь массив, это может сильно тормозить.
Не обязательно. Довольно часто бывает, что вычисления нужной (предполагаемой) размерности сложнее, чем задание размерности с запасом. После заполнения массива можно выгрузить только часть.
Например:
Код
ReDim aTemp (1 To 500, 1 To 10)
' внесено k=400 записей, да и последние "столбцы" не заполнялись
.Cells(1,1).Resize(k,8).Value = aTemp
 
Цитата
vikttur написал:
После заполнения массива можно выгрузить только часть.
Вот это более правильное решение.
Офф. К вопросу почему программист когда ложиться спать на прикроватную тумбочку ставит два стакана, один полный, другой пустой!?
Изменено: TheBestOfTheBest - 24.01.2018 16:24:40
Неизлечимых болезней нет, есть неизлечимые люди.
 
vikttur, вы имеете ввиду выгружать массив частями циклом будет быстрее и корректнее, чем весь сразу - так?
Изменено: Jack Famous - 24.01.2018 16:24:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
выгружать массив частями циклом будет быстрее и корректнее...?
Опять мимо.
Я писал о том, что не всегда можно определить нужный размер, но можно задать с запасом. На лист выгрузить только то, что заполнено.
 
Цитата
vikttur написал:
Опять мимо
не понимаю((( размерность с запасом лучше/корректнее/быстрее, чем Variant? А если просто Erase arr перед очередным использованием?
Я, наверное, очень глупые, с точки зрения операций с массивами, вопросы задаю…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
TheBestOfTheBest написал:
Кроме этого Вы не можете определить размер arr и переопределить его размер.
Размер arr, это весь массив данных он по логике не может быть меньше количества повторений, а переменная k как раз и определяет границу выгрузки части массива на лист. Что касаемо определения размерности массива, то это как бы и не требуется.
Изменено: Nordheim - 24.01.2018 16:24:40
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
vikttur написал:
Не обязательно. Довольно часто бывает, что вычисления нужной (предполагаемой) размерности сложнее, чем задание размерности с запасом.
Не обязательно, но может, мы же не знаем реальные данные как выглядят.
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
Jack Famous написал: размерность с запасом лучше/корректнее/быстрее, чем Variant?
При чем здесь типы данных?
Нужно загрузить массив из диапазона A1:C20
Код
aData = .Range("A1:C20").Value

Размерность массива - 20 на 3
Можно было задать размерность при объявлении
Код
Dim aData (1 To 20, 1 To 3)

но при этом пришлось бы заполнять массив в цикле

А если заранее неизвестно, сколько строк придется заполнять? С горизонтльной размерностью проще - ее можно менять в процессе, не стирая уже сохраненные данные
Код
ReDim Preserve aData (1 To 20, 1 To 5)

А как быть с вертикальной? Таблетки успокоительные глотать?
Размерность задаем заранее такой, чтобы была не меньше предполагаемого максимума. и выгружаем из массива не все, включая пустые, а только нужное.
 
vikttur, стало понятнее - спасибо)) но всё равно не ясно, чем хуже заполнить aData, не задавая размерность вообще (как Variant)? Она же самоопределится в процессе? Да и в основном, тут на форуме, так и делают с массивами…
А вот Дима «The_Prist» Щербаков в этом плане строг - у него я, как правило, вижу все объявления.

Причём, как я понял, .Value2 лучше, чем .Value, особенно с датами.
Изменено: Jack Famous - 24.01.2018 16:24:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вы путаете размерность с типом. В этой теме о типе я вооще ни разу не писал.
Размерность - количество элементов по вертикали, горизонали, диагонали... (до 64 размерностей, правда, не знаю, зачем столько).
Тип зависит от типа данных, которые будут размещаться в массиве. Тип не нужно задавать, если предполагается работа с разнотипными даными.
 
vikttur, смотрите:
1. Можно задать arr или arr() - в первом случае это Variant/Variant(), а во втором только Variant(). Верно? Уже тут явное объявление массива будет быстрее.
2. Размерность для массива нужно определить, задать с запасом или же просто заполнить переменную (например с листа, через Array или как-то ещё) без циклов и определений. Верно?
Вот со вторым мне и не очень понятно, в каком случае задание точных границ или границ с запасом будет лучше, чем просто наполнение.
Изменено: Jack Famous - 24.01.2018 16:24:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Вот со вторым мне и не очень понятно, в каком случае задание точных границ или границ с запасом будет лучше, чем просто наполнение.
Под конкретную задачу. В которой размер диапазона или массива не изменяется, чаще используется динамический массив arr()
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
1. Можно задать arr или arr()
Конечно, Arr() правильнее.

Цитата
в каком случае задание точных границ или границ с запасом будет лучше, чем просто наполнение.
Уже, наверное, третий раз.
Заполнять массив не получится, пока неизвестны его размерности. Т.е. нельзя объявить как arr() и записать в него значение. Нужно или задать размерность (ReDim), или загрузить в массив диапазон (при этом размерности примут значения размеров диапазона)
Цитата
А если заранее неизвестно, сколько строк придется заполнять?
 
vikttur, под наполнением я имею ввиду arr=rng.value2, а не вставку на лист (если вдруг вы про это  :) )
Количество элементов массива после его наполнения можно же через UBound узнать.
UBound(arr,1)*UBound(arr,2) = КОЛ-ВО строк* КОЛ-ВО столбцов

Или же всё плохо и меня спасёт только штудирование матчасти?  :D

UPD: кажется я начал понимать, о чём вы))) спасибо!
Изменено: Jack Famous - 24.01.2018 16:24:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
UBound(arr,1)*UBound(arr,2) = КОЛ-ВО строк* КОЛ-ВО столбцов
Это не количество строк а наибольший индекс. Если массив начинается с нулевого индекса то UBound(arr) не будет равно количеству строк (столбцов) массива
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, ну да - нужно будет единицы добавить к каждому Ubound, в таком случае.
А при наполнении массива диапазоном с листа каждая граница с 1 должна быть автоматом. Правильно сделали, что поправили  ;)
Изменено: Jack Famous - 24.01.2018 16:31:39
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
1. Можно задать arr или arr() - в первом случае это Variant/Variant(), а во втором только Variant(). Верно?
Dim arr(20,3) As String - объявление массива с верхними границами 20 и 3, причем нижнее значение 0 или 1 в зависимости от Option Base 1 - arr (1 TO 20, 1 TO 3), если нет Option Base 1, то arr (0 TO 20, 0 TO 3), тип данных строковый

Dim arr - объявление переменной,, поскольку тип не указан, то VBA присваивает Variant
Затем arr=.Range("A1:C20").Value - VBA из переменной делает массив размерностями согласно диапазону. но тип остается Variant, нижняя граница всегда =1 (от Option Base 1 не зависит)

Dim arr() - объявление динамического массива, поскольку тип не указан, то VBA присваивает Variant. Динамический потому, что можно менять его размер, но только в некоторых пределах (см. описание ReDim), т.е. из arr (1 TO 20, 1 TO 3) можно сделать arr (1 TO 20, 1 TO 5), но нельзя сделать arr (1 TO 20, 1 TO 2) или arr (1 TO 120, 1 TO 3). Также если указать тип (Dim arr()  As Stribg), то диапазон в такой массив записать нельзя, т.е. arr=Range("A1:C20").Value даст ошибку.
Изменено: TheBestOfTheBest - 24.01.2018 17:38:56
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
Jack Famous написал:
Количество элементов массива после его наполнения можно же через UBound узнать.
Неверно, через Ubound можно узнать верхнюю границу, причем:
в зависимости от Option Base 1 - arr (1 TO 20, 1 TO 3), если нет Option Base 1, то arr (0 TO 19, 0 TO 2)  -граница будет 20 или 19 / 3 или 2

Поэтому если массив предполагается выводить в ячейки или сопоставлять с диапазоном, то лучше использовать Option Base 1, при этом верхняя граница (20) покажет количество элементов в массиве/размер Range.
Изменено: TheBestOfTheBest - 24.01.2018 17:11:05
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал:
нижнее значение 0 или 1 в зависимости от Option Base 1
а разве нижняя граница при заполнении массива диапазоном с листа не будет 1 - по умолчанию, без объявления Option Base???
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Попробуйте.
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest, попробовал))) 1)))
Код
Option Explicit
Sub test()
Dim arr
arr = Selection.Value2
MsgBox LBound(arr)
End Sub
а вот матчасть где читал
Изменено: Jack Famous - 24.01.2018 17:20:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
видимо при записи размеров из диапазона, всегда Lbound=1, однако посмотрите arr2
Код
Option Explicit
Sub test()
Dim arr(), arr2()
arr2 = Array(1, 2, 3, 4, 5)
arr = Selection.Value2
MsgBox LBound(arr)
End Sub
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest, с 0 - как и должен быть. Я же именно про заполнение с листа говорил. По ссылке так и есть
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Исправил #20
Неизлечимых болезней нет, есть неизлечимые люди.
 
Господа, в этой теме снова столкнулся с "массивной" проблемой. Код не функционирует.
Karataev пытался мне объяснить, но до меня не доходит
КОД
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вы хоть #20 прочитали?
Цитата
можно менять его размер, но только в некоторых пределах (см. описание ReDim), т.е. из arr (1 TO 20, 1 TO 3) можно сделать arr (1 TO 20, 1 TO 5), но нельзя сделать arr (1 TO 20, 1 TO 2) или arr (1 TO 120, 1 TO 3).
Плюс в JOIN можно отдавать только одномерный массив
Изменено: TheBestOfTheBest - 26.01.2018 16:01:06
Неизлечимых болезней нет, есть неизлечимые люди.
 
Join, в качестве первого аргумента, принимает ОДНОмерный массив, а Ваш itxt ДВУмерный, т.к. формируется из диапазона
Согласие есть продукт при полном непротивлении сторон
Страницы: 1 2 След.
Наверх