Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Сбор данных с определенного листа большого кол-ва книг на один лист

Ответить
Настройки темы
VBA - Сбор данных с определенного листа большого кол-ва книг на один лист

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Всем доброго времени суток.
Недолго думая я погуглил, нашел как листы скопировать со всех книг в одну. Погуглил ещё нашел как всю информацию записать на 1 лист. Подкорректировал, сделал, чтоб сразу как надо было, но увы, меня ждала неудача. Теряется 1 строка при копировании информации с последующей книги. Код у меня такой
Код: Выделить весь код
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xls), *.xls", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open Filename:=FilesToOpen(x)
Sheets(3).Range("A1:Z" & Sheets(3).UsedRange.Rows.Count + 1).Copy ThisWorkbook.Sheets(1).Range("A" & ThisWorkbook.Sheets(1).UsedRange.Rows.Count + 1)
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
Где я напортачил?

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 23:03, 24-04-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Где я напортачил? »
Не приложили примеры Рабочих книг, упакованных в архив . Не пришлось бы гадать, какая именно строка:
Цитата blackeangel:
Теряется 1 строка при копировании информации с последующей книги. »
теряется.

Цитата blackeangel:
как листы скопировать со всех книг в одну. »
А нужно ли?

Что я бы наверняка поменял:
Код: Выделить весь код
        Workbooks.Open Filename:=FilesToOpen(x)
Sheets(3).Range("A1:Z" & Sheets(3).UsedRange.Rows.Count + 1).Copy ThisWorkbook.Sheets(1).Range("A" & ThisWorkbook.Sheets(1).UsedRange.Rows.Count + 1)
Надо не просто открывать Рабочую книгу «в никуда» и играться далее в игры с неявной ссылкой ActiveWorkbook, а, открывая Рабочую книгу, сразу получать ссылку на неё и работать далее с этой открытой Рабочей книгой только через неё:
Код: Выделить весь код
Dim objWorkbook As Workbook
…
Set objWorkbook = Workbooks.Open(Filename:=FilesToOpen(x))
objWorkbook.Sheets(3).Range("A1:Z" & objWorkbook.Sheets(3).UsedRange.Rows.Count + 1).Copy …
…
objWorkbook.Close
Строка теряться может где угодно, надо смотреть в содержимое реальных Рабочих книг. Например, пустая (пусть даже скрытая) строка вверху Рабочей книги — и .Range("A1:Z" & .UsedRange.Rows.Count + 1) захватит на строку меньше, нежели ожидалось. Две-три-четыре таких пустых строки дадут столько же потерянных. Я, кстати, не понял, зачем Вам там к .Rows.Count ещё и +1.

В общем, крайне желательны образцы.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:42, 24-04-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Iska, примерчики приложу чуть позже.
Да, копировать именно надо в один лист. Задача на самом деле куда шире: надо из выбранных файлов сгруппировать по дате создания, содержимое третьего листа всех сгруппированных файлов(группировка по месяцам) прочитать на временный лист, удалить дубли,проставить в свободный столбец месяц и год. На новый лист подвести итог - кол-во записей с предыдущего листа по месяцам.

На счёт того кто косячит: косячит именно та строка что вы усомнились. Не происходит сдвиг курсора на строку ниже, а запись начинает сразу в последнюю строку. Добавляя +1 я пытался исправить это положение, но безуспешно.
Если это всё хозяйство разбить на 2 этапа: в книгу собираем нужные листы из других книг, а потом пробегаясь по листам собирать данные на один лист - то всё работает правильно. А вот сразу на лету - нет.
Для уточнения-теряется последняя строка предыдущего копирования.
Всё описал как то сумбурно, но как смог.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 06:52, 25-04-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


blackeangel, ну, вот, как раз потому я и прошу образцы Рабочих книг, дабы было на чём «щупать» код.

Отправлено: 14:01, 25-04-2018 | #4


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar 03.18.rar
(91.0 Kb, 1 просмотров)

Iska, вот и файлики. Только пришлось подрезать их до 1 листа.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 14:10, 25-04-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Только пришлось подрезать их до 1 листа. »
Зачем?

Цитата:
Код: Выделить весь код
Sheets(3).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Э… Теперь Вы собираете рабочие листы в одной Рабочей книге?


Цитата blackeangel:
вот и файлики. »
Сборка может быть осуществлена примерно таким кодом:
Код: Выделить весь код
Option Explicit

Sub CombineWorkbooks()
    Dim arrSelectedWorkbooks As Variant
    Dim strWorkbook As Variant
    
    arrSelectedWorkbooks = Application.GetOpenFilename( _
        FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", _
        Title:="Files to Merge", _
        MultiSelect:=True _
    )
    
    If IsArray(arrSelectedWorkbooks) Then
        For Each strWorkbook In arrSelectedWorkbooks
            With Application.Workbooks.Open(Filename:=strWorkbook)
                .Sheets.Item("Сборки для диспетчера").UsedRange.Copy ThisWorkbook.Sheets.Item(1).UsedRange.Offset(ThisWorkbook.Sheets.Item(1).UsedRange.Rows.Count)
                .Close
            End With
        Next strWorkbook
    Else
        MsgBox "Не выбрано ни одного файла!"
    End If
End Sub
При этом:
а) на рабочем листе сборки первая строка останется пустой (потому как и на пустом рабочем листе свойство .UsedRange пустым не бывает), в принципе, это можно учесть, я просто не стал усложнять здесь код;
б) сборка происходит с заголовками «№ сборки», это тоже можно учесть и исключить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:19, 25-04-2018 | #6


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата:
Теперь Вы собираете рабочие листы в одной Рабочей книге?
Я ж писал, что только так работает правильно, а не сразу "на лету"

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 16:30, 25-04-2018 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Я ж писал, что только так работает правильно, а не сразу "на лету" »
Выложенный мною код на выложенных Вами файлах работает «на лету». Смотрите, пробуйте, уточняйте, задавайте вопросы.

Отправлено: 17:14, 25-04-2018 | #8


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Iska, разобрался. Да, действительно на лету.
Как бы это переделать теперь чтоб предлогалось выбрать листы(номер или имя), а если не указаны, то всю книгу целиком. Но запрос только один раз был, а не по каждой книге) да, и отвязаться от thisworkbook как? Чтоб было что то типа activeworkbook. Но при открытии ведь activeworkbook меняется на вновь открытый файл. В общем почти что модуль надстройки)

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 17:21, 25-04-2018 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Как бы это переделать теперь чтоб предлогалось выбрать листы(номер или имя), а если не указаны, то всю книгу целиком. »
Например? И зачем? И — листы или один лист? Вот в выложенных Вами образцах по одному Рабочему листу, и каждый из них имеет одно и то же имя. А как с этим обстоят дела в настоящих, оригинальных Рабочих книгах?

Цитата blackeangel:
Но запрос только один раз был, а не по каждой книге) »
Не понял. Поясните.

Цитата blackeangel:
да, и отвязаться от thisworkbook как? Чтоб было что то типа activeworkbook. Но при открытии ведь activeworkbook меняется на вновь открытый файл. »
Чтобы использовать в качестве целевой уже открытую текущую Рабочую книгу? Объявляете Dim objSomeWorkbook As Workbook в начале кода, далее делаете присвоение Set objSomeWorkbook = ActiveWorkbook, далее пользуете objSomeWorkbook.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:59, 25-04-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Сбор данных с определенного листа большого кол-ва книг на один лист

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Подскажите программу(определение субтитров у большого кол-ва файлов)! Aviator Видео и аудио: обработка и кодирование 0 09-05-2015 21:27
Разное - [решено] открытие большого кол-ва html файлов Alexander_88 Microsoft Windows 8 и 8.1 5 20-04-2015 20:55
CMD/BAT - [решено] Убрать расширение с большого кол-ва файлов cher Скриптовые языки администрирования Windows 4 30-03-2015 16:31
2010 - [решено] Excel 2010 фильтр 1 и 2 листа скопировать на новый лист The Off Microsoft Office (Word, Excel, Outlook и т.д.) 30 03-08-2013 09:18
выбор принтера для печати большого кол-ва фотографий Kibor_G Выбор отдельных компонентов компьютера и конфигурации в целом 0 18-06-2010 12:03




 
Переход