Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2
RSS
Не увеличивается размерность массива ReDim Preserve
 
Цитата
sokol92 написал:
Win XP Excel 20017
Я тоже верю что будет такая версия Excel :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
andrey062006 написал: Ну давайте разберемся
Давайте.
До вчерашнего дня Вы вообще не подозревали, что у массива может быть несколько размерностей  :) .
А теперь безапеляционно заявляете
Цитата
andrey062006 написал: Это не оптимальная стратегия ни разу вообще.
Все зависит от конкретной задачи
Согласие есть продукт при полном непротивлении сторон.
 
То что я не понял используемого термина не означает что я не работал с массивами
С массивами я работаю уже не один год.
Я делал Redim preserve на одномерном массиве и все работало. На многомерных у меня выскакивала ошибка всегда. Решил разобраться. Поэтому и обратился на форум с вопросом.

Цитата
sokol92 написал: На древнем компьютере (Win XP Excel 2007) - 0.2 сек. Или у меня обман зрения?
Заполнение массива простыми числами и заполнение, например, стрингами  - не одно и тоже!
 
Цитата
andrey062006 написал: С массивами я работаю уже не один год
И не поняли, что у sokol92 массив заполняется именно стрингами  :)  
Согласие есть продукт при полном непротивлении сторон.
 
ReDim Preserve в цикле - не очень хорошая мысль. Но иногда можно вставить. Например, заполение массива именами файлов из папки. Конечно, если их там не 15 миллионов тысяч ) .
Свежий пример: сообщение №4

А вот в начале обработки - почему бы и не применить?
Пример: для заполнения нужет массив 5 столбцов с сохранением исходных данных в 3-х.  Но 4 и 5 на листе заполнены. Чтобы не чистить массив в цикле:
Код
aData = .Range("A1:C50").Value
ReDim Preserve aData(1 To 50, 1 To 5)

Что делать, если малы размерности до последней? От печки задачи плясать надо. Прегрузка в другой массив, выгрузка массива на лист и его очиска для последующего заполнения,  задание заведомо бОльшей размерности...
 
Здравствуйте, БМВ! Это я под впечатлением вчерашнего вопроса. :)

Уважаемый andrey062006! Вы можете в вышеприведенном примере заполнить массив простыми числами и проверить результат.
Владимир
 
andrey062006, для того чтоб разобраться, порой достаточно посмотреть в документацию https://msdn.microsoft.com/ru-ru/vba/language-reference-vba/articles/redim-statement
Например если массив имеет только одно измерение, можно изменить ее размер, так как они последнего и только измерения. Тем не менее если массив имеет две или более измерений, можно изменить размер только последнего измерения и сохранить содержимое массива. ...
По вопросам из тем форума, личку не читаю.
 
Цитата
Sanja написал:
И не поняли, что у  sokol92  массив заполняется именно стрингами    
:D  каюсь, не заметил))))))) не вчитывался в код)
но тем не менее это не меняет того факта что он создает эти стринги кодо
а если надо произвести выборку информации с листа по определнным критериям, занести это в массив, в нем произвести необходимые манипуляции (расчеты/анализы/конвертации/преобразования/замены итп) и у вас к примеру массив в первом столбце стринги, во втором дубли, в третьем лонги, в еще 5 столбцах еще какие нибудь стринги
 
sokol92, не, не так, мы ведь не о заполнении говорили, а о "пресервах в цикле"/
Т.е. будет так:
Код
Sub test()
    Dim arr()
    Dim t As Double
    Dim i As Long
    ReDim arr(1 To 1)
    t = Timer

    For i = LBound(arr) To 1000000    '60000
        ReDim Preserve arr(1 To i)
    Next i

    Debug.Print Timer - t
End Sub

Миллион около 33 сек. отрабатывает (опасно! я думал вообще зависло), а 60000=0,07421875. А если массив двумерный как в первых примерах - то около двух секунд. Это у меня.
Изменено: Hugo - 30 Мар 2018 15:39:09
 
Ох закидали всю почту мне )))
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Hugo написал:
мы ведь не о заполнении говорили, а о "пресервах в цикле"/
Каюсь, этот нюанс от меня ускользнул (поиск по контексту "цикл" в сообщениях #1 - #28 ничего не выдает). :)  
Владимир
 
Цитата
sokol92 написал:
Оптимальная стратегия - удваивать последнюю размерность
Оптимальная стратегия ReDim'ить массив в два захода:
- первый -  счетчик
- перед вторым - ReDim, а на втором уже собственно заполнение.
Так и память не отжирается, и время приемлемое.

П.С.: Проверено на сортере, где каждый такт важен)
 
Цитата
Anchoret написал:
- первый -  счетчик
А смысл применять счетчик, если  известно его конечное значение , можно присвоить значение без использования цикла.
"Все гениальное просто, а все простое гениально!!!"
 
Иногда можно вообще собирать коллекцию, в финале переложить - если уж так необходим массив.
Страницы: Пред. 1 2
Читают тему (гостей: 1)
Наверх