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

Вход

Регистрация

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

 

= Мир MS Excel/Формирование отчета с применением автофильтра - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Формирование отчета с применением автофильтра (Формулы/Formulas)
Формирование отчета с применением автофильтра
Ostin Дата: Четверг, 17.07.2014, 12:43 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброго времени суток.

Прошу помочь мне с реализацией следующей задачи. Я формирую таблицу/склад в которой отображается типы инструмента и материалов имеющихся на складе, кто заказывал, куда, состояние той или иной позиции. В конечном итоге все сводится к отчетности. Так вот задача состоит из нескольких сценариев, например 1-й) Сформировать отчет, что числиться за сотрудником Геннадий. Я выбираю в столбце "Числится за:" автофильтр "Геннадий" и нажимаю на кнопку например "Сформировать Отчет". В следствии на страницу "Отчет" копируются все строки вместе с главной при этом выставляется приоритетность столбцов, столбец "Числится за:" должен быть вторым после нумерации, третий должен быть "Название складской позиции" при этом синий и красный столбцы "Обслуживание и Закупка" должны исключаться. 2-й) принцип тот же но очтет формируеться на основании столбца "Числится на:".
В итоге, отчет нужно будет формировать по столбцам "Категория, Подкатегория, Числится на:, Числится за:, Состояние"
Думаю по всем остальным справится самому, если поможете хотя бы с первым сценарием.

Надеюсь написал не запутано. Прошу прощение заранее за свое делетанцтво, никогда не думал что столкнусь с макросами.
К сообщению приложен файл: 9736339.rar (79.4 Kb)
 
Ответить
СообщениеДоброго времени суток.

Прошу помочь мне с реализацией следующей задачи. Я формирую таблицу/склад в которой отображается типы инструмента и материалов имеющихся на складе, кто заказывал, куда, состояние той или иной позиции. В конечном итоге все сводится к отчетности. Так вот задача состоит из нескольких сценариев, например 1-й) Сформировать отчет, что числиться за сотрудником Геннадий. Я выбираю в столбце "Числится за:" автофильтр "Геннадий" и нажимаю на кнопку например "Сформировать Отчет". В следствии на страницу "Отчет" копируются все строки вместе с главной при этом выставляется приоритетность столбцов, столбец "Числится за:" должен быть вторым после нумерации, третий должен быть "Название складской позиции" при этом синий и красный столбцы "Обслуживание и Закупка" должны исключаться. 2-й) принцип тот же но очтет формируеться на основании столбца "Числится на:".
В итоге, отчет нужно будет формировать по столбцам "Категория, Подкатегория, Числится на:, Числится за:, Состояние"
Думаю по всем остальным справится самому, если поможете хотя бы с первым сценарием.

Надеюсь написал не запутано. Прошу прощение заранее за свое делетанцтво, никогда не думал что столкнусь с макросами.

Автор - Ostin
Дата добавления - 17.07.2014 в 12:43
Pelena Дата: Четверг, 17.07.2014, 12:48 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19199
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
нажимаю на кнопку

Перенести тему в раздел ВОПРОСЫ ПО VBA?


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
нажимаю на кнопку

Перенести тему в раздел ВОПРОСЫ ПО VBA?

Автор - Pelena
Дата добавления - 17.07.2014 в 12:48
Ostin Дата: Четверг, 17.07.2014, 12:55 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Pelena, Если вас не затруднит.
Мне главное чтоб эффект был :)

Спасибо!!!


Сообщение отредактировал Ostin - Четверг, 17.07.2014, 12:59
 
Ответить
СообщениеPelena, Если вас не затруднит.
Мне главное чтоб эффект был :)

Спасибо!!!

Автор - Ostin
Дата добавления - 17.07.2014 в 12:55
Ostin Дата: Пятница, 18.07.2014, 11:45 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Буду рад и благодарен за любую помощь
 
Ответить
СообщениеБуду рад и благодарен за любую помощь

Автор - Ostin
Дата добавления - 18.07.2014 в 11:45
Rioran Дата: Пятница, 18.07.2014, 15:22 | Сообщение № 5
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Ostin, здравствуйте.

Не люблю архивы =) Поэтому в качестве образца решения прикрепляю плод своего воображения с подробными комментариями.

На примере некоторой библиотеки разбирается поиск данных по критерию. Логику, разумеется, можете усложнить по вкусу.

[vba]
Код
Sub Report_Maker()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Data"
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Menu") 'Привяжем лист к переменной
Z = 4 'Зададим первую строку, куда на листе "Menu" будем вносить данные

With ThisWorkbook.Worksheets("Data") 'Далее можно обращаться к листу "Data" с помощью точки

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим имя книги, которое указали, то...
     If .Cells(X, 3).Value = shtX.Cells(1, 1).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 5).Value 'Отметка о возврате книги
         shtX.Cells(Z, 2).Value = .Cells(X, 2).Value 'Дата выдачи книги
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Имя читателя
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub
[/vba]
К сообщению приложен файл: Auto_Report.xlsm (29.7 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеOstin, здравствуйте.

Не люблю архивы =) Поэтому в качестве образца решения прикрепляю плод своего воображения с подробными комментариями.

