Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Создать массив последовательных чисеел - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Создать массив последовательных чисеел (Макросы/Sub)
Создать массив последовательных чисеел
Udik Дата: Воскресенье, 13.11.2016, 15:55 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Можно ли создать одномерный массив последовательных чисел без цикла?
[vba]
Код

Public Sub test()
Dim arr1
Dim i As Long, i2&

i = 1
i2 = 900
arr1=?
End Sub
[/vba]
в результате в arr1 должно быть: arr1(1)=1, arr1(2)=2, ... arr1(20)=20


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Воскресенье, 13.11.2016, 16:44
 
Ответить
СообщениеМожно ли создать одномерный массив последовательных чисел без цикла?
[vba]
Код

Public Sub test()
Dim arr1
Dim i As Long, i2&

i = 1
i2 = 900
arr1=?
End Sub
[/vba]
в результате в arr1 должно быть: arr1(1)=1, arr1(2)=2, ... arr1(20)=20

Автор - Udik
Дата добавления - 13.11.2016 в 15:55
Kuzmich Дата: Воскресенье, 13.11.2016, 16:31 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
[vba]
Код
Dim Arr1
Arr1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
[/vba]
 
Ответить
Сообщение[vba]
Код
Dim Arr1
Arr1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
[/vba]

Автор - Kuzmich
Дата добавления - 13.11.2016 в 16:31
fairylive Дата: Воскресенье, 13.11.2016, 16:42 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 122
Репутация: 4 ±
Замечаний: 0% ±

Excel 2016
arr1 = range("A1:A20").value
При условии что на активном листе в диапазоне А1:А20 последовательные числа.
Правда в таком случае массив будет двумерным arr1 (1 to 20, 1 to 1). Но думаю Redim решит проблему.


Сообщение отредактировал fairylive - Воскресенье, 13.11.2016, 16:45
 
Ответить
Сообщениеarr1 = range("A1:A20").value
При условии что на активном листе в диапазоне А1:А20 последовательные числа.
Правда в таком случае массив будет двумерным arr1 (1 to 20, 1 to 1). Но думаю Redim решит проблему.

Автор - fairylive
Дата добавления - 13.11.2016 в 16:42
Udik Дата: Воскресенье, 13.11.2016, 16:44 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Не, вручную прописывать не пойдёт, а если таких чисел 50 или 100? Во избежание непоняток изменил i2 в 1 посте. И да, сделать всё в памяти.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Воскресенье, 13.11.2016, 16:47
 
Ответить
СообщениеНе, вручную прописывать не пойдёт, а если таких чисел 50 или 100? Во избежание непоняток изменил i2 в 1 посте. И да, сделать всё в памяти.

Автор - Udik
Дата добавления - 13.11.2016 в 16:44
fairylive Дата: Воскресенье, 13.11.2016, 16:49 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 122
Репутация: 4 ±
Замечаний: 0% ±

Excel 2016
Тогда нужны ещё условия. Зачем это надо и от куда будут поступать эти 20 или 900 последовательных чисел. Может и не надо изобретать ничего.
 
Ответить
СообщениеТогда нужны ещё условия. Зачем это надо и от куда будут поступать эти 20 или 900 последовательных чисел. Может и не надо изобретать ничего.

Автор - fairylive
Дата добавления - 13.11.2016 в 16:49
nilem Дата: Воскресенье, 13.11.2016, 16:56 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может так?:
[vba]
Код
Sub test()
Dim arr
arr = Application.Transpose([Row(20:31)])
Range("A1").Resize(UBound(arr)).Value = Application.Transpose(arr)
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеможет так?:
[vba]
Код
Sub test()
Dim arr
arr = Application.Transpose([Row(20:31)])
Range("A1").Resize(UBound(arr)).Value = Application.Transpose(arr)
End Sub
[/vba]

Автор - nilem
Дата добавления - 13.11.2016 в 16:56
Udik Дата: Воскресенье, 13.11.2016, 17:58 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
может так?:

Не, так лист используется, а я хотел бы в памяти всё провернуть. :) .
Теперь зачем всё это надо
Имеется табличка из которой надо вытянуть все строки, но только часть непоследовательных столбцов.
Сначала хочу разом загнать табличку в массив arr1 (с этим проблем нет) , а потом из него вытащить в массив arr2 нужные столбцы.
Дошёл до такой формулы
[vba]
Код

arr2() = Application.Index(arr1, Application.Transpose(arr3), Array(1, 2, 7, 8))
[/vba]
но чтобы эта строка работала, arr3 должен быть одномерным. В цикле заполнить несложно, а вдруг есть более "прямые" способы.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
может так?:

