Страницы: 1
RSS
объеденить три подпрограммы в одну
 
Друзья, столкнулся с проблемой. У меня был вопрос в котором мне помог, точнее челиком и полностью решил его Юрий М (за что ему безмерно благодарен!!!), но появилась необходимость вместо одного процесса реализовать три с разными условиями. Макрос представляет из себя сводную таблицу с двумя условиями. Есть три комании по которым нужно собирать доходы. Хочу сделать это одной подрограммой, на данный момент есть вариант с тремя подпрограммами. Может кто-нибудь вв силах помочь?  
 
Выкладываю книгу с макросами, она должна работать с неким исходным файлом. Если есть необходимость в его размещении, скажите выложу. Возможноо ПП будут понятны и без исходника.
 
Может быть так?  
Объявление коллекции убрал - она ведь там нигде не использовалось...  
 
 
Sub AllWishes()  
   Dim iFile As String, iLastRow As Long, Kod1$, Kod2$, Kod3$, LastRow As Long  
   Dim i As Long, j As Long, Arr()  
   iLastRow = Cells(Rows.Count, 2).End(xlUp).Row  
   'Range(Cells(2, 2), Cells(iLastRow + 1, 3)).ClearContents  
   With Application.FileDialog(msoFileDialogFilePicker)  
       If .Show = False Then Exit Sub  
       iFile = .SelectedItems(1)  
   End With  
   Application.ScreenUpdating = False  
   Workbooks.Open iFile  
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
   Arr = Range(Cells(3, 1), Cells(iLastRow, 12)).Value  
   ActiveWorkbook.Close False  
   iLastRow = 1  
   LastRow = Cells(Rows.Count, 11).End(xlUp).Row    'столец в котором находится значение, которое нужно извлечь из отчета  
 
   For i = 2 To LastRow  
 
       Kod1 = Cells(i, 10)  
       Kod2 = Cells(i, 11)  
       Kod3 = Cells(i, 12)  
         
       For j = LBound(Arr, 1) To UBound(Arr, 1)    'InStr(1,Arr(j, 1),"МТС")<>0  
 
           If Arr(j, 5) = Kod1 Then  
               If InStr(1, Arr(j, 1), "MTCЕ") <> 0 Then    ' второе значение в скобках, это номер столбца  
                   If InStr(1, Arr(j, 1), "потребительчастное лицо") <> 0 Then  
                       Cells(iLastRow + 1, 2) = Kod  
                       Cells(iLastRow + 1, 3) = Cells(iLastRow + 1, 3) + Arr(j, 8)  
                   End If  
               End If  
           End If  
 
           If Arr(j, 5) = Kod2 Then  
               If InStr(1, Arr(j, 1), "МОФ") <> 0 Then    ' второе значение в скобках, это номер столбца  
                   If InStr(1, Arr(j, 1), "потребительчастное лицо") <> 0 Then  
                       Cells(iLastRow + 1, 4) = Kod  
                       Cells(iLastRow + 1, 5) = Cells(iLastRow + 1, 5) + Arr(j, 8)    'второе значение после запятой, это столбец куда выводится результат  
                   End If  
               End If  
           End If  
 
           If Arr(j, 5) = Kod3 Then  
               If InStr(1, Arr(j, 1), "ЗАО") <> 0 Then    ' второе значение в скобках, это номер столбца  
                   If InStr(1, Arr(j, 1), "потребительчастное лицо") <> 0 Then  
                       Cells(iLastRow + 1, 6) = Kod  
                       Cells(iLastRow + 1, 7) = Cells(iLastRow + 1, 7) + Arr(j, 8)  
                   End If  
               End If  
           End If  
 
 
       Next  
       iLastRow = iLastRow + 1  
 
   Next  
   Application.ScreenUpdating = True  
End Sub  
 
 
Можно вместо if/then поставить select case, но особой выгоды имхо не принесёт.
 
упс, упустил - в строках  
Cells(iLastRow + 1, 4) = Kod  
тоже дописать номера кодам, т.е.  
Cells(iLastRow + 1, 4) = Kod2  
Другим аналогично.
 