На примере некоторой библиотеки разбирается поиск данных по критерию. Логику, разумеется, можете усложнить по вкусу.

[vba]
Код
Sub Report_Maker()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Data"
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Menu") 'Привяжем лист к переменной
Z = 4 'Зададим первую строку, куда на листе "Menu" будем вносить данные

With ThisWorkbook.Worksheets("Data") 'Далее можно обращаться к листу "Data" с помощью точки

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим имя книги, которое указали, то...
     If .Cells(X, 3).Value = shtX.Cells(1, 1).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 5).Value 'Отметка о возврате книги
         shtX.Cells(Z, 2).Value = .Cells(X, 2).Value 'Дата выдачи книги
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Имя читателя
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub
[/vba]

Автор - Rioran
Дата добавления - 18.07.2014 в 15:22
Ostin Дата: Воскресенье, 20.07.2014, 00:49 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran, здравствуйте!

Огромное Вам спасибо, Ваша идея - не совсем то, что я себе представлял, но такой вид меня более чем устроит.
Правда если Вас не затруднит, можно как то поправить код, что бы макрос осуществлял поиск на основании двух значений( я показал в примере)!
Я, к сожалению полный чайник в ВБА. Мне бы хотелось что бы поиск осуществлялся на основании двух критериев, которые выбираются в зависимом выпадающем списке. Так как мне нужно осуществлять поиск и формирование отчета на основании нескольких столбцов. Списки я создавал методом Формулы -> Диспетчер имен.
Заранее благодарю
К сообщению приложен файл: Auto_Report1.xlsm (29.3 Kb)


Сообщение отредактировал Ostin - Воскресенье, 20.07.2014, 00:50
 
Ответить
СообщениеRioran, здравствуйте!

Огромное Вам спасибо, Ваша идея - не совсем то, что я себе представлял, но такой вид меня более чем устроит.
Правда если Вас не затруднит, можно как то поправить код, что бы макрос осуществлял поиск на основании двух значений( я показал в примере)!
Я, к сожалению полный чайник в ВБА. Мне бы хотелось что бы поиск осуществлялся на основании двух критериев, которые выбираются в зависимом выпадающем списке. Так как мне нужно осуществлять поиск и формирование отчета на основании нескольких столбцов. Списки я создавал методом Формулы -> Диспетчер имен.
Заранее благодарю

Автор - Ostin
Дата добавления - 20.07.2014 в 00:49
Rioran Дата: Воскресенье, 20.07.2014, 04:22 | Сообщение № 7
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Ostin, помогать людям, которые пытаются разобраться сами - особое удовольствие. Если Вы можете с помощью моего примера решить свою задачу - то готов решительно оспорить любое Ваше сходство с предметом кухонной утвари :D

Для решения Вашего вопроса я добавил новую переменную, дабы указать программе нужный столбец. Плюс строка, в которой уточняется её значение. Плюс там, где раньше шёл поиск по конкретному номеру столбца - теперь ищем по столбцу, за который отвечает переменная. Как Вам такой вариант?

[vba]
Код
Sub Report_Maker_2()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Data"
Dim Y As Byte 'Для уточнения столбца для поиска значения
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Menu") 'Привяжем лист к переменной
Z = 4 'Зададим первую строку, куда на листе "Menu" будем вносить данные

'Далее можно обращаться к листу "Data" с помощью точки
With ThisWorkbook.Worksheets("Data")
'Находим номер столбца, в котором ищем нужное значение
Y = .Range("A1:E1").Find(shtX.Cells(1, 1).Value).Column

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим указанный параметр, то...
     If .Cells(X, Y).Value = shtX.Cells(1, 2).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 5).Value 'Отметка о возврате книги
         shtX.Cells(Z, 2).Value = .Cells(X, 2).Value 'Дата выдачи книги
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Имя читателя
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub
[/vba]
К сообщению приложен файл: Auto_Report_Adv.xlsm (30.3 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеOstin, помогать людям, которые пытаются разобраться сами - особое удовольствие. Если Вы можете с помощью моего примера решить свою задачу - то готов решительно оспорить любое Ваше сходство с предметом кухонной утвари :D

Для решения Вашего вопроса я добавил новую переменную, дабы указать программе нужный столбец. Плюс строка, в которой уточняется её значение. Плюс там, где раньше шёл поиск по конкретному номеру столбца - теперь ищем по столбцу, за который отвечает переменная. Как Вам такой вариант?

[vba]
Код
Sub Report_Maker_2()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Data"
Dim Y As Byte 'Для уточнения столбца для поиска значения
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Menu") 'Привяжем лист к переменной
Z = 4 'Зададим первую строку, куда на листе "Menu" будем вносить данные

'Далее можно обращаться к листу "Data" с помощью точки
With ThisWorkbook.Worksheets("Data")
'Находим номер столбца, в котором ищем нужное значение
Y = .Range("A1:E1").Find(shtX.Cells(1, 1).Value).Column

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим указанный параметр, то...
     If .Cells(X, Y).Value = shtX.Cells(1, 2).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 5).Value 'Отметка о возврате книги
         shtX.Cells(Z, 2).Value = .Cells(X, 2).Value 'Дата выдачи книги
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Имя читателя
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub
[/vba]

