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

Вход

Регистрация

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

 

= Мир MS Excel/Копирование строк из нескольких Листов по условию на Лист эт - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование строк из нескольких Листов по условию на Лист эт (Макросы/Sub)
Копирование строк из нескольких Листов по условию на Лист эт
Mutarix Дата: Среда, 29.10.2014, 09:58 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Добрый день,
Нужна ваша помощь для реализации, думаю не сложной, задачи.
Стандартными средствами Excel задача не решается. Нужно сделать макрос. К сожалению моих знаний не хватает.

Во вложенном файле шаблон, который содержат материал для реализации задачи.
Есть рабочие листы Пост1, Пост2, Пост3, Пост4 которые постоянно наполняются информацией. На основании этой информации нужно сделать отчёты: Бюджет (отдельный лист) и Груз в пути (отдельный лист).

1) Бюджет формируется по следующим критериям:
Указываем диапазон даты пример: от 01,11,14 и до 30,11,14, после нажатия кнопки "загрузить" на лист Бюджет копируются строки (если есть возможность определенные ячейки в этих строках) Дата оплаты которых попадает в этот диапазон. Из каждого листа Пост1, Пост2, Пост3, Пост4 последовательно вставляются на Лист Бюджет.

2) Груз в пути формируется по следующему условию:
Указываем дату, на которую нужно определить груз в пути после нажатия кнопки "загрузить" применяем условие отбора строк. Все строки, которые: Дата загрузки < ("Дата")< Дата прихода пример: 15.10.2014<("01.11.2014")<15.11.14.
Из каждого листа Пост1, Пост2, Пост3, Пост4 последовательно копируются строки (если есть возможность определенные ячейки в этих строках) на Лист Груз в пути.

Заранее благодарю за любую помощь!
К сообщению приложен файл: 5191524.zip (96.6 Kb)
 
Ответить
СообщениеДобрый день,
Нужна ваша помощь для реализации, думаю не сложной, задачи.
Стандартными средствами Excel задача не решается. Нужно сделать макрос. К сожалению моих знаний не хватает.

Во вложенном файле шаблон, который содержат материал для реализации задачи.
Есть рабочие листы Пост1, Пост2, Пост3, Пост4 которые постоянно наполняются информацией. На основании этой информации нужно сделать отчёты: Бюджет (отдельный лист) и Груз в пути (отдельный лист).

1) Бюджет формируется по следующим критериям:
Указываем диапазон даты пример: от 01,11,14 и до 30,11,14, после нажатия кнопки "загрузить" на лист Бюджет копируются строки (если есть возможность определенные ячейки в этих строках) Дата оплаты которых попадает в этот диапазон. Из каждого листа Пост1, Пост2, Пост3, Пост4 последовательно вставляются на Лист Бюджет.

2) Груз в пути формируется по следующему условию:
Указываем дату, на которую нужно определить груз в пути после нажатия кнопки "загрузить" применяем условие отбора строк. Все строки, которые: Дата загрузки < ("Дата")< Дата прихода пример: 15.10.2014<("01.11.2014")<15.11.14.
Из каждого листа Пост1, Пост2, Пост3, Пост4 последовательно копируются строки (если есть возможность определенные ячейки в этих строках) на Лист Груз в пути.

Заранее благодарю за любую помощь!

Автор - Mutarix
Дата добавления - 29.10.2014 в 09:58
Rioran Дата: Среда, 29.10.2014, 11:56 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

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

Предлагаю программу, протестировать можно во вложении. Ваш изначальный файл пришлось несколько почистить, дабы уменьшить его вес до минимума.

Коды для обоих кнопок похожи, ниже образец кода для кнопки "Бюджета".

Программа очищает ранее выведенную на экран информацию, перебирает все листы книги, в которой установлена, и если имя листа начинается со слова "Пост" - начинает перебирать строки таблицы.

Как Вам такой вариант?

[vba]
Код
Sub Rio_Consolidation_Budget()

'Author:    Roman "Rioran" Voronov
'Date:      the 29-th of October, 2014
'Feedback:  voronov_rv@mail.ru

Application.ScreenUpdating = False
Set ShtA = ThisWorkbook.Worksheets("Бюджет")
ShtA.Range("A4:F" & WorksheetFunction.Max(4, ShtA.Cells(ShtA.Rows.Count, 1).End(xlUp).Row)).Value = ""
DateA = Cells(1, 9).Value
DateB = Cells(1, 11).Value
B = 3