{quote}{login=Hugo}{date=09.10.2011 12:43}{thema=}{post}упс, упустил - в строках  
Cells(iLastRow + 1, 4) = Kod  
тоже дописать номера кодам, т.е.  
Cells(iLastRow + 1, 4) = Kod2  
Другим аналогично.{/post}{/quote}  
 
Супер! Спасибо! Работает, но есть один момент в котором не могу разобраться. По первому условию, т.е. Kod1, нет результата по строкам далее строки 10, вроде все задано правильно, то есть пробегать до конца должен, но на 10 строке заканчивает.
 
LastRow = Cells(Rows.Count, 11).End(xlUp).Row  
тут пропишите тот столбец, где данные до конца. до последней строки.
 
{quote}{login=Hugo}{date=09.10.2011 01:12}{thema=}{post}LastRow = Cells(Rows.Count, 11).End(xlUp).Row  
тут пропишите тот столбец, где данные до конца. до последней строки.{/post}{/quote}  
 
Вы гений! Спасибо!!!
 
Или можно определить по всем трём столбцам в свою переменную, и потом взять максимум.  
Ну или ещё как-нибудь иначе... :)
 
{quote}{login=Hugo}{date=09.10.2011 01:18}{thema=}{post}Или можно определить по всем трём столбцам в свою переменную, и потом взять максимум.  
Ну или ещё как-нибудь иначе... :){/post}{/quote}  
Да, разобрался, спасибо!!!
 
Вообще можно было бы ускориться - за один проход по источнику собрать в словарь/массив данные - как уникальное брать код & "|" & вид & "|" & частник (like *вид*частн* - так можно например отобрать), и в общем уже готово - или выгружаем всех собранных, или одним проходом уже теперь по списку кодов отбираем только нужные (из словаря берём индекс массива, из массива всё остальное).
 
{quote}{login=Hugo}{date=09.10.2011 01:43}{thema=}{post}Вообще можно было бы ускориться - за один проход по источнику собрать в словарь/массив данные - как уникальное брать код & "|" & вид & "|" & частник (like *вид*частн* - так можно например отобрать), и в общем уже готово - или выгружаем всех собранных, или одним проходом уже теперь по списку кодов отбираем только нужные (из словаря берём индекс массива, из массива всё остальное).{/post}{/quote}  
 
Спасибо, но это пока для меня сложновато. Не подскажите еще момент? Мне нужно, чтобы обращение шло к определенному листу, например, это лист№2. Т.е. источник данных будет лист№2, понимаю, что должно быть что-то вроде worksheets (2), но почемуто не выходит. Его наверное еще активным надо делать. В общем проблемы у меня с корректным написанием).
 
Нужен второй лист открываемой книги?  
Тогда так попробуйте:  
 
 
   With GetObject(iFile).Sheets(2)  
       iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row  
       Arr = .Range(.Cells(3, 1), .Cells(iLastRow, 12)).Value  
       .Parent.Close False  
   End With  
 
Это вместо    
 
   Workbooks.Open iFile  
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
   Arr = Range(Cells(3, 1), Cells(iLastRow, 12)).Value  
   ActiveWorkbook.Close False
 
Кстати, да, лучше  
With GetObject(iFile).Worksheets(2)  
Вдруг там листы диаграмм или макросов впереди появятся...
 
{quote}{login=Hugo}{date=09.10.2011 12:39}{thema=}{post}Объявление коллекции убрал - она ведь там нигде не использовалось.{/post}{/quote}Налицо нарушение авторских прав.
 
и смежных... :)
 
{quote}{login=Hugo}{date=10.10.2011 06:44}{thema=}{post}Кстати, да, лучше  
With GetObject(iFile).Worksheets(2)  
Вдруг там листы диаграмм или макросов впереди появятся...{/post}{/quote}  
 
Сапасибо Вам огромное! Очень помогло!
Страницы: 1
Читают тему
Наверх