Страницы: 1
RSS
Подставить в код переменные вместо значений
 
Всем привет. Вопрос спортивный.
Есть код, который берёт с листа данные в массив (например, А1:J20), а дальше мы через функцию Application.Index выдёргиваем из этого массива строки с 10 по 20-ю без цикла. Вопрос - как вот в эту строку кода подставить свои переменные
Код
File_Array = Application.Index(Arr, [Row(10:20)], [Column(1:10)])

т.е. вместо 10:20 и 1:10 подставить переменные a, b, c ?

Код
Sub Test()
Dim Arr As Variant, File_Array As Variant
    
    'берём массив с листа 20 строк и 10 столбцов
    Arr = Worksheets("Лист1").Range("A1:J20").Value
    'выбираем строки из массива Arr начиная с 10-й по 20-ю и 10 столбцов
    'аналог =ИНДЕКС(A1:J20;СТРОКА(10:20);СТОЛБЕЦ(1:10)) (формулу вводить в столбец А)
    File_Array = Application.Index(Arr, [Row(10:20)], [Column(1:10)])
    'обрезаем ненужные столбцы справа, т.к. их сейчас в массиве 16384
    ReDim Preserve File_Array(1 To UBound(File_Array, 1), 1 To 10)
    'выводим результат на Лист2
    With Worksheets("Лист2")
        .UsedRange.Clear
        .Range("A1").Resize(UBound(File_Array), UBound(File_Array, 2)).Value = File_Array
    End With
End Sub

Файл прилагаю
Изменено: New - 01.04.2022 01:01:46
 
То ли я чего-то не понимаю, то ли проблемы нет:
Код
a = 10
b = 20
c = 10
File_Array = Application.Index(Arr, Range(a & ":" & b), Columns(1).Resize(, c))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Привет, Дим.
К сожалению, не работает. Выдаёт ошибку 1004, Application-defined or object-defined error.

Код
Sub Test()
Dim Arr As Variant, a As Long, b As Long, c As Long, File_Array As Variant
    
    'берём массив с листа 20 строк и 10 столбцов
    Arr = Worksheets("Лист1").Range("A1:J20").Value
    'выбираем строки из массива Arr начиная с 10-й по 20-ю и 10 столбцов
    'аналог =ИНДЕКС(A1:J20;СТРОКА(10:20);СТОЛБЕЦ(1:10)) (формулу вводить в столбец А)
    'VAR 1
    'File_Array = Application.Index(Arr, [Row(10:20)], [Column(1:10)]) 'РАБОТАЕТ
    'обрезаем ненужные столбцы справа, т.к. их сейчас в массиве 16384
    'ReDim Preserve File_Array(1 To UBound(File_Array, 1), 1 To 10)

    'VAR 2 
    a = 10
    b = 20
    c = 10
    File_Array = Application.Index(Arr, Range(a & ":" & b), Columns(1).Resize(, c)) '<--- НЕ РАБОТАЕТ

    'выводим результат на Лист2
    With Worksheets("Лист2")
        .UsedRange.Clear
        .Range("A1").Resize(UBound(File_Array), UBound(File_Array, 2)).Value = File_Array
    End With
End Sub
 
сомневаюсь я что это выгодно ,но если используется Evalaute в записи не позволяющей использовать переменные, то почему не использовать её же но в записи позволяющей.

Код
Application.Index(Arr, Evaluate("=ROW(" & a & ":" & b & ")"), Evaluate("=column(1:" & c & ")"))
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: сомневаюсь я что это выгодно
я уже устал повторять им, что, если явного цикла нет, то это не значит, что его нет в вызываемой функции  :D Думаю, что даже самописная процедура/функция на VBA будет быстрее Application.Index и проще в использовании…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
При таких раскладах на мой взгляд лучше вообще использовать Intersect - и быстрее и понятнее:
Код
File_Array = Intersect(Range("A1:J20"), Range(a & ":" & b), Columns(1).Resize(, c)).Value
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
При таких раскладах
Соглашусь, с одной оговоркой, что данные на листе, а не уже в массиве.
кстати вот такая прикольная запись
Код
range("a1:j20 10:20 A:J") 
даст тот же результат. но если 10 и 20 просто взять, то для общего случая вычислять A и J несколько сложенее
Код
range("a1:j20 " & A & ":" & B &" " & Columns(1).Resize(, c).address)



Цитата
Jack Famous написал:
Думаю, что даже самописная процедура/функция на VBA будет быстрее Application.Index и проще в использовании…
а тут на половину ибо быстрее вряд ли, а вот то что понятнее  - факт.
Изменено: БМВ - 04.04.2022 11:49:59
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: быстрее вряд ли
Сравните, кто может (я не понял предложенные варианты)
Изменено: Jack Famous - 04.04.2022 13:57:22
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
кстати вот такая прикольная запись
такая запись по сути и есть Intersect :) раньше как-то даже использовал в некоторых формулах для определения пересечений.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
такая запись по сути и есть Intersect
да, оно родимое . По этому и пушу что прикольная запись.  :D

Цитата
Jack Famous написал:
(я не понял предложенные варианты)
- так напиши рабочий коТд :-)
Изменено: БМВ - 04.04.2022 12:28:05
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: так напиши рабочий коТд :-)
дык написал же и прошу затестить)
Изменено: Jack Famous - 04.04.2022 13:38:31
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
дык  написал  же и прошу затестить)
rr = 0 - ну ну .
По вопросам из тем форума, личку не читаю.
 
Offset и resize еще быстрее справятся(чем и циклы и функции):
Код
    a = 10
    b = 20
    c = 1
    cc = 10
    File_Array = Range("A1:J20").Offset(a - 1, c - 1).Resize(b - a + 1, cc - c + 1).Value

но ведь и вопрос был не в этом, если я правильно понял.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
БМВ: rr = 0 - ну ну
забыл один счётчик rr=rr+1 )) спасибо - добавил  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Offset и resize еще быстрее справятся(чем и циклы и функции):
Дима, скорее всего ты прав, но  решение заточено под работу с листом. Application.Index все ж отработает с обычным массивом и тут или циклом или INDEX.
По вопросам из тем форума, личку не читаю.
 
Файл и Код
Димин вариант быстрее работает с диапазоном, а мой сделан для фильтрации массива
Изменено: Jack Famous - 04.04.2022 15:14:11
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Интересно было посмотреть ваши варианты. Спасибо
Изменено: New - 04.04.2022 20:37:04
Страницы: 1
Наверх