For Each ShtX In ThisWorkbook.Worksheets
     With ShtX
         If Left(.Name, 4) = "Пост" Then
             C = .Cells(.Rows.Count, 1).End(xlUp).Row
             If C > 2 Then
                 For A = 2 To C
                     DateX = .Cells(A, 9).Value
                     If DateX >= DateA And DateX <= DateB Then
                         B = B + 1
                         ShtA.Cells(B, 1).Value = B - 3
                         ShtA.Cells(B, 2).Resize(1, 3).Value = .Range(.Cells(A, 2), .Cells(A, 4)).Value
                         ShtA.Cells(B, 5).Resize(1, 2).Value = .Range(.Cells(A, 6), .Cells(A, 7)).Value
                     End If
                 Next A
             End If
         End If
     End With
Next ShtX

Set ShtA = Nothing
Application.ScreenUpdating = True

End Sub
[/vba]
К сообщению приложен файл: Rio_Go.xlsm (34.9 Kb)


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

Предлагаю программу, протестировать можно во вложении. Ваш изначальный файл пришлось несколько почистить, дабы уменьшить его вес до минимума.

Коды для обоих кнопок похожи, ниже образец кода для кнопки "Бюджета".

Программа очищает ранее выведенную на экран информацию, перебирает все листы книги, в которой установлена, и если имя листа начинается со слова "Пост" - начинает перебирать строки таблицы.

Как Вам такой вариант?

[vba]
Код
Sub Rio_Consolidation_Budget()

'Author:    Roman "Rioran" Voronov
'Date:      the 29-th of October, 2014
'Feedback:  voronov_rv@mail.ru

Application.ScreenUpdating = False
Set ShtA = ThisWorkbook.Worksheets("Бюджет")
ShtA.Range("A4:F" & WorksheetFunction.Max(4, ShtA.Cells(ShtA.Rows.Count, 1).End(xlUp).Row)).Value = ""
DateA = Cells(1, 9).Value
DateB = Cells(1, 11).Value
B = 3

For Each ShtX In ThisWorkbook.Worksheets
     With ShtX
         If Left(.Name, 4) = "Пост" Then
             C = .Cells(.Rows.Count, 1).End(xlUp).Row
             If C > 2 Then
                 For A = 2 To C
                     DateX = .Cells(A, 9).Value
                     If DateX >= DateA And DateX <= DateB Then
                         B = B + 1
                         ShtA.Cells(B, 1).Value = B - 3
                         ShtA.Cells(B, 2).Resize(1, 3).Value = .Range(.Cells(A, 2), .Cells(A, 4)).Value
                         ShtA.Cells(B, 5).Resize(1, 2).Value = .Range(.Cells(A, 6), .Cells(A, 7)).Value
                     End If
                 Next A
             End If
         End If
     End With
Next ShtX

Set ShtA = Nothing
Application.ScreenUpdating = True

End Sub
[/vba]

Автор - Rioran
Дата добавления - 29.10.2014 в 11:56
Mutarix Дата: Среда, 29.10.2014, 12:23 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran,
Отлично всё работает.
Только одна деталь. Название листа Пост1 ... n это название поставщика.
Каждый раз кода я буду добавлять новый лист (поставщика) я хотелбы в ручную добавлять в код этот лист.
If Left(.Name, 4) = "Пост" and "Пост2" ... and ... "Пост n" Then
 
Ответить
СообщениеRioran,
Отлично всё работает.
Только одна деталь. Название листа Пост1 ... n это название поставщика.
Каждый раз кода я буду добавлять новый лист (поставщика) я хотелбы в ручную добавлять в код этот лист.
If Left(.Name, 4) = "Пост" and "Пост2" ... and ... "Пост n" Then

Автор - Mutarix
Дата добавления - 29.10.2014 в 12:23
Wasilich Дата: Среда, 29.10.2014, 12:39 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Вариант
 
Ответить
СообщениеВариант

Автор - Wasilich
Дата добавления - 29.10.2014 в 12:39
Rioran Дата: Среда, 29.10.2014, 13:22 | Сообщение № 5
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Mutarix, можно сделать легче. Можно перебирать таблицы во всех листах, имя которых НЕ "Бюджет" и по грузам. Устроит?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеMutarix, можно сделать легче. Можно перебирать таблицы во всех листах, имя которых НЕ "Бюджет" и по грузам. Устроит?