Не, так лист используется, а я хотел бы в памяти всё провернуть. :) .
Теперь зачем всё это надо
Имеется табличка из которой надо вытянуть все строки, но только часть непоследовательных столбцов.
Сначала хочу разом загнать табличку в массив arr1 (с этим проблем нет) , а потом из него вытащить в массив arr2 нужные столбцы.
Дошёл до такой формулы
[vba]
Код

arr2() = Application.Index(arr1, Application.Transpose(arr3), Array(1, 2, 7, 8))
[/vba]
но чтобы эта строка работала, arr3 должен быть одномерным. В цикле заполнить несложно, а вдруг есть более "прямые" способы.

Автор - Udik
Дата добавления - 13.11.2016 в 17:58
nilem Дата: Воскресенье, 13.11.2016, 18:49 | Сообщение № 8
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Не, так лист используется

используется только, чтобы показать массив
если нужны все строки и столбцы 1, 2, 7, 8, то попробуйте так
[vba]
Код
arr2() = Application.Index(arr1, 0, Array(1, 2, 7, 8))
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
Не, так лист используется

используется только, чтобы показать массив
если нужны все строки и столбцы 1, 2, 7, 8, то попробуйте так
[vba]
Код
arr2() = Application.Index(arr1, 0, Array(1, 2, 7, 8))
[/vba]

Автор - nilem
Дата добавления - 13.11.2016 в 18:49
Udik Дата: Воскресенье, 13.11.2016, 18:57 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
используется только, чтобы показать массив

знак равно как бы намекает, что идёт присвоение левой части, а слева диапазон листа , так что не могу согласиться B)
[vba]
Код

Range("A1").Resize(UBound(arr)).Value = Application.Transpose(arr)
[/vba]

А Application.Index(arr1, 0, Array(1, 2, 7, 8)) я пробовал, чего-то не заработала, но ещё разок помучаю.

==
Ага, ерунда выходит - создаётся одномерный массив из 4-х членов, причём заполняется каким-то причудливым образом.
К сообщению приложен файл: 3524697.jpg (30.0 Kb) · 0t.xlsm (16.4 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Воскресенье, 13.11.2016, 19:14
 
Ответить
Сообщение
используется только, чтобы показать массив

знак равно как бы намекает, что идёт присвоение левой части, а слева диапазон листа , так что не могу согласиться B)
[vba]
Код

Range("A1").Resize(UBound(arr)).Value = Application.Transpose(arr)
[/vba]

А Application.Index(arr1, 0, Array(1, 2, 7, 8)) я пробовал, чего-то не заработала, но ещё разок помучаю.

==
Ага, ерунда выходит - создаётся одномерный массив из 4-х членов, причём заполняется каким-то причудливым образом.

Автор - Udik
Дата добавления - 13.11.2016 в 18:57
fairylive Дата: Воскресенье, 13.11.2016, 20:47 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 122
Репутация: 4 ±
Замечаний: 0% ±

Excel 2016
но чтобы эта строка работала, arr3 должен быть одномерным.

Ну так переопределить массив. Двухмерный в одномерный. Redim arr3(1 to 20). С сохранением данных чтобы было после Redim оператор Preserve.
 
Ответить
Сообщение
но чтобы эта строка работала, arr3 должен быть одномерным.

Ну так переопределить массив. Двухмерный в одномерный. Redim arr3(1 to 20). С сохранением данных чтобы было после Redim оператор Preserve.

Автор - fairylive
Дата добавления - 13.11.2016 в 20:47
Udik Дата: Понедельник, 14.11.2016, 13:57 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
С сохранением данных чтобы было после Redim оператор Preserve


Вы на практике такое пробовали? Ибо есть маленький нюанс
Цитата

При использовании ключевого слова Preserve имеется возможность изменить значение только последней размерности массива и не допускается изменение числа размерностей.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
С сохранением данных чтобы было после Redim оператор Preserve


Вы на практике такое пробовали? Ибо есть маленький нюанс
Цитата

При использовании ключевого слова Preserve имеется возможность изменить значение только последней размерности массива и не допускается изменение числа размерностей.

Автор - Udik
Дата добавления - 14.11.2016 в 13:57
fairylive Дата: Понедельник, 14.11.2016, 21:46 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 122
Репутация: 4 ±
Замечаний: 0% ±

Excel 2016
Вы на практике такое пробовали? Ибо есть маленький нюанс

Нда попутал я. Но всё равно с вашим
Цитата
не допускается изменение числа размерностей.

