Страницы: 1 2 След.
RSS
Изменить начало отсчета массива с 0 на 1
 
Создаю из строки через Split массив:
Код
Dim arrP() As String
P = "P20 P44 P64 P83"
arrP = Split(P)
Но мне нужно что бы элементы массива отсчитывались не от 0, а от 1.
option base - не срабатывает.
Пытаюсь переопределить командой
Код
ReDim Preserve arrP(1 To 4)
выпадает с ошибкой subscript out of range.
Если переопределить массив вначале, то после срабатывания Split , элементы опять начинаются с 0.
 
Перебросьте циклом в другой массив созданный с 1. А чем помешал массив с 0 непонятно?
"Все гениальное просто, а все простое гениально!!!"
 
venrt, Если именно As String() и именно через Split, то штатными средствами - никак.
Можно поставить впереди текста пробел и получить массив с нижним индексом 0, но с полезными данными, начинающимися с 1
Код
P = " P20 P44 P64 P83"
arrP = Split(P)
Можно разбить строку во временный массив и переписать в основной с нужным нижним индексом.
Можно получить массив типа Variant/String так
Код
Option Base 1
'...
Dim arrP()
arrP = Array("P20", "P44", "P64", "P83")
Или нештатными средствами - с помощью RtlMoveMemory изменить нижний индекс в структуре SAFEARRAY.
Изменено: Казанский - 21.11.2018 16:39:30
 
Цитата
Nordheim написал:
Перебросьте циклом в другой массив созданный с 1. А чем помешал массив с 0 непонятно?
Дальше идет цикл по массиву с формулами и приходится прибавлять 1.
Думаю тогда уж лучше остановится на 0.
 
Цитата
venrt написал:
Дальше идет цикл по массиву с формулами и приходится прибавлять 1
Вот тут не совсем понял, какое это имеет значение?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Вот тут не совсем понял, какое это имеет значение?
Ну данная проблема можно сказать продолжение прошлой темы.
На переборе массива завязано подставление элементов в названия столбцов и также, что бы не плодить циклы формирования названия имен файлов, типа вот:
Код
For i = 0 To 3
For ii = 20 To 25 Step 5
        f = (i+1) * 100 + ii
        cFileName = f & ""
        With r
            Set rr = Union(.ListColumns(Clmn1).DataBodyRange, _
            .ListColumns(arrPzmx(i)).DataBodyRange, .ListColumns(arrQzmx(i)).DataBodyRange)
        End With
...
 
venrt,  прибавьте или отнимите  1 от переменной цикла и не ищите проблем.
По вопросам из тем форума, личку не читаю.
 
БМВ, да так и сделал
 
Цитата
venrt написал:
option base - не срабатывает.
Попробуйте написать ПЕРЕД самым первым Sub.
Excel непознаваем как атом.
 
Цитата
mtts54: Попробуйте написать ПЕРЕД самым первым Sub
насколько я знаю — это не сработает, т.к. Split всегда возвращает массив с 0. Также как и создание массива из диапазона листа всегда даёт нижнюю границу 1. Указание Option Base 1 задаст нижнюю границу с единицы (а не с 0 по-умолчанию), если она не указана явно. Возьмём, например, Dim arrTemp(10,5) as String. Размер массива по-умолчанию = 11*6 = 66. Размер массива при Option Base 1 = 10*5 = 50. Я представляю себе это как-то так… Источник
P.S.: сам лично не тестил, т.к. нет необходимости, поэтому не ручаюсь…
Цитата
venrt: нужно что бы элементы массива отсчитывались не от 0, а от 1
а я как раз обратным занимаюсь — массивы с листа перегоняю в цикле в одномерные и с нуля. Часто это делается потому что одномерный массив с нуля очень быстро и просто можно сцепить в текстовую строку через Join.
Изменено: Jack Famous - 22.11.2018 10:48:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
массивы с листа перегоняю в цикле в одномерные и с нуля
Можно сразу в цикле сделать строковую переменную не пользуясь Join, а то чего зря цикл гонять.
"Все гениальное просто, а все простое гениально!!!"
 
venrt, что бы  не морочить себе голову заведите себе правило работать через
Код
Option Base 0
и забудете с чего начинать.
хотя есть отдельные случаи, когда нужно работать с 1
Изменено: ivanok_v2 - 22.11.2018 10:40:56
 
