Доброй ночи. Помогите с написанием макроса. Был проведён большой тест и требуется собрать в один документ данные по времени и собственно полученные результаты в виде числовых значений. Сегодня много времени провёл в поисковике с целью найти подходящую формулу, с помощью которой можно отобразить данные из другой книги, и похоже, что это можно сделать только с помощью функции ДВССЫЛ, но она не умеет отображать значения из книг, которые закрыты. Говорят, что с помощью макросов в Ексель можно сделать всё, помогите, пожалуйста, подтвердить или опровергнуть это мнение, уж больно много книг с результатами - более 900. Чтобы сохранить правильное нахождение файлов в папках, я отправил небольшой набор документов в архив. И прошу прощения, ума не приложу, куда я дел форматы 2003 версии программы. Итак - есть несколько сотен папок с порядковыми номерами от 1 до 900 в данном случае (их количество от теста к тесту будет разным). Папка "Тест2" была заархивирована с диска D - в этих папках находятся документы с одинаковыми именами "Тест_2.xlsb" - также известно количество папок с документами, я прикрепил 3 файла Вышеуказанные условия забиты в ячейки документа по сбору данных, в диапазон A1:A3. Также, над таблицей, где очень хочется увидеть перенесённые результаты, указаны имена листов и адреса ячеек из этих листов.
Спасибо.
P.S. Ещё хотелось бы попросить знатоков, указать, что следует редактировать в коде при необходимости отобразить данные из другого места листа. Мой уровень знаний в VBA: запись макросов через встроенный рекордер и небольшое редактирование для сохранения и закрытия.
P.S. Или может всё-таки существует функция, способная отображать значения из закрытых книг?
Спасибо!
Доброй ночи. Помогите с написанием макроса. Был проведён большой тест и требуется собрать в один документ данные по времени и собственно полученные результаты в виде числовых значений. Сегодня много времени провёл в поисковике с целью найти подходящую формулу, с помощью которой можно отобразить данные из другой книги, и похоже, что это можно сделать только с помощью функции ДВССЫЛ, но она не умеет отображать значения из книг, которые закрыты. Говорят, что с помощью макросов в Ексель можно сделать всё, помогите, пожалуйста, подтвердить или опровергнуть это мнение, уж больно много книг с результатами - более 900. Чтобы сохранить правильное нахождение файлов в папках, я отправил небольшой набор документов в архив. И прошу прощения, ума не приложу, куда я дел форматы 2003 версии программы. Итак - есть несколько сотен папок с порядковыми номерами от 1 до 900 в данном случае (их количество от теста к тесту будет разным). Папка "Тест2" была заархивирована с диска D - в этих папках находятся документы с одинаковыми именами "Тест_2.xlsb" - также известно количество папок с документами, я прикрепил 3 файла Вышеуказанные условия забиты в ячейки документа по сбору данных, в диапазон A1:A3. Также, над таблицей, где очень хочется увидеть перенесённые результаты, указаны имена листов и адреса ячеек из этих листов.
Спасибо.
P.S. Ещё хотелось бы попросить знатоков, указать, что следует редактировать в коде при необходимости отобразить данные из другого места листа. Мой уровень знаний в VBA: запись макросов через встроенный рекордер и небольшое редактирование для сохранения и закрытия.
P.S. Или может всё-таки существует функция, способная отображать значения из закрытых книг?
Leanna, да-да, в этих диапазонах указаны части адреса. Единственное, что не указано - это номера подпапок, в которых находятся сами документы с результатами
Leanna, да-да, в этих диапазонах указаны части адреса. Единственное, что не указано - это номера подпапок, в которых находятся сами документы с результатамиСергей-К
Я имела ввиду что папки пронумерованы в возрастающем порядке 1 2 3 и тд. Сделала макрос. [vba]
Код
Sub Сбор_тестов() 'присваиваем переменной объект - первый лист, активной рабочей книги Set shAct = ActiveWorkbook.Sheets(1) 'это словарь, этот словарь нужен что бы собрать данные об неотработанных файлах '(если по такому пути файла не существует то файл будет не отработан) Set dicFail = CreateObject("Scripting.Dictionary") ' в этот словарь будем складывать массивы arr где будут находиться данные построчно Set dic = CreateObject("Scripting.Dictionary") ' путь к папке с подпапками folder = [A1] ' имя файла из A2 fileTest = [A2] ' количество папок qty = [A3] ' присваиваем переменной ячейку с которой будет начинаться вывод данных в таблицу Set cellOut = [D5] ' номер колонки ячейки откуда начинается вывод данных ' понадобится для того что бы с верхних ячеек брать имя листа и ячейки cc = cellOut.Column ' цикл с 1 до цифры-колчество папок. Те перебираем папки. ' q будет принимать значения с 1 и до qty For q = 1 To qty ' в статус бар пишем номер обрабатываемой папки. Application.StatusBar = q ' путь к файлу file_path = folder & "\" & q & "\" & fileTest ' если по такому пути файла не найдено, то будет переход к следующей папке If Dir(file_path) = "" Then dicFail.Item(q) = 0&: GoTo skipFolder ' в фотоном режиме открывается файл, он условно у нас будет называться wb Set wb = GetObject(file_path) ' в этот массив будем помещать данные (предыдущие данные по другому q будут затираться ReDim arr(0 To 7) 'перебираем i с нуля и до верхней границы массива arr, здесь это 7 For i = 0 To UBound(arr) ' имя листа с которого брать данные находится в ячейке главной таблицы, ' первая строка, колонка = колонка первой ячейки вывода (cellOut) + смещение = i shName = shAct.Cells(1, cc + i) ' то же самое только вторая строка cell = shAct.Cells(2, cc + i) ' в массив в нужную полочку i складываем значение из wb - файл который открыли в фоновом режиме ' Sheets(shName) - нужный лист, - Range(cell) нужная ячейка arr(i) = wb.Sheets(shName).Range(cell) Next ' в словарь для значения q записываем то что насобирали в массив arr для этого q dic.Item(q) = arr ' закрываем без сохранения открытый в фоновом режиме файл wb.Close False ' это метка к которой придет процедура если путь к файлу не найден skipFolder: Next ' сбрасываем то что писали в статус баре Application.StatusBar = False ' вывод данных. ячейку cellOut (D4) "расширяем" до нужных размеров. ' т.е. нам надо что бы начиная с ячейки cellOut таблица расширилась вниз ' на то количество сколько записей в словаре насобирали ' вбок таблица расширится на обрабатываемое количество столбцов здесь 8 ' Application.Transpose(Application.Transpose(dic.items)) - не буду объяснять подробно ' - так скопом можно вывести массивы из значений словаря cellOut.Resize(dic.Count, 8) = Application.Transpose(Application.Transpose(dic.items)) ' эта строчка выдаст сообщение, если какие-то папки не обработались If dicFail.Count > 0 Then MsgBox "Не обработались папки: " & Join(dicFail.keys, ", ") End Sub
[/vba]
Я имела ввиду что папки пронумерованы в возрастающем порядке 1 2 3 и тд. Сделала макрос. [vba]
Код
Sub Сбор_тестов() 'присваиваем переменной объект - первый лист, активной рабочей книги Set shAct = ActiveWorkbook.Sheets(1) 'это словарь, этот словарь нужен что бы собрать данные об неотработанных файлах '(если по такому пути файла не существует то файл будет не отработан) Set dicFail = CreateObject("Scripting.Dictionary") ' в этот словарь будем складывать массивы arr где будут находиться данные построчно Set dic = CreateObject("Scripting.Dictionary") ' путь к папке с подпапками folder = [A1] ' имя файла из A2 fileTest = [A2] ' количество папок qty = [A3] ' присваиваем переменной ячейку с которой будет начинаться вывод данных в таблицу Set cellOut = [D5] ' номер колонки ячейки откуда начинается вывод данных ' понадобится для того что бы с верхних ячеек брать имя листа и ячейки cc = cellOut.Column ' цикл с 1 до цифры-колчество папок. Те перебираем папки. ' q будет принимать значения с 1 и до qty For q = 1 To qty ' в статус бар пишем номер обрабатываемой папки. Application.StatusBar = q ' путь к файлу file_path = folder & "\" & q & "\" & fileTest ' если по такому пути файла не найдено, то будет переход к следующей папке If Dir(file_path) = "" Then dicFail.Item(q) = 0&: GoTo skipFolder ' в фотоном режиме открывается файл, он условно у нас будет называться wb Set wb = GetObject(file_path) ' в этот массив будем помещать данные (предыдущие данные по другому q будут затираться ReDim arr(0 To 7) 'перебираем i с нуля и до верхней границы массива arr, здесь это 7 For i = 0 To UBound(arr) ' имя листа с которого брать данные находится в ячейке главной таблицы, ' первая строка, колонка = колонка первой ячейки вывода (cellOut) + смещение = i shName = shAct.Cells(1, cc + i) ' то же самое только вторая строка cell = shAct.Cells(2, cc + i) ' в массив в нужную полочку i складываем значение из wb - файл который открыли в фоновом режиме ' Sheets(shName) - нужный лист, - Range(cell) нужная ячейка arr(i) = wb.Sheets(shName).Range(cell) Next ' в словарь для значения q записываем то что насобирали в массив arr для этого q dic.Item(q) = arr ' закрываем без сохранения открытый в фоновом режиме файл wb.Close False ' это метка к которой придет процедура если путь к файлу не найден skipFolder: Next ' сбрасываем то что писали в статус баре Application.StatusBar = False ' вывод данных. ячейку cellOut (D4) "расширяем" до нужных размеров. ' т.е. нам надо что бы начиная с ячейки cellOut таблица расширилась вниз ' на то количество сколько записей в словаре насобирали ' вбок таблица расширится на обрабатываемое количество столбцов здесь 8 ' Application.Transpose(Application.Transpose(dic.items)) - не буду объяснять подробно ' - так скопом можно вывести массивы из значений словаря cellOut.Resize(dic.Count, 8) = Application.Transpose(Application.Transpose(dic.items)) ' эта строчка выдаст сообщение, если какие-то папки не обработались If dicFail.Count > 0 Then MsgBox "Не обработались папки: " & Join(dicFail.keys, ", ") End Sub
Leanna, Спасибо большое. Как я и думал, на код я буду смотреть огромными глазами. Жаль, что не смогу даже подумать о самостоятельном редактировании макроса. Код работает, завтра попробую на большем количестве документов. Ещё раз, спасибо!
Leanna, Спасибо большое. Как я и думал, на код я буду смотреть огромными глазами. Жаль, что не смогу даже подумать о самостоятельном редактировании макроса. Код работает, завтра попробую на большем количестве документов. Ещё раз, спасибо!Сергей-К
Сообщение отредактировал Сергей-К - Вторник, 24.02.2015, 03:10
Leanna, огромное спасибо ещё раз, только сейчас понял, как вы мне облегчили работу! Я даже разобрался, как отредактировать код и документ сбора для того, чтобы увеличить количество отображаемых данных: требуется дополнить 1 и 2 строчки, например, ввести названия листов и адреса ячеек ещё в 2 столбца, а в теле макроса изменить ReDim arr(0 To 7) на ReDim arr(0 To 9) и cellOut.Resize(dic.Count, 8) на cellOut.Resize(dic.Count, 10).
Спасибо!!!
Leanna, огромное спасибо ещё раз, только сейчас понял, как вы мне облегчили работу! Я даже разобрался, как отредактировать код и документ сбора для того, чтобы увеличить количество отображаемых данных: требуется дополнить 1 и 2 строчки, например, ввести названия листов и адреса ячеек ещё в 2 столбца, а в теле макроса изменить ReDim arr(0 To 7) на ReDim arr(0 To 9) и cellOut.Resize(dic.Count, 8) на cellOut.Resize(dic.Count, 10).