Страницы: 1 2 След.
RSS
Сбор данных из нескольких закрытых файлов excel в отдельную книгу excel, Сбор данных из нескольких закрытых файлов excel в отдельную книгу excel
 
Всем доброго все времени суток! Помогите пожалуйста советом, а лучше кодом)))
Передо мной поставили  такую задачу:
Нужно, чтобы формировался отчет по нажатию кнопки или запуске Макроса.
В отчет должна переносится информация из закрытых файлов excel имеющих одно и тоже название check-list с одних и тех же ячеек (диапазона ячеек). Файлов таких порядка 500 штук. Название папок есть в в текстовом файле и excel.  Информация должна копироваться рядом с названием папки в отчете. Инфа в файле check-list была размещена по вертикали с верху в низ, а копироваться в отчет должна по горизонтали в лева на права.


Папки с файлами check-list  хранятся во вложенных папках.
См. ниже пример.

папка1/вложенная папка1/файл

папка1/вложенная папка100/файл

папка2/вложенная папка101/файл

папка2/вложенная папка200/файл


И так далее

В ручную не реально обновлять информацию. Помогите пожалуйста разобраться как это реализовать. Я сам второй день как с макросами начал работать, все что пока получилось сделал это скопировать диапазон ячеек из одного закрытого файла в книгу.
Изменено: euric83 - 14.07.2024 23:50:54
 
Посоветую освоить chatGPT - напишет даже и весь код, если опишите задачу, и может даже заработает.
Хотя может если у кого такой код уже есть - могут поделиться.
Но чтоб не зря писать - нужно видеть что за файлы, где инфа, как выглядит, да хоть такая мелочь как на каком из возможно множества листов она расположена.
 
Вообще код простой:
цикл по списку
открываем файл
берём диапазон и транспонируем его, копируем на лист
закрываем файл
всё
 
Я, к сожалению, еще не имею опыта работы с макросами, как циклические команды реализовывать не знаю, буду гуглить. Мне бы пример какой-то. По аналогии я смогу сделать. Файлы размешу, как до работы доберусь. Спасибо за совет
Изменено: euric83 - 15.07.2024 00:27:29
 
Я подозреваю что там могут быть текстовые csv, а к ним особый подход
 
В чек-листах вносятся цифры, которые преобразуются к слова «Да» или «Нет» в соседнем столбике.  Мне даже лучше цифры из чек-листов переносить в сводный отчет и там их уже конвертировать в слова. Мне еще нужно статистику вести по проверкам / параметрам из чек-листов …  
 
В продолжение темы. Прикладываю файлы.

Если сможете подсказать в каком направлении двигаться  либо поделится решением схожих задач,  буду очень признателен ..)))

Спасибо,
 
Цитата
euric83 написал:
подсказать в каком направлении двигаться
двигайтесь в сторону Power Query, для таких задач лучше инструмента не найти...
 
Макросом тоже вполне можно делать.
Чуть осложняет то что нет точного адреса этих папок, но можно просто тупо перебрать все вложенные каталоги и разложить данные по таблице.
Только вот с примером проблема - данных для копирования не нашёл, параметры почем-то интересуют не все...
 
Цитата
Hugo написал:
Макросом тоже вполне можно делать.
можно, но в требованиях ТС указано, что
Цитата
euric83 написал:
В отчет должна переносится информация из закрытых файлов excel
а с макросом придется их открывать... ;)
или я не знаю способа добыть инфу макросом из закрытого файла...   :oops:
 
Скрытый текст
 
BodkhiSatva, воспринимайте это как условие, не воспринимайте это как требование.
"Нужно получить информацию из файла, который на момент запуска макроса закрыт."
 
Цитата
BodkhiSatva написал:
а с макросом придется их открывать..
- ну можно в макросе использовать SQL и формально их не открывать.
Или ExecuteExcel4Macro - тоже вроде как не открывает ))

Как найти файлы вот схема попроще, там выше монстр ))
Код
Sub tt()
Dim objFolder
Set objFolder = CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path)
SearchFiles objFolder
End Sub