Цитата
Nordheim: сразу в цикле сделать строковую переменную не пользуясь Join, а то чего зря цикл гонять
тогда её хранить надо, а она не факт что понадобится. А так массив я храню по-любому (а значит циклу сбора нулевого одномерного массива быть) и получить строку могу тоже в любой момент (и быстро). Вообще решил перейти на одномерные массивы с нуля для универсальности. В надстройке функции писал под них, да, вроде как, они считаются более "классическими" что-ли…
Кроме того, думаю, что "накопление" текстовой строки в цикле перебора массива будет медленнее, чем формирование одномерного с последующим Join (не тестил, но у Join просто фантастическая скорость).
Цитата
ivanok_v2: работать через Option Base 0
он же по-умолчанию стоит — и запоминать ничего не надо)) я вот так и делаю  :)
Изменено: Jack Famous - 22.11.2018 10:46:50
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
он же по-умолчанию стоит
повторение - мать учения.
 
Jack Famous, На самом деле не видел частого использования преобразования огромных массивов  в строку, обычно делается наоборот, строки преобразовывают в массив.
"Все гениальное просто, а все простое гениально!!!"
 
OFF
Цитата
Nordheim: преобразования огромных массивов  в строку
есть столбец "справочник номенклатур" в котором собраны уникальные значения. Есть несколько столбцов/полей "номенклатуры", в которых эти самые номенклатуры могут повторяться. Задача: проверить поля на соответствие справочнику и выделить несовпадения.
Решение:
вот для подобного я и использую текстовые строки — они избавляют от необходимости плодить циклы и тратить время. Источник
Изменено: Jack Famous - 22.11.2018 11:07:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
mtts54 написал:
Попробуйте написать ПЕРЕД самым первым Sub.
а еще функции ближе к началу модуля имеют больший приоритет и выполняются быстрее. :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
Вообще решил перейти на одномерные массивы с нуля для универсальности
И в чём же универсальность? )
 
Цитата
БМВ написал:
еще функции ближе к началу модуля имеют больший приоритет и выполняются быстрее
ето шутка?
 
Юра. Тот кошак еще только огонь добывает, а другой уже пожарил рыбу и съел.
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
Split всегда возвращает массив с 0
Да. А вот Array может всегда возвращать массив с 0, а может учитывать Option Base!
Код
Option Base 1

Sub test()
Dim a(), b$()
  a = Array(1, 2, 3)
  Debug.Print LBound(a), UBound(a) '1 3
  a = VBA.Array(1, 2, 3)
  Debug.Print LBound(a), UBound(a) '0 2
  b = Split("a b c")
  Debug.Print LBound(a), UBound(a) '0 2
  b = VBA.Split("a b c")
  Debug.Print LBound(a), UBound(a) '0 2
End Sub
Изменено: Казанский - 22.11.2018 12:14:39
 
Казанский,а в чем разница между
Код
Array(1, 2, 3)
и
Код
VBA.Array(1, 2, 3)
ето же одна и таже функция, или нет?
 
Цитата
ivanok_v2 написал:
ето шутка?
а чего еще можно ожидать от медведя который с понедельника на курсах по электробезопасности .
По вопросам из тем форума, личку не читаю.
 
Про
Код
Option Base
было сразу написано, что не срабатывает.
 
venrt, надо помнить, что
Код
Option Base
не действует на:
Код
VBA.Array()
Split()
а также на словари. (это то что я помню из того, чем пользуюсь наиболее часто)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
БМВ написал:
а чего еще можно ожидать от медведя который с понедельника на курсах по электробезопасности .
ну как минимум, поход на пиво с рибкой
 
JayBhagavan, ага, спасибо. Теперь буду знать. А Vba.Array в чем суть/отличия?
 
Цитата
venrt написал: А Vba.Array в чем суть/отличия?
Всегда с нуля и не нужен Lbound().

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Юрий М: И в чём же универсальность?
в основном под Join это всё и подводил  :) ну и ещё я эти одномерные массивы передаю в форму с поиском, а так как форма одна, а передавать я могу всё, что угодно, то в неё встроена функция преобразования "всего-что-угодно" в одномерный массив с нуля. Как-то столкнулся с проблемами при передаче массивов двумерных и/или с 1 в форму. С тех пор, как перешёл - не было…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Джек, а если несколько столбцов? Да и с одномерным массивом при выгрузке на лист возникает необходимость транспонирования...
Так что решение "перейти на одномерные массивы для универсальности" вызывает (у меня лично) сомнения ) Ну какая может быть универсальность? Может быть что-то не так с формулировкой? :)
Страницы: 1 2 След.
Наверх