не вяжется.
Недавно только на днях столкнулся с тем что когда массив задаётся диапазоном ячеек, то он получается двумерный, даже если диапазон одна строка или столбец (1 to 20, 1 to 1). Но в тоже время если задается одной ячейкой то он уже будет одномерный (1 to 1). Я как раз переопределял этот одномерный массив в двумерный просто задавая ReDim M1_ar(1 To 1, 1 To 1). И программа отрабатывала как надо. Кусок кода был такой:
[vba]
Код
    If .Range(m1_adr).Cells.count = 1 Then
            ReDim M1_ar(1 To 1, 1 To 1)
            M1_ar(1, 1) = Range(m1_adr).Value
        Else
            M1_ar = Range(m1_adr).Value
    End If
[/vba]
UPD. Про нюанс Preserve не сразу увидел... Тогда то что я описал не прокатит. Понял теперь.


Сообщение отредактировал fairylive - Понедельник, 14.11.2016, 21:53
 
Ответить
Сообщение
Вы на практике такое пробовали? Ибо есть маленький нюанс

Нда попутал я. Но всё равно с вашим
Цитата
не допускается изменение числа размерностей.

не вяжется.
Недавно только на днях столкнулся с тем что когда массив задаётся диапазоном ячеек, то он получается двумерный, даже если диапазон одна строка или столбец (1 to 20, 1 to 1). Но в тоже время если задается одной ячейкой то он уже будет одномерный (1 to 1). Я как раз переопределял этот одномерный массив в двумерный просто задавая ReDim M1_ar(1 To 1, 1 To 1). И программа отрабатывала как надо. Кусок кода был такой:
[vba]
Код
    If .Range(m1_adr).Cells.count = 1 Then
            ReDim M1_ar(1 To 1, 1 To 1)
            M1_ar(1, 1) = Range(m1_adr).Value
        Else
            M1_ar = Range(m1_adr).Value
    End If
[/vba]
UPD. Про нюанс Preserve не сразу увидел... Тогда то что я описал не прокатит. Понял теперь.

Автор - fairylive
Дата добавления - 14.11.2016 в 21:46
SLAVICK Дата: Вторник, 15.11.2016, 11:37 | Сообщение № 13
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
хм. раньше не заморачивался этим(у индекса есть большооой недостаток - он не работает со СТРИНГами длиной больше 255 символов - поэтому мне он не подходит)) - а тут, раз обсуждают - решил полюбопытствовать(пока не более того).
Почитав тут - понял, что
[vba]
Код
varTemp = Application.Index(varArray, 0, Application.Transpose(Array(2, 4, 5)))
[/vba]
работает у других, но у меня, как и у Вас - почему то не срабатывает :( .
Но решение вроде нашел (у мну работает):
[vba]
Код
arr2 = Application.Index(arr1, [row(1:20)], (Array(1, 3, 7, 4)))
[/vba]
К сообщению приложен файл: 0t-2-.xlsm (16.7 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщениехм. раньше не заморачивался этим(у индекса есть большооой недостаток - он не работает со СТРИНГами длиной больше 255 символов - поэтому мне он не подходит)) - а тут, раз обсуждают - решил полюбопытствовать(пока не более того).
Почитав тут - понял, что
[vba]
Код
varTemp = Application.Index(varArray, 0, Application.Transpose(Array(2, 4, 5)))
[/vba]
работает у других, но у меня, как и у Вас - почему то не срабатывает :( .
Но решение вроде нашел (у мну работает):
[vba]
Код
arr2 = Application.Index(arr1, [row(1:20)], (Array(1, 3, 7, 4)))
[/vba]

Автор - SLAVICK
Дата добавления - 15.11.2016 в 11:37
Udik Дата: Вторник, 15.11.2016, 15:11 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Но решение вроде нашел (у мну работает):

Оно работает, если в row константы, а для переменных нужен бубен :) Но я его нашёл
[vba]
Код

str1 = i & ":" & i2
str1 = "=Row(" & str1 & ")"
arr2() = Application.Index(arr1, Evaluate(str1), Array(1, 2, 7, 8))
rng1.Resize(UBound(arr2), UBound(arr2, 2)).Value = arr2()

[/vba]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
Но решение вроде нашел (у мну работает):

Оно работает, если в row константы, а для переменных нужен бубен :) Но я его нашёл
[vba]
Код

str1 = i & ":" & i2
str1 = "=Row(" & str1 & ")"
arr2() = Application.Index(arr1, Evaluate(str1), Array(1, 2, 7, 8))
rng1.Resize(UBound(arr2), UBound(arr2, 2)).Value = arr2()

[/vba]

Автор - Udik
Дата добавления - 15.11.2016 в 15:11
SLAVICK Дата: Вторник, 15.11.2016, 15:37 | Сообщение № 15
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
если в row константы, а для переменных нужен бубен

c этого места поподробнее - и желательно пример, когда не сработает :