Function SearchFiles(fld)
Dim objSubFolder, objFile
 
For Each objFile In fld.Files
If objFile Like "*check-list.xlsx" Then Debug.Print objFile.Path
Next

For Each objSubFolder In fld.SubFolders
    SearchFiles objSubFolder
Next

End Function

А так я тоже продумывал что сперва нужно в словаре запомнить позиции куда выгружать, затем вот так перебрать файлы, и взять и положить данные.
Только вот нечего и непонятно почему усложнение что часть данных нужно выкидывать?
 
Цитата
МатросНаЗебре написал:
это как условие
хорошо, но я вот про что -
Цитата
euric83 написал:
Файлов таких порядка 500 штук.
открывать-закрывать 500 раз - то еще развлечение...
и, по-моему, с PQ будет гораздо быстрее...
 
Цитата
BodkhiSatva написал:
по-моему, с PQ будет гораздо быстрее..
- не знаю, по ощущениям когда жмёшь обновить самый простой запрос эксель задумывается.
Вот появятся тут нормальные файлы, напишет кто-то на PQ - у euric83 будет возможность проверить что быстрее.
 
Ещё вариант. Без открытия файлов.
Код
Option Explicit

Public fso As Object
Private folder_name As String
Private rOut As Range

Sub myCheckDontOpen()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set rOut = ActiveSheet.Range("B6")
    
    Application.ScreenUpdating = False
    Dim Application_Calculation As XlCalculation
    Application_Calculation = Application.Calculation
    Application.Calculation = xlCalculationManual
    
    CheckFolder ThisWorkbook.Path
    
    Application.Calculation = Application_Calculation
    Application.ScreenUpdating = True
End Sub

Private Sub CheckFolder(sPath As String)
    Dim curFold As Folder
    If fso.FolderExists(sPath) Then Set curFold = fso.GetFolder(sPath)
    If curFold Is Nothing Then Exit Sub
    
    Dim sFile As String
    sFile = sPath & "\check-list.xlsx"
    If fso.FileExists(sFile) Then
        folder_name = curFold.Name
        FileJob sFile
    End If
    
    Dim subFold As Folder
    For Each subFold In curFold.SubFolders
        CheckFolder CStr(subFold)
    Next
End Sub

Private Sub FileJob(sFull As String)
    Application.StatusBar = folder_name
    rOut.Value = folder_name
    Dim xo As Long
    For xo = 1 To 16
        rOut.Cells(1, 1 + xo).FormulaR1C1 = "='" & fso.GetParentFolderName(sFull) & "\[" & fso.GetFileName(sFull) & "]Лист1'!R" & xo + 1 & "C3"
    Next
    Set rOut = rOut.Cells(2, 1)
    
    Application.StatusBar = False
    DoEvents
End Sub
 
pq
 
Цитата
Hugo написал:
ну можно в макросе использовать SQL и формально их не открывать
Один из вариантов:
Скрытый текст
На основе кода от МатросНаЗебре из его поста #11. Но, необходимо подключить библиотеку (смотрим скрин) для правильной работы кода. МатросНаЗебре, Извините Пожалуйста что по заимствовал ваш код. Сори. Мира и Здоровья всем!
 
Цитата
написал:
Извините Пожалуйста что по заимствовал ваш код
Нет проблем.
 
euric83, И да, у вас в примере файла "report" в "Состояние контролируемого параметра " указано 12 параметров а по сути в просматриваемых файлах эти параметры в количестве 14 штук. Скорее всего вы в спешке когда создавали файл пример напутали с "Состояние контролируемого параметра ", количество не то. Удачи.
 
Я об этом сразу как появились файлы и сказал, в №9
Куда спешить писать код...
 
Для ориентира: тест на сбор 1500 файлов в папках, pq отработал за ~10 сек.
 
sotnikov, А за сколько отработает вариант из #18-го поста? Ради интереса.
P.S. Отошёл от компьютера я.
 
Ребята, спасибо Вам большое, что Вы откликнулись и помогаете в решении моей задачи!

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

