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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2012, 14:40   #1
ХочуЗнать
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 71
По умолчанию Как в существующий макрос добавить еще одно условие выборки?

ДОБРОГО ДНЯ ДРУЗЬЯ И ПОМОЩНИКИ!
Наверняка по следующему вопросу нужна отдельная тема.
помогите, плиз, добавить в условия выборки месяц и год. Которые также задаются выпадающими списками.

Последний раз редактировалось ХочуЗнать; 04.12.2012 в 14:43.
ХочуЗнать вне форума Ответить с цитированием
Старый 04.12.2012, 14:42   #2
ХочуЗнать
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 71
По умолчанию

Забыл за файл, простьите!
Вложения
Тип файла: rar Плюс одно условие для выборки.rar (10.0 Кб, 26 просмотров)
ХочуЗнать вне форума Ответить с цитированием
Старый 04.12.2012, 15:17   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Если переделать, чтоб месяцы писались числами, то работает такой код:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a(), i&, ii&, t, m As Byte, y&
    If InStr("$C$3$E$3$F$3", Target.Address) Then
        [a6].CurrentRegion.Offset(1).Clear
        t = [c3].Value: m = [e3].Value: y = [f3].Value
        a = Sheets("База").[a2].CurrentRegion.Value
        ReDim b(1 To UBound(a), 1 To 4)
        For i = 1 To UBound(a)
            If a(i, 2) = t Then
                If Year(CDate(a(i, 1))) = y Then
                    If Month(CDate(a(i, 1))) = m Then
                        ii = ii + 1
                        b(ii, 1) = ii
                        b(ii, 2) = a(i, 1)
                        b(ii, 3) = a(i, 3)
                        b(ii, 4) = a(i, 7)
                    End If
                End If
            End If
        Next
        If ii > 0 Then [a7].Resize(ii, 4) = b
    End If
End Sub
Если не переделывать - то лениво прописывать код соответствия месяцев на русском числам
Но я бы в начале кода набрал словарь январь/1 и т.д., далее извлекал число из этого словаря.
Зачем Вам месяц именно словами?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.12.2012 в 15:22.
Hugo121 вне форума Ответить с цитированием
Старый 04.12.2012, 16:06   #4
ХочуЗнать
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 71
По умолчанию

Дело в том что, если в реальном отчете в шапке будет написано, например так:
ОТЧЕТ №112
За 01 2012 года
, то єто в крайнем случае, будкт мало понятно.
ХочуЗнать вне форума Ответить с цитированием
Старый 04.12.2012, 16:58   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

так не подойдет




добавлено позже
или так:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a(), i&, ii&, t
        If Target.Address = "$C$3" Or Target.Address = "$E$3" Then
            [a6].CurrentRegion.Offset(1).Clear
            a = Sheets("Áàçà").[a2].CurrentRegion.Value
            ReDim b(1 To UBound(a), 1 To 4)
                For i = 1 To UBound(a)
                    If a(i, 2) = Cells(3, "c") And Format(a(i, 1), "MMMM YYYY") _
                        = Format(Cells(3, "e"), "MMMM YYYY") Then
                        ii = ii + 1
                        b(ii, 1) = ii
                        b(ii, 2) = a(i, 1)
                        b(ii, 3) = a(i, 3)
                        b(ii, 4) = a(i, 7)
                    End If
                Next
            If ii > 0 Then [a7].Resize(ii, 4) = b
        End If
End Sub
Вложения
Тип файла: rar Плюс одно условие для выборки 2.rar (10.3 Кб, 14 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 04.12.2012, 17:00   #6
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Если переделать, чтоб месяцы писались числами, то работает такой код:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a(), i&, ii&, t, m As Byte, y&
    If InStr("$C$3$E$3$F$3", Target.Address) Then
        [a6].CurrentRegion.Offset(1).Clear
        t = [c3].Value: m = [e3].Value: y = [f3].Value
        a = Sheets("База").[a2].CurrentRegion.Value
        ReDim b(1 To UBound(a), 1 To 4)
        For i = 1 To UBound(a)
            If a(i, 2) = t Then
                If Year(CDate(a(i, 1))) = y Then
                    If Month(CDate(a(i, 1))) = m Then
                        ii = ii + 1
                        b(ii, 1) = ii
                        b(ii, 2) = a(i, 1)
                        b(ii, 3) = a(i, 3)
                        b(ii, 4) = a(i, 7)
                    End If
                End If
            End If
        Next
        If ii > 0 Then [a7].Resize(ii, 4) = b
    End If
End Sub
Если не переделывать - то лениво прописывать код соответствия месяцев на русском числам
Но я бы в начале кода набрал словарь январь/1 и т.д., далее извлекал число из этого словаря.
Зачем Вам месяц именно словами?
Если не сложно, скиньте пример со словарем ))))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 04.12.2012, 17:27   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Уж столько было этих словарей...
Но повторение - мать учения

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a(), i&, ii&, t, m As String, y&

    If InStr("$C$3$E$3$F$3", Target.Address) Then
        [a6].CurrentRegion.Offset(1).Clear

        With CreateObject("scripting.dictionary")
            .Item("январь") = 1
            .Item("февраль") = 2
            .Item("март") = 3
            .Item("апрель") = 4
            .Item("май") = 5
            .Item("июнь") = 6

            t = [c3].Value: m = [e3].Value: y = [f3].Value
            a = Sheets("База").[a2].CurrentRegion.Value
            ReDim b(1 To UBound(a), 1 To 4)

            For i = 1 To UBound(a)
                If a(i, 2) = t Then
                    If Year(CDate(a(i, 1))) = y Then
                        If Month(CDate(a(i, 1))) = .Item(m) Then
                            ii = ii + 1
                            b(ii, 1) = ii
                            b(ii, 2) = a(i, 1)
                            b(ii, 3) = a(i, 3)
                            b(ii, 4) = a(i, 7)
                        End If
                    End If
                End If
            Next

        End With

        If ii > 0 Then [a7].Resize(ii, 4) = b
    End If