Автор - Rioran
Дата добавления - 29.10.2014 в 13:22
Mutarix Дата: Среда, 29.10.2014, 13:36 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Wasilic, Спасибо Работает нормально.
Но есть несколько замечаний :
не обнуляет данные перед очередным выполнение макроса.
Нет возможности определять каждый лист отдельно.
 
Ответить
СообщениеWasilic, Спасибо Работает нормально.
Но есть несколько замечаний :
не обнуляет данные перед очередным выполнение макроса.
Нет возможности определять каждый лист отдельно.

Автор - Mutarix
Дата добавления - 29.10.2014 в 13:36
Mutarix Дата: Среда, 29.10.2014, 13:37 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran, Да, в полне.
 
Ответить
СообщениеRioran, Да, в полне.

Автор - Mutarix
Дата добавления - 29.10.2014 в 13:37
Rioran Дата: Среда, 29.10.2014, 14:10 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Mutarix, извольте =)

Строка для определения листа, с которого вытягивать строки, заменена на:

[vba]
Код
If .Name <> "Бюджет" And .Name <> "Груз в пути" Then
[/vba]
К сообщению приложен файл: Rio_Go_2.xlsm (36.6 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеMutarix, извольте =)

Строка для определения листа, с которого вытягивать строки, заменена на:

[vba]
Код
If .Name <> "Бюджет" And .Name <> "Груз в пути" Then
[/vba]

Автор - Rioran
Дата добавления - 29.10.2014 в 14:10
Mutarix Дата: Среда, 29.10.2014, 14:47 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Rioran,
Excelent.
Большое спасибо за помощь.
Буду адаптировать к основной базе о результатах теста сообщу.
 
Ответить
СообщениеRioran,
Excelent.
Большое спасибо за помощь.
Буду адаптировать к основной базе о результатах теста сообщу.

Автор - Mutarix
Дата добавления - 29.10.2014 в 14:47
Wasilich Дата: Среда, 29.10.2014, 21:15 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
не обнуляет данные перед очередным выполнение макроса.
Так, в задаче такого не было.
Да, я и не подумал, что для Вас это проблема. Просто, в начале процедуры вставить строку кода очистки диапазона? например до 1000 строк:
[vba]
Код
Range("A4:F1000").ClearContents
[/vba]
Нет возможности определять каждый лист отдельно.
Честно говоря, я не понял что надо то? Имена листов, если они все "Пост" с нарастающим номером, как в примере - Пост1, Пост2 ... Пост4, и дальше будут Пост5, Пост6 и т. д. , то в цикле - [vba]
Код
For Ls = 1 To 4
[/vba]то есть, с первого по четвертый, надо просто установить "по какой" - столько, сколько их будет. Например [vba]
Код
For Ls = 1 To 6
[/vba]если их будет 6.
Если же имена будут совершенно разные, то естно, нужен вариант перебора имен за исключением не нужных, как у Rioranа. А вообще то, вариантов много. Можно на листе "Бюджет" создать список имен листов в любом желаемом порядке и считывать их макросом. Можно ... Можно ... :)


Сообщение отредактировал Wasilic - Среда, 29.10.2014, 21:18
 
Ответить
Сообщение
не обнуляет данные перед очередным выполнение макроса.
Так, в задаче такого не было.
Да, я и не подумал, что для Вас это проблема. Просто, в начале процедуры вставить строку кода очистки диапазона? например до 1000 строк:
[vba]
Код
Range("A4:F1000").ClearContents
[/vba]
Нет возможности определять каждый лист отдельно.
Честно говоря, я не понял что надо то? Имена листов, если они все "Пост" с нарастающим номером, как в примере - Пост1, Пост2 ... Пост4, и дальше будут Пост5, Пост6 и т. д. , то в цикле - [vba]
Код
For Ls = 1 To 4
[/vba]то есть, с первого по четвертый, надо просто установить "по какой" - столько, сколько их будет. Например [vba]
Код
For Ls = 1 To 6
[/vba]если их будет 6.
Если же имена будут совершенно разные, то естно, нужен вариант перебора имен за исключением не нужных, как у Rioranа. А вообще то, вариантов много. Можно на листе "Бюджет" создать список имен листов в любом желаемом порядке и считывать их макросом. Можно ... Можно ... :)