Удалил неверное соображение

.... Кажется понял.. нужно покумекать еще.


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 15.11.2016, 15:46
 
Ответить
Сообщение
если в row константы, а для переменных нужен бубен

c этого места поподробнее - и желательно пример, когда не сработает :

Удалил неверное соображение

.... Кажется понял.. нужно покумекать еще.

Автор - SLAVICK
Дата добавления - 15.11.2016 в 15:37
Udik Дата: Вторник, 15.11.2016, 15:43 | Сообщение № 16
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Просто я сразу ссылаюсь на диапазон а у Вас это идет через Evaluate

А попробуйте в row прописать диапазон с переменными, у меня только с Evaluate получилось.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
Просто я сразу ссылаюсь на диапазон а у Вас это идет через Evaluate

А попробуйте в row прописать диапазон с переменными, у меня только с Evaluate получилось.

Автор - Udik
Дата добавления - 15.11.2016 в 15:43
SLAVICK Дата: Вторник, 15.11.2016, 17:57 | Сообщение № 17
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
посмотрел, почитал...
видимо действительно для этой цели оптимально использовать Evaluate , тем более, если верить 2-й ссылке - так даже быстрее.


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщениепосмотрел, почитал...
видимо действительно для этой цели оптимально использовать Evaluate , тем более, если верить 2-й ссылке - так даже быстрее.

Автор - SLAVICK
Дата добавления - 15.11.2016 в 17:57
krosav4ig Дата: Вторник, 15.11.2016, 23:35 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 2346
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
одномерный массив последовательных чисел без цикла

в JS это длается довольно просто, например массив из n чисел с x по x+n-1 формируется вот так [vba]
Код
Array.apply(null, Array(n)).map(function(_,i){return i+x;})
[/vba] , а вот в vba через scriptcontrol подобная конструкция наотрез отказывается работать


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Вторник, 15.11.2016, 23:36
 
Ответить
Сообщение
одномерный массив последовательных чисел без цикла

в JS это длается довольно просто, например массив из n чисел с x по x+n-1 формируется вот так [vba]
Код
Array.apply(null, Array(n)).map(function(_,i){return i+x;})
[/vba] , а вот в vba через scriptcontrol подобная конструкция наотрез отказывается работать

Автор - krosav4ig
Дата добавления - 15.11.2016 в 23:35
SLAVICK Дата: Среда, 16.11.2016, 10:06 | Сообщение № 19
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
в JS это длается довольно просто,

что же тогда сложно? %) .
массив из n чисел с x по x+n-1 формируется вот так

ну мы тут с Udikом пришли к такой незамысловатой конструкции :
[vba]
Код
m = Evaluate("row(" & x & ":" & x + n - 1 & ")")
[/vba]
Собственно строка извлечения данных из массива со строки i до i2, и столбцов 1, 3, 7, 4 получается так:
[vba]
Код
arr2 = Application.Index(arr1, Evaluate("row(" & i & ":" & i2 & ")"), (Array(1, 3, 7, 4)))
[/vba]
К сожалению для меня такая конструкция большого значения не имеет, поскольку, как уже писал выше:
он не работает со СТРИНГами длиной больше 255 символов

я себе давно состряпал простые ЮДФки для извлечения данных из массива. НО для общего развития - пойдет, может где и сгодится :D .


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
в JS это длается довольно просто,

что же тогда сложно? %) .
массив из n чисел с x по x+n-1 формируется вот так

ну мы тут с Udikом пришли к такой незамысловатой конструкции :
[vba]
Код
m = Evaluate("row(" & x & ":" & x + n - 1 & ")")
[/vba]
Собственно строка извлечения данных из массива со строки i до i2, и столбцов 1, 3, 7, 4 получается так:
[vba]
Код
arr2 = Application.Index(arr1, Evaluate("row(" & i & ":" & i2 & ")"), (Array(1, 3, 7, 4)))
[/vba]
К сожалению для меня такая конструкция большого значения не имеет, поскольку, как уже писал выше:
он не работает со СТРИНГами длиной больше 255 символов

я себе давно состряпал простые ЮДФки для извлечения данных из массива. НО для общего развития - пойдет, может где и сгодится :D .

Автор - SLAVICK
Дата добавления - 16.11.2016 в 10:06
Udik Дата: Пятница, 18.11.2016, 15:15 | Сообщение № 20
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
а вот в vba через scriptcontrol

У меня офис 64, там scriptcontrol вообще никак не работает.


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
а вот в vba через scriptcontrol

У меня офис 64, там scriptcontrol вообще никак не работает.

Автор - Udik
Дата добавления - 18.11.2016 в 15:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Создать массив последовательных чисеел (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!