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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос сбора данных из разных файлов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос сбора данных из разных файлов (Макросы Sub)
Макрос сбора данных из разных файлов
alisherne Дата: Среда, 30.10.2013, 18:56 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день, форумчане.

Стоит следующая задача. В папке у коллег собираются подпапки, в которых хранятся файлы, содержающие формы опросники. Уровней подпапок может быть от 1 до 5. Файлы опросники представляют собой стандартизированную форму, в которую респонденты вносят данные. Т.е. сам вид и структура форм не меняется. Но меняется порядок листов в книге и само название "Форма №" (см файлы вложения) сдвигается в рамках первой строки и 4го и 7го столбца.

Стоит задача написать макрос, который бы спрашивал, из какой корневой папки производить поиск файлов (в том числе в подпапках), идентифицировать в каждом файле (Файле-источнике) какой лист является какой формой (форма 1 или форма 2, ...), изымать данные (целый столбец) из соответствующего листа по порядку и вставлять транспонированно в файл-конечный.

Примеры файлов-источников и результат свода в приложении.

Нашел функцию, возвращающую путь к выбранной в диалоговом окне папке

[vba]
Код
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
[/vba]

Ее результат использую для подмодуля

[vba]
Код
Sub GetAllFileNamesDict(FolderPath$, ByVal SearchDeep%, FSO, oDict1, oDict2)
Dim oFile, oCurFolder, oSubFolder
On Error Resume Next
Set oCurFolder = FSO.GetFolder(FolderPath)
If Not oCurFolder Is Nothing Then 'чтобы не зациклилось при рекурсивном вызове, когда нет подпапок и oSubFolder=Nothing
Application.StatusBar = "Поиск в папке: " & FolderPath ' вывод пути к просматриваемой в текущий момент папке в строку состояния Excel
For Each oFile In oCurFolder.Files ' перебираем все файлы в папке FolderPath
With oFile
oDict1.Item(oDict1.count + 1) = .Path
oDict2.Item(oDict2.count + 1) = .Name
End With
Next oFile
SearchDeep = SearchDeep - 1 ' один уровень поиска прошли
If SearchDeep Then ' если надо искать в подпапках глубже
For Each oSubFolder In oCurFolder.SubFolders ' перебираем все подпапки в папке FolderPath
GetAllFileNamesDict oSubFolder.Path, SearchDeep, FSO, oDict1, oDict2
Next oSubFolder
End If
End If
Set oFile = Nothing: Set oCurFolder = Nothing: Set oSubFolder = Nothing
DoEvents ' чтобы можно было прервать слишком длинную рекурсию
End Sub
[/vba]

Под модуль возвращает два словаря. В одном массив путей к файлам, во втором - имена. Пути затем использую для открытия в цикле файла, его название - для изъятия данных. Понимаю, что можно оптимизировать процесс, поэтому буду рад предложениям.
Застрял на проблеме транспонирования. Решил вставлять поячеечно, но это очень замедляет процесс.

При оформлении постов используйте тэги!
К сообщению приложен файл: 1163640.7z (10.0 Kb)
 
Ответить
СообщениеДобрый день, форумчане.

Стоит следующая задача. В папке у коллег собираются подпапки, в которых хранятся файлы, содержающие формы опросники. Уровней подпапок может быть от 1 до 5. Файлы опросники представляют собой стандартизированную форму, в которую респонденты вносят данные. Т.е. сам вид и структура форм не меняется. Но меняется порядок листов в книге и само название "Форма №" (см файлы вложения) сдвигается в рамках первой строки и 4го и 7го столбца.

Стоит задача написать макрос, который бы спрашивал, из какой корневой папки производить поиск файлов (в том числе в подпапках), идентифицировать в каждом файле (Файле-источнике) какой лист является какой формой (форма 1 или форма 2, ...), изымать данные (целый столбец) из соответствующего листа по порядку и вставлять транспонированно в файл-конечный.

Примеры файлов-источников и результат свода в приложении.

Нашел функцию, возвращающую путь к выбранной в диалоговом окне папке

[vba]
Код
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
Optional ByVal InitialPath As String = "c:\") As String
' функция выводит диалоговое окно выбора папки с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
Dim PS As String: PS = Application.PathSeparator
With Application.FileDialog(msoFileDialogFolderPicker)
If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
If .Show <> -1 Then Exit Function
GetFolderPath = .SelectedItems(1)
If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
End With
End Function
[/vba]

Ее результат использую для подмодуля