Я похоже переоценил свои возможности. Не могу даже найти где Microsoft ActivX Data Object включить как показано на скриншоте в cообщении #18.

И в сообщении #17 я не понимаю как использовать код.

Я только начинаю вникать в данную тему (сегодня второй день). Может я что-то не понимаю / не замечаю очевидное не требующее прояснения в Вашем кругу профессионалов?


Я немного поправил файл report: изменил кол-во параметров с 12 до 14 в таблице, и в файлах chek-list  в папках и внес рандомные цифры.

Буду признателен если немного поясните как применить Ваш код  к данному тестовому отчету.

Спасибо,
Изменено: euric83 - 15.07.2024 17:02:44
 
Код
Option Explicit

Public fso As Object
Private folder_name As String
Private rOut As Range

Sub myCheckDontOpen()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set rOut = ActiveSheet.Range("B6")
    
    Application.ScreenUpdating = False
    Dim Application_Calculation As XlCalculation
    Application_Calculation = Application.Calculation
    Application.Calculation = xlCalculationManual
    
    CheckFolder ThisWorkbook.Path
    
    Application.Calculation = Application_Calculation
    Application.ScreenUpdating = True
End Sub

Private Sub CheckFolder(sPath As String)
    Dim curFold As Object
    If fso.FolderExists(sPath) Then Set curFold = fso.GetFolder(sPath)
    If curFold Is Nothing Then Exit Sub
    
    Dim sFile As String
    sFile = sPath & "\check-list.xlsx"
    If fso.FileExists(sFile) Then
        folder_name = curFold.Name
        FileJob sFile
    End If
    
    Dim subFold As Object
    For Each subFold In curFold.SubFolders
        CheckFolder CStr(subFold)
    Next
End Sub

Private Sub FileJob(sFull As String)
    Application.StatusBar = folder_name
    rOut.Value = folder_name
    Dim xo As Long
    For xo = 1 To 16
        rOut.Cells(1, 1 + xo).FormulaR1C1 = "='" & fso.GetParentFolderName(sFull) & "\[" & fso.GetFileName(sFull) & "]Лист1'!R" & xo + 1 & "C3"
    Next
    Set rOut = rOut.Cells(2, 1)
    
    Application.StatusBar = False
    DoEvents
End Sub
 
Цитата
euric83 написал:
Я немного поправил файл report
- там с цифрами 6 файлов? У меня вытягивает в 6 строк,  и ещё 3 забивает пустотой, возможно другие с проблемами, нужно изучить....
Ну да, у "10      XV-9301-05B" в файле пробелов больше, наверное и с другими тоже накосячено.
Изменено: Hugo - 15.07.2024 17:33:48
 
Цитата
euric83 написал:
найти где Microsoft ActivX Data Object включить
в Екселе жамкаешь Alt + F11, откроется окно VBA, там в строке меню Tools - References, в открывшемся окне ищешь нужное ставишь галочку
Цитата
euric83 написал:
второй день как с макросами начал работать
значит уже знаешь где кодируется..
Цитата
euric83 написал:
в сообщении #17
там код для PQЮ, это уже другая песня.. ))
Изменено: BodkhiSatva - 15.07.2024 17:36:21
 
МатросНаЗебре пошёл другим путём, после него и мой код все файлы подтягивает ))
Вопрос  - нужно взять только к тем файлам названия каталогов которых в таблице, или нужно взять все файлы что есть в каталогах, и заполнить ПУСТУЮ таблицу?
Изменено: Hugo - 15.07.2024 17:56:15
 
Я не во всех ячейках  в чек листах внес цифры, где-то в папах чек-листы с пустотами вместо параметров.

На скорую руку заполнил данные в ручную, чтобы хоть что-то появлялась после запуска кода.


Пустоты будет  много в ячейках отчета  
Изменено: euric83 - 15.07.2024 18:24:15
 
Мой вариант тоже можно скорректировать чтоб работал как от МатросНаЗебре,  только будет не ссылки, а значения ставить.
Так даже проще, словарь не нужен будет.
Страницы: 1 2 След.
Читают тему
Наверх