Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Вывод отчета по дате с нескольких листов. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вывод отчета по дате с нескольких листов. (Макросы/Sub)
Вывод отчета по дате с нескольких листов.
koyaanisqatsi Дата: Суббота, 16.04.2016, 02:24 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте.

Есть желание выводить отчет по выбираемой дате с трех листов. В чем я вижу проблему что обозначить начало собираемой информации достаточно легко по столбцу А достаточно сравнить дату. Но как найти конец - маркером которого может выступать наверно следующий за ним маркер иной даты.

Что бы вы могли посоветовать это ближе к VBA, сводной таблице, или формулами ?

Собирать хочется со страниц: Овощи Мясо Бакалея.
Выводить на страницу: Отчет.

Пользователь: 444
Администратор: 555
К сообщению приложен файл: 10.xlsb (47.8 Kb)


Сообщение отредактировал koyaanisqatsi - Суббота, 16.04.2016, 02:40
 
Ответить
СообщениеЗдравствуйте.

Есть желание выводить отчет по выбираемой дате с трех листов. В чем я вижу проблему что обозначить начало собираемой информации достаточно легко по столбцу А достаточно сравнить дату. Но как найти конец - маркером которого может выступать наверно следующий за ним маркер иной даты.

Что бы вы могли посоветовать это ближе к VBA, сводной таблице, или формулами ?

Собирать хочется со страниц: Овощи Мясо Бакалея.
Выводить на страницу: Отчет.

Пользователь: 444
Администратор: 555

Автор - koyaanisqatsi
Дата добавления - 16.04.2016 в 02:24
Manyasha Дата: Суббота, 16.04.2016, 13:32 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
koyaanisqatsi, посмотрите такой макрос:
[vba]
Код
Sub report()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim datReport As Date, aDat As Range, lr&, lra As Range, sh
    With ThisWorkbook
        With .Sheets("Отчет")
            datReport = .Range("m2")
            .Range("a2:i" & .Cells(Rows.Count, 2).End(xlUp).Row + 1).ClearContents
        End With
        For Each sh In Array(.Sheets(2), .Sheets(3), .Sheets(4))
            Set aDat = sh.Columns(1).Find(datReport, , xlFormulas, xlWhole)
            If Not aDat Is Nothing Then
                Set lra = sh.Cells(Rows.Count, 1).End(xlUp)
                If aDat.Row = lra.Row Then
                    lr = sh.Cells(Rows.Count, 2).End(xlUp).Row
                Else
                    lr = sh.Range(aDat.Offset(1), lra).Find("*", , xlFormulas, xlWhole, xlByRows).Row - 1
                End If
                sh.Range(aDat, "i" & lr).Copy .Sheets("Отчет").Range("a" & .Sheets("Отчет").Cells(Rows.Count, 2).End(xlUp).Row + 1)
            End If
        Next sh
        On Error Resume Next
        .Sheets("Отчет").ClearComments
    End With
    Application.EnableEvents = True