Автор - Rioran
Дата добавления - 20.07.2014 в 04:22
Ostin Дата: Четверг, 24.07.2014, 23:47 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran, спасибо за сравнение и за код. Тут уже было дело чести адаптировать ваш код под мои потребности, хоть и первый опыт работы с макросамы. В данном случае оказалось не тяжело. Есть у меня, конечно же, еще парочка заморочек, но это будут новые темы.
[vba]
Код
Sub Report_Maker_2()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Склад"
Dim Y As Byte 'Для уточнения столбца для поиска значения
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Отчет") 'Привяжем лист к переменной
Z = 6 'Зададим первую строку, куда на листе "Menu" будем вносить данные

'Далее можно обращаться к листу "Склад" с помощью точки
With ThisWorkbook.Worksheets("Склад")
'Находим номер столбца, в котором ищем нужное значение
Y = .Range("A1:R1").Find(shtX.Cells(1, 4).Value).Column

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим указанный параметр, то...
     If .Cells(X, Y).Value = shtX.Cells(1, 2).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 2).Value 'Название_складской_позиции
         shtX.Cells(Z, 2).Value = .Cells(X, 3).Value 'инвен_ный_№
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Ед. изм.
         shtX.Cells(Z, 4).Value = .Cells(X, 5).Value 'Кол.
         shtX.Cells(Z, 5).Value = .Cells(X, 8).Value 'Числится на:
         shtX.Cells(Z, 6).Value = .Cells(X, 9).Value 'Числится за:
         shtX.Cells(Z, 7).Value = .Cells(X, 17).Value 'Состояние
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub

Sub Reset()

Dim X As Long: X = ThisWorkbook.Worksheets("Отчет").Cells(Rows.Count, 1).End(xlUp).Row
If X > 3 Then ThisWorkbook.Worksheets("Отчет").Range("A6:G" & X).Value = ""

End Sub
[/vba]
К сообщению приложен файл: -1.zip (89.9 Kb)
 
Ответить
СообщениеRioran, спасибо за сравнение и за код. Тут уже было дело чести адаптировать ваш код под мои потребности, хоть и первый опыт работы с макросамы. В данном случае оказалось не тяжело. Есть у меня, конечно же, еще парочка заморочек, но это будут новые темы.
[vba]
Код
Sub Report_Maker_2()
Application.ScreenUpdating = False 'Отключение обновления экрана, для скорости программы

Dim shtX As Worksheet 'Для обращений к листу "Menu"
Dim X As Long 'Для перебора строк листа "Склад"
Dim Y As Byte 'Для уточнения столбца для поиска значения
Dim Z As Long 'Для перебора строк листа "Menu"

Set shtX = ThisWorkbook.Worksheets("Отчет") 'Привяжем лист к переменной
Z = 6 'Зададим первую строку, куда на листе "Menu" будем вносить данные

'Далее можно обращаться к листу "Склад" с помощью точки
With ThisWorkbook.Worksheets("Склад")
'Находим номер столбца, в котором ищем нужное значение
Y = .Range("A1:R1").Find(shtX.Cells(1, 4).Value).Column

'Перебираем строки листа "Data" кроме заголовков до последней найденной 1-го столбца
For X = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
     'Если в "Data" находим указанный параметр, то...
     If .Cells(X, Y).Value = shtX.Cells(1, 2).Value Then
         'Заполняем строку Z найденными данными
         shtX.Cells(Z, 1).Value = .Cells(X, 2).Value 'Название_складской_позиции
         shtX.Cells(Z, 2).Value = .Cells(X, 3).Value 'инвен_ный_№
         shtX.Cells(Z, 3).Value = .Cells(X, 4).Value 'Ед. изм.
         shtX.Cells(Z, 4).Value = .Cells(X, 5).Value 'Кол.
         shtX.Cells(Z, 5).Value = .Cells(X, 8).Value 'Числится на:
         shtX.Cells(Z, 6).Value = .Cells(X, 9).Value 'Числится за:
         shtX.Cells(Z, 7).Value = .Cells(X, 17).Value 'Состояние
         'Увеличиваем значение строки, чтобы в следующий раз писать на новую.
         Z = Z + 1
     'Закрываем блок "Если"
     End If
'Отработав одно значение Х переходим к следующему.
Next X

End With 'Отключение автоматического обращения к листу shtX
Application.ScreenUpdating = True 'Возвращаем обновление экрана.
End Sub

Sub Reset()

Dim X As Long: X = ThisWorkbook.Worksheets("Отчет").Cells(Rows.Count, 1).End(xlUp).Row
If X > 3 Then ThisWorkbook.Worksheets("Отчет").Range("A6:G" & X).Value = ""

End Sub
[/vba]

Автор - Ostin
Дата добавления - 24.07.2014 в 23:47
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Формирование отчета с применением автофильтра (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

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