Автор - Wasilich
Дата добавления - 29.10.2014 в 21:15
Mutarix Дата: Понедельник, 24.11.2014, 17:37 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Решение найдено!!!

После адаптации предложенных вариантов к рабочей среде, было выявлены проблемы работы программы.
Цикл поиска прерывался, если в ячейке попадалось значение: "#Н/Д" и #ЗНАЧ!
Программа была доработана (выделено жирным):

[vba]
Код
Sub Budget()

Application.ScreenUpdating = False
Set ShtA = ThisWorkbook.Worksheets("Бюджет")
ShtA.Range("A4:G" & WorksheetFunction.Max(4, ShtA.Cells(ShtA.Rows.Count, 1).End(xlUp).Row)).Value = ""
DateA = Cells(5, 9).Value
DateB = Cells(5, 11).Value
B = 3

For Each ShtX In ThisWorkbook.Worksheets
With ShtX
If .Name <> "Груз в пути" And .Name <> "Бюджет" Then
C = .Cells(.Rows.Count, 1).End(xlUp).Row
If C > 6 Then
For A = 6 To C
[b] If IsError(.Cells(A, 31).Value) Then[/b]
[b]Else[/b]
DateX = .Cells(A, 31).Value
If DateX >= DateA And DateX <= DateB Then
B = B + 1
ShtA.Cells(B, 1).Value = B - 3
ShtA.Cells(B, 2).Resize(1, 2).Value = .Range(.Cells(A, 2), .Cells(A, 3)).Value
ShtA.Cells(B, 4).Resize(1, 1).Value = .Range(.Cells(A, 16), .Cells(A, 16)).Value * 1000
ShtA.Cells(B, 5).Resize(1, 2).Value = .Range(.Cells(A, 29), .Cells(A, 30)).Value
ShtA.Cells(B, 7).Resize(1, 1).Value = .Range(.Cells(A, 31), .Cells(A, 31)).Value
End If
[b]End If[/b]
Next A
End If
End If
End With
Next ShtX

Set ShtA = Nothing
Application.ScreenUpdating = True

End Sub
[/vba]


Сообщение отредактировал Mutarix - Понедельник, 24.11.2014, 18:00
 
Ответить
СообщениеРешение найдено!!!

После адаптации предложенных вариантов к рабочей среде, было выявлены проблемы работы программы.
Цикл поиска прерывался, если в ячейке попадалось значение: "#Н/Д" и #ЗНАЧ!
Программа была доработана (выделено жирным):

[vba]
Код
Sub Budget()

Application.ScreenUpdating = False
Set ShtA = ThisWorkbook.Worksheets("Бюджет")
ShtA.Range("A4:G" & WorksheetFunction.Max(4, ShtA.Cells(ShtA.Rows.Count, 1).End(xlUp).Row)).Value = ""
DateA = Cells(5, 9).Value
DateB = Cells(5, 11).Value
B = 3

For Each ShtX In ThisWorkbook.Worksheets
With ShtX
If .Name <> "Груз в пути" And .Name <> "Бюджет" Then
C = .Cells(.Rows.Count, 1).End(xlUp).Row
If C > 6 Then
For A = 6 To C
[b] If IsError(.Cells(A, 31).Value) Then[/b]
[b]Else[/b]
DateX = .Cells(A, 31).Value
If DateX >= DateA And DateX <= DateB Then
B = B + 1
ShtA.Cells(B, 1).Value = B - 3
ShtA.Cells(B, 2).Resize(1, 2).Value = .Range(.Cells(A, 2), .Cells(A, 3)).Value
ShtA.Cells(B, 4).Resize(1, 1).Value = .Range(.Cells(A, 16), .Cells(A, 16)).Value * 1000
ShtA.Cells(B, 5).Resize(1, 2).Value = .Range(.Cells(A, 29), .Cells(A, 30)).Value
ShtA.Cells(B, 7).Resize(1, 1).Value = .Range(.Cells(A, 31), .Cells(A, 31)).Value
End If
[b]End If[/b]
Next A
End If
End If
End With
Next ShtX

Set ShtA = Nothing
Application.ScreenUpdating = True

End Sub
[/vba]

Автор - Mutarix
Дата добавления - 24.11.2014 в 17:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование строк из нескольких Листов по условию на Лист эт (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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