Страницы: 1
RSS
Повторное использование строк кода
 
Доброго времени суток, уважаемые форумчане. Хотелось бы узнать ответ на чисто теоретический вопрос. Итак, ситуация такая: имеется наполненный словарь с данными и значение переменной, начинаем наполнять итоговый массив:                  
Код
Arr_Mem = Array("аренда", "коммерческий") 'первоначальное значение переменной 

ReDim Arr_data(1 To dicData.Count, 1 To 7) 'формирование итогового массива
      For Each k In dicData.keys
          If IsNumeric(Application.Match(dicData.keys()(1), Arr_Mem, 0)) Then
             j = j + 1
             Arr_data(j, 1) = ...
             Arr_data(j, 2) = ...
             ...
          end if
      next k
       .Cells(4, 1).Resize(UBound(Arr_data), 6).Value = Arr_data 'выгрузка
       Arr_Mem = Array("сторонний", "аренда (к)") 'изменение значения переменной                
далее необходимо заново сформировать и выгрузить массив Arr_data, но для отбора данных использовать новое значение переменной Arr_Mem. Сейчас это организовано повтором кода, но ведь код ПОЛНОСТЬЮ идентичен. Отсюда вопрос, можно ли каким-либо образом использовать этот код повторно. Я додумался только до применения оператора GoTo (сразу после изменения Arr_Mem, ну и метку в соответствующее место выставить), но я многократно видел на форумах негативное отношение к этому оператору и хотелось бы узнать можно ли и как ,решить такой вопрос иначе.
Заранее спасибо всем откликнувшимся
 
вынести в функцию или процедуру
 
решили перестать генерировать код и заняться программированием? похвально
Код
...
ad = ArrData(Array("аренда", "коммерческий"), dicData)
.Cells(4, 1).Resize(UBound(ad), 6).Value = Ad
ad = ArrData(Array("сторонний", "аренда (к)"), dicData)
...

' добавьте в модуль функцию
Function ArrData(Arr_Mem, d)
  dim arr_data, j&, i&
  ReDim Arr_data(1 To d.Count, 1 To 7) 'формирование итогового массива      
  for i = lbound(arr_Mem) to ubound(arr_Mem)
    If d.Exists(Arr_Mem(i)) Then
       j = j + 1
       Arr_data(j, 1) = ...
       Arr_data(j, 2) = ...
             ...
    end if
   next
  arrData = Arr_Data
end function
кстати, dicData в переводе с английского "х...евые данные"
Изменено: Ігор Гончаренко - 05.03.2021 14:17:02
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, Ігор Гончаренко за пример, попробую прикрутить к реалу
 
Цитата
OlegO: попробую прикрутить к реалу
лучше создайте тему по задаче - сделаем лучше  ;)
P.S:
Цитата
Ігор Гончаренко: dicData в переводе с английского "х...евые данные"
шутка на поверхности, однако кому-то пора подтянуть английский))
Изменено: Jack Famous - 05.03.2021 18:00:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
да, конечно, не в переводе, а созвучно (я неудачно выразился)
а английский мне не подтягивать нужно, нужно как-то начать осваивать азы((
Изменено: Ігор Гончаренко - 05.03.2021 18:14:09
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Доброго времени суток, уважаемые гуру. Решил все-таки попробовать добить возможный вариант с функциями, вариант с GoTo, кстати получился (потребовалось всего 3 перехода), а вот с вариантом от Игоря пока неудача. Объясните, пожалуйста, следующее: вот есть у меня в коде цикл на отбор данных в словарь:
Код
For i = 1 To UBound(x)
    If IsNumeric(Application.Match(x(i, 5), Arr_Mem, 0)) Then 'принадлежность объекта
        If x(i, 5) <> "аренда (к)" And x(i, 5) <> "коммерческий" Then INA_e = Application.VLookup(x(i, 1), [Tenants_dir], [INA_dir].Column, 0)
            key = Join(Array(x(i, 1), x(i, 2), INA_e, x(i, 3), x(i, 4), x(i, 5), x(i, 8), "|")
            If x(i, 6) = 1 Then 'вариант подсчета по данным счетчика
                If Not IsEmpty(x(i, 10)) Or x(i, 5) = "аренда (к)" Then
                    If InStr(x(i, 10), "\") = 0 Then  'если в текущем месяце нет признака нового объекта
                        If InStr(x(i, 9), "\") = 0 Then 'если в предыдущем месяце нет признака нового объекта
                            dicData.Add key, x(i, 10) & "|" & x(i, 9)
                        Else: dicData.Add key, x(i, 10) & "|" & Split(x(i, 9), "\")(1)
                        End If
                    Else: dicData.Add key, Split(x(i, 10), "\")(1) & "|" & Split(x(i, 10), "\")(0)
                    End If
                End If
            ElseIf x(i, 6) = 2 Then 'вариант подсчета по разнице
            ...
            ElseIf x(i, 6) = 3 Then 'вариант подсчета по площади
            ...
        End If
    End If
Next i
массив х к этому моменту уже наполнен, значения Arr_Mem и INA_e  известны. Как я понял предложение от Ігор Гончаренко, я должен "обернуть" этот цикл в Function, поместив конструкцию в отдельный модуль и придумав имя:
Код
Function Fil_dic(Arr_Mem, d)
For i = 1 To UBound(x)
    If IsNumeric(Application.Match(x(i, 5), Arr_Mem, 0)) Then 'принадлежность объекта
        If x(i, 5) <> "аренда (к)" And x(i, 5) <> "коммерческий" Then INA_e = Application.VLookup(x(i, 1), [Tenants_dir], [INA_dir].Column, 0)
            key = Join(Array(x(i, 1), x(i, 2), INA_e, x(i, 3), x(i, 4), x(i, 5), x(i, 8), "|")
            If x(i, 6) = 1 Then 'вариант подсчета по данным счетчика
...
end function

а затем вызвать эту функцию в нужном месте

Код
ad = Fil_dic(Arr_Mem)

но у меня код останавливается на этой строке с ошибкой Argument not optional. Я понимаю, что коду не хватает аргументов, но каких и как и где их следует описать? И вообще, я правильно рассуждаю?

 
Код
d в объявлении функции это наполняемый словарь.
Изменено: МатросНаЗебре - 09.03.2021 10:19:35
 
До меня пока вот что дошло, все что мы запишем в скобках после имени функции, те аргументы она и сможет использовать, правильно?
 
не только сможет но и будет ТРЕБОВАТЬ наличия этих аргументов при КАЖДОМ вызове (обращении к) функции
и d  в моей функции это уже сформированный в пердыдущем коде (наполненый) словарь
Изменено: Ігор Гончаренко - 09.03.2021 11:47:44
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Да, я так и понял. Смог я доделать и этот вариант, но вот вариант с GoTo на мой сугубо личный взгляд, получился более "читабельный", хотя спасибо, за показанный способ с функциями хотелось бы сказать не меньшее.
Страницы: 1
Наверх