End Sub
Внимание - там в оригинале "апреь"!
Я исправил у себя и на листе, и в коде
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 04.12.2012, 18:18   #8
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Уж столько было этих словарей...
Но повторение - мать учения

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a(), i&, ii&, t, m As String, y&

    If InStr("$C$3$E$3$F$3", Target.Address) Then
        [a6].CurrentRegion.Offset(1).Clear

        With CreateObject("scripting.dictionary")
            .Item("январь") = 1
            .Item("февраль") = 2
            .Item("март") = 3
            .Item("апрель") = 4
            .Item("май") = 5
            .Item("июнь") = 6

            t = [c3].Value: m = [e3].Value: y = [f3].Value
            a = Sheets("База").[a2].CurrentRegion.Value
            ReDim b(1 To UBound(a), 1 To 4)

            For i = 1 To UBound(a)
                If a(i, 2) = t Then
                    If Year(CDate(a(i, 1))) = y Then
                        If Month(CDate(a(i, 1))) = .Item(m) Then
                            ii = ii + 1
                            b(ii, 1) = ii
                            b(ii, 2) = a(i, 1)
                            b(ii, 3) = a(i, 3)
                            b(ii, 4) = a(i, 7)
                        End If
                    End If
                End If
            Next

        End With

        If ii > 0 Then [a7].Resize(ii, 4) = b
    End If
End Sub
Внимание - там в оригинале "апреь"!
Я исправил у себя и на листе, и в коде

спасибо огромное
Код:
Hugo121
Будем дальше изучать и пытаться понять массивы и словари
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 04.12.2012, 18:18   #9
ХочуЗнать
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 71
По умолчанию

Hugo121!
СПАСИБО, СПАСИБО и СПАСИБО БОЛЬШОЕ!
Все работает.
Прикрепляю вариант на украинском. Может кому сгодится.

И скажите мне пожалуйста, чтобы успешно писать макросы самому, надо все эти конструкции заучивать на изусть? Или как?
Вложения
Тип файла: rar Плюс одно условие для выборки на укр.rar (12.1 Кб, 23 просмотров)
ХочуЗнать вне форума Ответить с цитированием
Старый 04.12.2012, 19:09   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я что-то начал помнить полностью наизусть только через пару лет активной помощи на форумах. Да и то меньше половины используемого. Да и то потому, что много помогал - для себя уже давно ничего писать не нужно.
Зазубривать нет смысла - достаточно иметь подборку примеров макросов, и знать ключевые слова, по которым можно в этой подборке искать.
Далее находим макрос, примерно делающий нужное, и изменяем (ну или из пары-тройки макросов комбинируем).
Что-то подсказывает редактор, что-то можно оперативно в хелпе найти.
Но конечно каждый макрос нужно полностью "читать", знать что где и как делается.
И главное - нужно уже иметь в голове готовый алгоритм, под который подбирать/писать код.
А алгоритм придумывается на основе тех приёмов и инструментов, которые уже знаешь.
Вот как здесь - можно копировать данные из листа в лист, перебирая cells, каждый раз увеличивая индекс. И вполне будет работать.
Но это дольше работает и много букв кода.
Быстрее и компактнее создать массив данных и массив для результатов, затем в цикле переложить нужное, выгрузить на лист.
Ещё вариант - использовать фильтр диапазона по двум столбцам. Но перебор массивов проще и надёжнее.
С номером месяца тоже есть другой путь - можно каждый раз перебирать массив названий, определяя его номер, или использовать в коде VLOOKUP/ВПР на виртуальном массиве или на данных с листа.
Но с словарём думаю проще.

Макрос в этой теме написан правда без использования "подборки макросов". Да тут и писать нечего - десяток простых строк...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить файл уже в существующий архив (SevenZipVCL) DarkHacker Компоненты Delphi 1 01.11.2011 23:14
куда вставить еще одно условие?С++ Guzal Помощь студентам 6 27.02.2011 22:05
Как к условию, добавить еще условие valerij Microsoft Office Excel 8 22.10.2010 21:59
Добавить условие в макрос Pilot Microsoft Office Excel 8 20.02.2010 17:35
Одно поле StringField в DataView в Rave. Как добавить еще? Leser Помощь студентам 1 06.10.2008 15:00