Страницы: 1
RSS
Добавление строк в массив
 
Добрый день,подскажите как решить. Нахожу индексы нужных строк из массива, хотелось бы в конце цикла добавлять строку по определенному индексу в конец нового массива(заранее создавая пустой массив) и возвращать в конце массив функцией.
Вопрос: как добавить строку в конец массива?
 
Код
ReDim Preserve
Соблюдение правил форума не освобождает от модераторского произвола
 
Как вариант, словарь строк. Ключ - количество элементов словаря.
Код
dim d as Object
Set d = CreateObject("Scripting.Dictionary")
d.Item(d.Count) = s1
d.Item(d.Count) = s2
...
 
buchlotnik, что-то я не понял. ReDim Preserve только изменяет размер массива сохраняя значения "до". Только как в него добавить строку, если вписать всего нужно две размерности, а мне известа только 1. Я не вкурсе можно ли задавать значения в массив только по одному измерению, ровно как и не могу вывести информацию со всей строки,

+https://excelpedia.ru/makrosi-v-excel/massivi-v-vba   здесь сказанно что изменять можно только правое измерение массива

МатросНаЗебре, спасибо, изучу.
Изменено: Argo9 - 18.02.2020 18:26:42
 
Цитата
Argo9 написал:
ReDim Preserve только изменяет размер массива сохраняя значения "до"
и для чего она это делает? :)
Код
Dim arr()
dim lcnt& 'счетчик элементов массива
'цикл по строкам
for lr = 1 to 10
'для примера записываем в массив только нечетные строки
if lr mod 2 then
redim preserve arr(lcnt)
arr(lcnt) = lr
'увеличиваем счетчик, чтобы потом расширить на него массив
lcnt = lcnt + 1
end if
next
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, это же будет работать для двумерных массивов? Моя проблема в том, что я просто не понимаю как указать только одно измерение, ведь программа ожидает два.
 
Я вообще понял только последнее предложение первого поста :)
Предлагаю такой вариант - сперва собрать всё в коллекцию без ключей, затем в финале создать массив нужного размера и переложить, раз уж
Цитата
Argo9 написал:
ведь программа ожидает два
 
Цитата
Argo9 написал:
я просто не понимаю как указать только одно измерение, ведь программа ожидает два
чья? Какая? ГДЕ? Вот эта точно не ожидает более одной размерности:
Цитата
Argo9 написал:
возвращать в конце массив функцией
Сколько зададите, столько и вернет. И зачем две, если нужны только номера строк?
Вы может задачу нормально опишите для начала? И с примером желательно. Сидеть и гадать что Вам там придумалось не хочется.
Изменено: Дмитрий(The_Prist) Щербаков - 18.02.2020 18:47:29
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, нужно всю строку с этим индексом записывать, не только ее индекс, а всю строку под этим индексом в новый массив.

извиняюсь что так не ясно. Просто мне казалось что это легко сделать, как в Python.
Изменено: Argo9 - 18.02.2020 18:57:11
 
Задача так и не понятна, но я её вижу например так -
- идёт отбор строк по какому-то массиву, циклом
- нужно получить новый массив с этими строками.
Я предлагаю сперва создать коллекцию отобранных индексов
затем создать массив нужного размера
циклом по коллекции наполнить новый массив.
Или как вариант - сразу всё собрать в коллекцию, затем переложить в массив. Ну это я уже повторяюсь...
Изменено: Hugo - 18.02.2020 19:02:03
 
Hugo,
Код
Sub Delete_Rows()

Dim Prom_arr(), ActiveDeals_arr(), nesw_arr() As Variant
Dim arr()
Dim lcnt& 'счетчик элементов массива

Prom_arr = ThisWorkbook.ActiveSheet.Range("A1").CurrentRegion.Value
close_deals = Workbooks("Отчет.xlsm").Sheets(1).Range("A1").CurrentRegion.Value


Z = "06.Закрыта/Заключена"

For lr = UBound(close_deals, 1) To LBound(close_deals, 1) Step -1
    If Z = close_deals(lr, 14) Then
    x = close_deals(lr, 8)
    ff = False
        For lrr = UBound(Prom_arr, 1) To LBound(Prom_arr, 1) Step -1
            If x = Prom_arr(lrr, 28) Then
           ff = True
            Exit For
            End If
        Next lrr
    
    If Not ff Then
'тут надо добавлять строки из диапазона выше(по найднным индексам) в массив.  
    End If
    
End If
Next lr

End Sub



надеюсь внесет ясность. Мне сами индексы не нужны как-бы, лишь итоговый диапазон, он получает строк 5 максимум. Файлы загрузить не могу, дома попробую, фаервол не разрешает.
Изменено: Argo9 - 18.02.2020 19:08:49
 
Ещё как вариант - сразу создать массив размером с исходный, и перекладывать в него увеличивая индекс.
Затем в конце переложить, ну или использовать только собранное, если лишний пустой хвост память не напрягает.
 
Наверное, можно так сделать:
Код
Sub Delete_Rows()
    Dim Prom_arr(), ActiveDeals_arr(), nesw_arr() As Variant
    Dim arr()
    Dim lcnt& 'счетчик элементов массива
     
    Prom_arr = ThisWorkbook.ActiveSheet.Range("A1").CurrentRegion.Value
    close_deals = Workbooks("Отчет.xlsm").Sheets(1).Range("A1").CurrentRegion.Value
     
     
    Z = "06.Закрыта/Заключена"
     
    For lr = UBound(close_deals, 1) To LBound(close_deals, 1) Step -1
        If Z = close_deals(lr, 14) Then
        x = close_deals(lr, 8)
        ff = False
            For lrr = UBound(Prom_arr, 1) To LBound(Prom_arr, 1) Step -1
                If x = Prom_arr(lrr, 28) Then
               ff = True
                Exit For
                End If
            Next lrr
         
        If Not ff Then
            ReDim Preserve arr(lcnt)
            arr(lcnt) = lr
            'увеличиваем счетчик, чтобы потом расширить на него массив
            lcnt = lcnt + 1
        End If
         
    End If
    Next lr
    'есть что записывать в итоговый массив
    If lcnt > 0 Then
        Dim lc&, lcols_cnt&
        lcols_cnt = 5 'для примера запишем только 5 столбцов(ибо фиг знает сколько их у Вас)
        'массив, с кол-вом отобранных строк и 5-ю столбцами
        ReDim ares(1 To lcnt, 1 To lcols_cnt)
        'заносим данные в итоговый массив ares
        For lr = LBound(arr) To UBound(arr)
            For lc = 1 To lcols_cnt
                ares(lr + 1, lc) = Prom_arr(arr(lr), lc)
            Next
        Next
    End If
End Sub

хоть и по прежнему неясно что потом с этим массивом делать. И почему цикл с конца идет тоже малопонятно - мы ж ничего не удаляем в цикле.
Изменено: Дмитрий(The_Prist) Щербаков - 18.02.2020 19:35:11
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх