Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 09:12   #21
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

По трём.
И фильтрация в процессе.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2012, 19:16   #22
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

Hugo121, спасибо, вы как всегда на высоте

Появился новый вопрос: как изменить код из поста 18, чтобы добавить условие для нескольких груп (к примеру для НД_31), чтоб выборка копировалась в столбец [P3] ?

Цитата:
If a(i, 2) = "Дипл.Пр. Керівництво" Then
If a(i, 17) > 20 Then
If a(i, 24) = "НД_31" Then
у меня на выходе всё копируется в один столбец M3.

Последний раз редактировалось Automat; 17.04.2012 в 19:36.
Automat вне форума Ответить с цитированием
Старый 17.04.2012, 20:20   #23
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Так выгрузка вот тут:
Код:
Sheets("Викладачі").[M3].Resize(ii, 2) = b
Думаю, если Вы хотите сразу отбирать несколько групп, то нужно сразу завести не один массив b, а несколько аналогичных, каждому свою переменную-счётчик, раскладывать данные по ним параллельно, затем выгружать каждую группу в свой диапазон. Сейчас попробую...
Упс, а тестить то опять не на чем...

Код:
Option Explicit

Sub Выборка_вариант3()
    Dim a(), i&, ii&, iii&, t&

    a = Sheets("Звіт").[A1].CurrentRegion.Value
    ReDim b(1 To UBound(a), 1 To 2)
    ReDim bb(1 To UBound(a), 1 To 2)

    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            If a(i, 2) = "Дипл.Пр. Керівництво" Then
                If a(i, 17) > 20 Then

                    If a(i, 24) = "СІ_51" Then
                        If Not .Exists(a(i, 27)) Then
                            ii = ii + 1
                            .Item(a(i, 27)) = ii
                            b(ii, 1) = a(i, 27)
                            b(ii, 2) = a(i, 6)
                        Else
                            t = .Item(a(i, 27))
                            b(t, 2) = b(t, 2) + a(i, 6)
                        End If
                    End If

                    If a(i, 24) = "НД_31" Then
                        If Not .Exists(a(i, 27)) Then
                            iii = iii + 1
                            .Item(a(i, 27)) = iii
                            bb(iii, 1) = a(i, 27)
                            bb(iii, 2) = a(i, 6)
                        Else
                            t = .Item(a(i, 27))
                            bb(t, 2) = bb(t, 2) + a(i, 6)
                        End If
                    End If

                End If
            End If
        Next
    End With

    With Sheets("Викладачі")
        .[M3].Resize(ii, 2) = b
        .[P3].Resize(iii, 2) = bb
    End With

End Sub
Можно вероятно код чуть упростить/сократить, например используя Select Case и одну подпрограмму по заполнению массивов, но так должно быть понятнее, что происходит - отбираем по двум условиям, а по третьему (в зависимости от a(i, 24) ) смотрим, в какой массив помещать данные.
Но вслепую - так что если что не так, то говорите.
P.S. Возможно, нужно для каждой группы делать свой словарь - это если возможны одинаковые фамилии в разных группах.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.04.2012 в 21:32.
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2012, 21:01   #24
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

протестил, спасибо !

Последний раз редактировалось Automat; 17.04.2012 в 22:05.
Automat вне форума Ответить с цитированием
Старый 17.04.2012, 21:34   #25
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Попробовал - не ругалось.
Но две b забыл - заменил код выше (чтоб не плодить уродов...)
Правда, по второй группе вытягивает только
_Лісова 2
Не понял, правильно или нет - уж больно данных много... Но вроде правильно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2012, 21:47   #26
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но вроде правильно.
по первой групе всё ровно, а по второй както неправильно выбирает , должно быть как минимум 8 значений
Automat вне форума Ответить с цитированием
Старый 17.04.2012, 21:47   #27
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

8 значений? Какие строки?
Сам нашёл - я ведь говорил, что если фамилии дублируются, то нужно 2 словаря..

Вот с внешней процедурой (и уже с двумя словарями):
Код:
Sub Выборка_вариант3Prim()
    Dim a(), i&, ii&, iii&, oDict1, oDict2

    a = Sheets("Звіт").[A1].CurrentRegion.Value
    
    ReDim b(1 To UBound(a), 1 To 2)
    ReDim bb(1 To UBound(a), 1 To 2)

    Set oDict1 = CreateObject("Scripting.Dictionary")
    Set oDict2 = CreateObject("Scripting.Dictionary")
    
    For i = 1 To UBound(a)
        If a(i, 2) = "Дипл.Пр. Керівництво" Then
            If a(i, 17) > 20 Then

                Select Case a(i, 24)
                Case "СІ_51": toArr oDict1, b, a(i, 27), a(i, 6), ii
                Case "НД_31": toArr oDict2, bb, a(i, 27), a(i, 6), iii
                End Select

            End If
        End If
    Next

    With Sheets("Викладачі")
       If i > 0 Then .[M3].Resize(ii, 2) = b
       If ii > 0 Then .[P3].Resize(iii, 2) = bb
    End With

End Sub


Private Sub toArr(dd, arr, val_1, val_2, i)
    Dim t&
    If Not dd.Exists(val_1) Then
        i = i + 1
        dd.Item(val_1) = i
        arr(i, 1) = val_1
        arr(i, 2) = val_2
    Else
        t = dd.Item(val_1)
        arr(t, 2) = arr(t, 2) + val_2
    End If

End Sub
Теперь можно легко наращивать условия отбора по третьему параметру - только добавить массивы, словари и переменные, и одну строку условия.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 18.04.2012 в 09:07. Причина: Добавил If i > 0 Then
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм. iamhated Помощь студентам 1 15.01.2012 16:24
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
создание программы в VBA, реализующей алгоритм получения произведения ряда чисел Mescaline Помощь студентам 0 23.12.2011 23:16
составить программу и алгоритм на языке vba! Маришка бирюкова Microsoft Office Excel 6 19.12.2010 21:56
Как алгоритм перевести в код VBA valerij Microsoft Office Excel 18 29.05.2008 01:32