End Sub
[/vba]
Хотя, мне кажется, что удобнее и красивее, когда дата вписана напротив каждой строки с данными (смотрите 2-й файл).
К сообщению приложен файл: 10-1.xlsb (52.9 Kb) · 10-2.xlsb (50.9 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеkoyaanisqatsi, посмотрите такой макрос:
[vba]
Код
Sub report()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim datReport As Date, aDat As Range, lr&, lra As Range, sh
    With ThisWorkbook
        With .Sheets("Отчет")
            datReport = .Range("m2")
            .Range("a2:i" & .Cells(Rows.Count, 2).End(xlUp).Row + 1).ClearContents
        End With
        For Each sh In Array(.Sheets(2), .Sheets(3), .Sheets(4))
            Set aDat = sh.Columns(1).Find(datReport, , xlFormulas, xlWhole)
            If Not aDat Is Nothing Then
                Set lra = sh.Cells(Rows.Count, 1).End(xlUp)
                If aDat.Row = lra.Row Then
                    lr = sh.Cells(Rows.Count, 2).End(xlUp).Row
                Else
                    lr = sh.Range(aDat.Offset(1), lra).Find("*", , xlFormulas, xlWhole, xlByRows).Row - 1
                End If
                sh.Range(aDat, "i" & lr).Copy .Sheets("Отчет").Range("a" & .Sheets("Отчет").Cells(Rows.Count, 2).End(xlUp).Row + 1)
            End If
        Next sh
        On Error Resume Next
        .Sheets("Отчет").ClearComments
    End With
    Application.EnableEvents = True
End Sub
[/vba]
Хотя, мне кажется, что удобнее и красивее, когда дата вписана напротив каждой строки с данными (смотрите 2-й файл).

Автор - Manyasha
Дата добавления - 16.04.2016 в 13:32
StoTisteg Дата: Суббота, 16.04.2016, 13:34 | Сообщение № 3
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
А нельзя ли нормальный пример, в котором эти самые листы видны и об их содержании можно не только догадываться?
[moder]Введите пароль:
Цитата
Пользователь: 444
Администратор: 555
[/moder]


Интуитивно понятный код - это когда интуитивно понятно, что это код.

Сообщение отредактировал Manyasha - Суббота, 16.04.2016, 13:42
 
Ответить
СообщениеА нельзя ли нормальный пример, в котором эти самые листы видны и об их содержании можно не только догадываться?
[moder]Введите пароль:
Цитата
Пользователь: 444
Администратор: 555
[/moder]

Автор - StoTisteg
Дата добавления - 16.04.2016 в 13:34
koyaanisqatsi Дата: Суббота, 16.04.2016, 14:29 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha, То что есть два варианта думаю это скорее хорошо. Под свои задачи кажется предпочтительнее первый вариант. Хочу минимализировать информацию на которую можно отвлечся и сконцентрировать на конкретных данных которые обязательны для ознакомления и выполнения. Смысла особого в отчете писать для каждой строки одну и ту же дату особого не вижу немного будет отвлекать при восприятии информации. В ту же очередь первый вариант хотя бы косвенно разграничивает принадлежность к складу информации. Отчетного слова то нет к какому складу относится ну да и ладно зато видно что снова появилась дата и видно что товар уже другой дума человеку легко будет догадаться где искать информацию которая относится непосредственно к его торговому направлению.
А так Очень здорово. Первый вариант думаю более чем устроит. Как первый шаг для систематизации потока информации дума более чем ! Огромное спасибо.
 
Ответить
СообщениеManyasha, То что есть два варианта думаю это скорее хорошо. Под свои задачи кажется предпочтительнее первый вариант. Хочу минимализировать информацию на которую можно отвлечся и сконцентрировать на конкретных данных которые обязательны для ознакомления и выполнения. Смысла особого в отчете писать для каждой строки одну и ту же дату особого не вижу немного будет отвлекать при восприятии информации. В ту же очередь первый вариант хотя бы косвенно разграничивает принадлежность к складу информации. Отчетного слова то нет к какому складу относится ну да и ладно зато видно что снова появилась дата и видно что товар уже другой дума человеку легко будет догадаться где искать информацию которая относится непосредственно к его торговому направлению.
А так Очень здорово. Первый вариант думаю более чем устроит. Как первый шаг для систематизации потока информации дума более чем ! Огромное спасибо.

Автор - koyaanisqatsi
Дата добавления - 16.04.2016 в 14:29
koyaanisqatsi Дата: Пятница, 22.04.2016, 12:58 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha, Нашел интересный эффект этого макроса. Если Дата стоит а ниже ничего не написано он идет вверх до следующей даты.

выглядеть это будет примерно так:

огурцы 2 кг и тд

17.04.2016
К сообщению приложен файл: _15.xlsb (81.8 Kb)


Сообщение отредактировал koyaanisqatsi - Пятница, 22.04.2016, 12:59
 
Ответить
СообщениеManyasha, Нашел интересный эффект этого макроса. Если Дата стоит а ниже ничего не написано он идет вверх до следующей даты.

выглядеть это будет примерно так:

огурцы 2 кг и тд

17.04.2016

Автор - koyaanisqatsi
Дата добавления - 22.04.2016 в 12:58
Manyasha Дата: Пятница, 22.04.2016, 13:27 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
koyaanisqatsi, поправила:
[vba]
Код
Sub report()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim datReport As Date, aDat As Range, lr&, lra As Range, sh
    With ThisWorkbook
        With .Sheets("Отчет")
            datReport = .Range("m2")
            'Изменила здесь
            .Range("a2:l" & .UsedRange.Rows.Count + 1).ClearContents
        End With
        For Each sh In Array(.Sheets(2), .Sheets(3), .Sheets(4))
            Set aDat = sh.Columns(1).Find(datReport, , xlFormulas, xlWhole)
            If Not aDat Is Nothing Then
                Set lra = sh.Cells(Rows.Count, 1).End(xlUp)
                If aDat.Row = lra.Row Then
                'Изменила здесь
                    lr = .Sheets("Отчет").UsedRange.Rows.Count + .Sheets("Отчет").UsedRange.Row
                Else
                    lr = sh.Range(aDat.Offset(1), lra).Find("*", , xlFormulas, xlWhole, xlByRows).Row - 1
                End If
                sh.Range(aDat, "l" & lr).Copy .Sheets("Отчет").Range("a" & .Sheets("Отчет").Cells(Rows.Count, 2).End(xlUp).Row + 1)
            End If
        Next sh
        On Error Resume Next
        'Изменила здесь
        .Sheets("Отчет").UsedRange.ClearComments
    End With
    Application.EnableEvents = True
End Sub
[/vba]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеkoyaanisqatsi, поправила:
[vba]
Код
Sub report()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim datReport As Date, aDat As Range, lr&, lra As Range, sh
    With ThisWorkbook
        With .Sheets("Отчет")
            datReport = .Range("m2")
            'Изменила здесь
            .Range("a2:l" & .UsedRange.Rows.Count + 1).ClearContents
        End With
        For Each sh In Array(.Sheets(2), .Sheets(3), .Sheets(4))
            Set aDat = sh.Columns(1).Find(datReport, , xlFormulas, xlWhole)
            If Not aDat Is Nothing Then
                Set lra = sh.Cells(Rows.Count, 1).End(xlUp)
                If aDat.Row = lra.Row Then
                'Изменила здесь
                    lr = .Sheets("Отчет").UsedRange.Rows.Count + .Sheets("Отчет").UsedRange.Row
                Else
                    lr = sh.Range(aDat.Offset(1), lra).Find("*", , xlFormulas, xlWhole, xlByRows).Row - 1
                End If
                sh.Range(aDat, "l" & lr).Copy .Sheets("Отчет").Range("a" & .Sheets("Отчет").Cells(Rows.Count, 2).End(xlUp).Row + 1)
            End If
        Next sh
        On Error Resume Next
        'Изменила здесь
        .Sheets("Отчет").UsedRange.ClearComments
    End With
    Application.EnableEvents = True
End Sub
[/vba]

Автор - Manyasha
Дата добавления - 22.04.2016 в 13:27
koyaanisqatsi Дата: Пятница, 22.04.2016, 16:20 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha, Опять что то происходит удивительное.
Вывожу отчет на 19.04.2016 и он цепляет два числа 17.04.2016 и 19.04.2016 но за 19 не выводит данные (
К сообщению приложен файл: _16.xlsb (76.0 Kb)
 
Ответить
СообщениеManyasha, Опять что то происходит удивительное.
Вывожу отчет на 19.04.2016 и он цепляет два числа 17.04.2016 и 19.04.2016 но за 19 не выводит данные (

Автор - koyaanisqatsi
Дата добавления - 22.04.2016 в 16:20
Manyasha Дата: Пятница, 22.04.2016, 16:50 | Сообщение № 8
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
ну да, я же не на том листе последнюю строку ищу))
Вместо Sheets("Отчет") напишите sh:
[vba]
Код
                If aDat.Row = lra.Row Then
                'Изменила здесь
                    lr = sh.UsedRange.Rows.Count + .Sheets("Отчет").UsedRange.Row
[/vba]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениену да, я же не на том листе последнюю строку ищу))
Вместо Sheets("Отчет") напишите sh:
[vba]
Код
                If aDat.Row = lra.Row Then
                'Изменила здесь
                    lr = sh.UsedRange.Rows.Count + .Sheets("Отчет").UsedRange.Row
[/vba]

Автор - Manyasha
Дата добавления - 22.04.2016 в 16:50
koyaanisqatsi Дата: Пятница, 22.04.2016, 16:56 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha, Вот Теперь вроде все красиво ) Благодарю.
 
Ответить
СообщениеManyasha, Вот Теперь вроде все красиво ) Благодарю.

Автор - koyaanisqatsi
Дата добавления - 22.04.2016 в 16:56
koyaanisqatsi Дата: Суббота, 30.04.2016, 15:55 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 713
Репутация: 15 ±
Замечаний: 0% ±

Excel 2010
Manyasha,
Еще небольшой нюанс. А Можно напротив даты выводить название листа с которого берется информация ?

Спасибо.
 
Ответить
СообщениеManyasha,
Еще небольшой нюанс. А Можно напротив даты выводить название листа с которого берется информация ?

Спасибо.

Автор - koyaanisqatsi
Дата добавления - 30.04.2016 в 15:55
Manyasha Дата: Воскресенье, 01.05.2016, 13:13 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
koyaanisqatsi, можно:


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеkoyaanisqatsi, можно:

Автор - Manyasha
Дата добавления - 01.05.2016 в 13:13
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вывод отчета по дате с нескольких листов. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!