[vba]
Код
Sub GetAllFileNamesDict(FolderPath$, ByVal SearchDeep%, FSO, oDict1, oDict2)
Dim oFile, oCurFolder, oSubFolder
On Error Resume Next
Set oCurFolder = FSO.GetFolder(FolderPath)
If Not oCurFolder Is Nothing Then 'чтобы не зациклилось при рекурсивном вызове, когда нет подпапок и oSubFolder=Nothing
Application.StatusBar = "Поиск в папке: " & FolderPath ' вывод пути к просматриваемой в текущий момент папке в строку состояния Excel
For Each oFile In oCurFolder.Files ' перебираем все файлы в папке FolderPath
With oFile
oDict1.Item(oDict1.count + 1) = .Path
oDict2.Item(oDict2.count + 1) = .Name
End With
Next oFile
SearchDeep = SearchDeep - 1 ' один уровень поиска прошли
If SearchDeep Then ' если надо искать в подпапках глубже
For Each oSubFolder In oCurFolder.SubFolders ' перебираем все подпапки в папке FolderPath
GetAllFileNamesDict oSubFolder.Path, SearchDeep, FSO, oDict1, oDict2
Next oSubFolder
End If
End If
Set oFile = Nothing: Set oCurFolder = Nothing: Set oSubFolder = Nothing
DoEvents ' чтобы можно было прервать слишком длинную рекурсию
End Sub
[/vba]

Под модуль возвращает два словаря. В одном массив путей к файлам, во втором - имена. Пути затем использую для открытия в цикле файла, его название - для изъятия данных. Понимаю, что можно оптимизировать процесс, поэтому буду рад предложениям.
Застрял на проблеме транспонирования. Решил вставлять поячеечно, но это очень замедляет процесс.

При оформлении постов используйте тэги!

Автор - alisherne
Дата добавления - 30.10.2013 в 18:56
Hugo Дата: Среда, 30.10.2013, 19:05 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Копируйте данные через массив, или целиком диапазон.
Если я правильно понял в чём проблема.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеКопируйте данные через массив, или целиком диапазон.
Если я правильно понял в чём проблема.

Автор - Hugo
Дата добавления - 30.10.2013 в 19:05
alisherne Дата: Четверг, 31.10.2013, 17:33 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо за ответ.
Я тоже так думал. И тут у меня возникли проблемы.
Первый раз скопировать данные через диапазон и вставить транспонированно получилось. Потом что-то пошло не так, как говорится. Транспонировать перестало получаться.
Были мысли, что проблема в наличии пароля в файлах источниках. Но я их предварительно снимаю командой workbooks(...).unprotect

Код транспонирования примерно такой:
[vba]
Код
Workbooks(1).worksheets(1).range("A1:A6").copy
Workbooks(2).worksheets(1).range("A1").select
Selection.PasteSpecial Paste:=xlPasteAll, Transpose:=True
[/vba]
 
Ответить
СообщениеСпасибо за ответ.
Я тоже так думал. И тут у меня возникли проблемы.
Первый раз скопировать данные через диапазон и вставить транспонированно получилось. Потом что-то пошло не так, как говорится. Транспонировать перестало получаться.
Были мысли, что проблема в наличии пароля в файлах источниках. Но я их предварительно снимаю командой workbooks(...).unprotect

Код транспонирования примерно такой:
[vba]
Код
Workbooks(1).worksheets(1).range("A1:A6").copy
Workbooks(2).worksheets(1).range("A1").select
Selection.PasteSpecial Paste:=xlPasteAll, Transpose:=True
[/vba]

Автор - alisherne
Дата добавления - 31.10.2013 в 17:33
SkyPro Дата: Четверг, 31.10.2013, 17:46 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Копирование через массив:
[vba]
Код
Sub cp()
Dim x
x = Workbooks(2).Sheets(1).[a2:a6]
Workbooks(1).Sheets(1).[a2].Resize(1, UBound(x)) = Application.WorksheetFunction.Transpose(x)
End Sub
[/vba]
Что бы не путаться в книгах и избежать ошибок, определите книги в переменные:
Файл источник- [vba]
Код
Set wbOut = workbooks.open ...
[/vba]
Файл приемник- [vba]
Код
Set wbIn = ThisWorkbook
[/vba]


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Четверг, 31.10.2013, 17:49
 
Ответить
СообщениеКопирование через массив:
[vba]
Код
Sub cp()
Dim x
x = Workbooks(2).Sheets(1).[a2:a6]
Workbooks(1).Sheets(1).[a2].Resize(1, UBound(x)) = Application.WorksheetFunction.Transpose(x)
End Sub
[/vba]
Что бы не путаться в книгах и избежать ошибок, определите книги в переменные:
Файл источник- [vba]
Код
Set wbOut = workbooks.open ...
[/vba]
Файл приемник- [vba]
Код
Set wbIn = ThisWorkbook
[/vba]

Автор - SkyPro
Дата добавления - 31.10.2013 в 17:46
alisherne Дата: Воскресенье, 03.11.2013, 22:24 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо. Было полезно
 
Ответить
СообщениеСпасибо. Было полезно

Автор - alisherne
Дата добавления - 03.11.2013 в 22:24
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос сбора данных из разных файлов (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

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