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

Вход

Регистрация

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

 

= Мир MS Excel/Отобразить данные из закрытой книги по условиям в ячейках - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Отобразить данные из закрытой книги по условиям в ячейках (Макросы/Sub)
Отобразить данные из закрытой книги по условиям в ячейках
Сергей-К Дата: Вторник, 24.02.2015, 01:40 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброй ночи. Помогите с написанием макроса. Был проведён большой тест и требуется собрать в один документ данные по времени и собственно полученные результаты в виде числовых значений. Сегодня много времени провёл в поисковике с целью найти подходящую формулу, с помощью которой можно отобразить данные из другой книги, и похоже, что это можно сделать только с помощью функции ДВССЫЛ, но она не умеет отображать значения из книг, которые закрыты. Говорят, что с помощью макросов в Ексель можно сделать всё, помогите, пожалуйста, подтвердить или опровергнуть это мнение, уж больно много книг с результатами - более 900.
Чтобы сохранить правильное нахождение файлов в папках, я отправил небольшой набор документов в архив. И прошу прощения, ума не приложу, куда я дел форматы 2003 версии программы. Итак
- есть несколько сотен папок с порядковыми номерами от 1 до 900 в данном случае (их количество от теста к тесту будет разным). Папка "Тест2" была заархивирована с диска D
- в этих папках находятся документы с одинаковыми именами "Тест_2.xlsb"
- также известно количество папок с документами, я прикрепил 3 файла
Вышеуказанные условия забиты в ячейки документа по сбору данных, в диапазон A1:A3. Также, над таблицей, где очень хочется увидеть перенесённые результаты, указаны имена листов и адреса ячеек из этих листов.

Спасибо.

P.S. Ещё хотелось бы попросить знатоков, указать, что следует редактировать в коде при необходимости отобразить данные из другого места листа. Мой уровень знаний в VBA: запись макросов через встроенный рекордер и небольшое редактирование для сохранения и закрытия.

P.S. Или может всё-таки существует функция, способная отображать значения из закрытых книг?

Спасибо!
К сообщению приложен файл: 7498787.rar (29.1 Kb)


Сообщение отредактировал Сергей-К - Вторник, 24.02.2015, 01:53
 
Ответить
СообщениеДоброй ночи. Помогите с написанием макроса. Был проведён большой тест и требуется собрать в один документ данные по времени и собственно полученные результаты в виде числовых значений. Сегодня много времени провёл в поисковике с целью найти подходящую формулу, с помощью которой можно отобразить данные из другой книги, и похоже, что это можно сделать только с помощью функции ДВССЫЛ, но она не умеет отображать значения из книг, которые закрыты. Говорят, что с помощью макросов в Ексель можно сделать всё, помогите, пожалуйста, подтвердить или опровергнуть это мнение, уж больно много книг с результатами - более 900.
Чтобы сохранить правильное нахождение файлов в папках, я отправил небольшой набор документов в архив. И прошу прощения, ума не приложу, куда я дел форматы 2003 версии программы. Итак
- есть несколько сотен папок с порядковыми номерами от 1 до 900 в данном случае (их количество от теста к тесту будет разным). Папка "Тест2" была заархивирована с диска D
- в этих папках находятся документы с одинаковыми именами "Тест_2.xlsb"
- также известно количество папок с документами, я прикрепил 3 файла
Вышеуказанные условия забиты в ячейки документа по сбору данных, в диапазон A1:A3. Также, над таблицей, где очень хочется увидеть перенесённые результаты, указаны имена листов и адреса ячеек из этих листов.

Спасибо.

P.S. Ещё хотелось бы попросить знатоков, указать, что следует редактировать в коде при необходимости отобразить данные из другого места листа. Мой уровень знаний в VBA: запись макросов через встроенный рекордер и небольшое редактирование для сохранения и закрытия.

P.S. Или может всё-таки существует функция, способная отображать значения из закрытых книг?

Спасибо!

Автор - Сергей-К
Дата добавления - 24.02.2015 в 01:40
Leanna Дата: Вторник, 24.02.2015, 01:56 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
То что написано серым A1:A3 C1:K2 - в общей таблице так и останется? на это можно прикрепляться?


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеТо что написано серым A1:A3 C1:K2 - в общей таблице так и останется? на это можно прикрепляться?

Автор - Leanna
Дата добавления - 24.02.2015 в 01:56
Сергей-К Дата: Вторник, 24.02.2015, 02:09 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Leanna, да-да, в этих диапазонах указаны части адреса. Единственное, что не указано - это номера подпапок, в которых находятся сами документы с результатами
 
Ответить
СообщениеLeanna, да-да, в этих диапазонах указаны части адреса. Единственное, что не указано - это номера подпапок, в которых находятся сами документы с результатами

Автор - Сергей-К
Дата добавления - 24.02.2015 в 02:09
Leanna Дата: Вторник, 24.02.2015, 02:12 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
А эти подпапки можно перебирать по простому 1 2 3 4 итак до последней указанной в А3?


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеА эти подпапки можно перебирать по простому 1 2 3 4 итак до последней указанной в А3?

Автор - Leanna
Дата добавления - 24.02.2015 в 02:12
Сергей-К Дата: Вторник, 24.02.2015, 02:18 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Leanna, я не очень понимаю Ваш вопрос. Наверное да, ячейка A3 обязательна к заполнению, равно как и блоки A1:A2 и C1:K2


Сообщение отредактировал Сергей-К - Вторник, 24.02.2015, 02:26
 
Ответить
СообщениеLeanna, я не очень понимаю Ваш вопрос. Наверное да, ячейка A3 обязательна к заполнению, равно как и блоки A1:A2 и C1:K2

Автор - Сергей-К
Дата добавления - 24.02.2015 в 02:18
Leanna Дата: Вторник, 24.02.2015, 02:46 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
Я имела ввиду что папки пронумерованы в возрастающем порядке 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]
К сообщению приложен файл: bor_dannih.xlsb (21.8 Kb)


Лучше день потерять, потом за пять минут долететь!

Сообщение отредактировал Leanna - Вторник, 24.02.2015, 15:22
 
Ответить
СообщениеЯ имела ввиду что папки пронумерованы в возрастающем порядке 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]

Автор - Leanna
Дата добавления - 24.02.2015 в 02:46
Сергей-К Дата: Вторник, 24.02.2015, 03:09 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Leanna, Спасибо большое. Как я и думал, на код я буду смотреть огромными глазами. Жаль, что не смогу даже подумать о самостоятельном редактировании макроса. Код работает, завтра попробую на большем количестве документов. Ещё раз, спасибо!


Сообщение отредактировал Сергей-К - Вторник, 24.02.2015, 03:10
 
Ответить
СообщениеLeanna, Спасибо большое. Как я и думал, на код я буду смотреть огромными глазами. Жаль, что не смогу даже подумать о самостоятельном редактировании макроса. Код работает, завтра попробую на большем количестве документов. Ещё раз, спасибо!

Автор - Сергей-К
Дата добавления - 24.02.2015 в 03:09
Leanna Дата: Вторник, 24.02.2015, 03:26 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
Пожалуйста)
Если интересует могу комментарии по коду написать что где происходит.


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

Автор - Leanna
Дата добавления - 24.02.2015 в 03:26
Сергей-К Дата: Вторник, 24.02.2015, 03:27 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Да вот я бы очень хотел этого, напишите пожалуйста!
 
Ответить
СообщениеДа вот я бы очень хотел этого, напишите пожалуйста!

Автор - Сергей-К
Дата добавления - 24.02.2015 в 03:27
Сергей-К Дата: Вторник, 24.02.2015, 04:28 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Leanna, огромное спасибо ещё раз, только сейчас понял, как вы мне облегчили работу! Я даже разобрался, как отредактировать код и документ сбора для того, чтобы увеличить количество отображаемых данных: требуется дополнить 1 и 2 строчки, например, ввести названия листов и адреса ячеек ещё в 2 столбца, а в теле макроса изменить ReDim arr(0 To 7) на ReDim arr(0 To 9) и cellOut.Resize(dic.Count, 8) на cellOut.Resize(dic.Count, 10).

Спасибо!!! hands hands hands


Сообщение отредактировал Сергей-К - Вторник, 24.02.2015, 04:31
 
Ответить
СообщениеLeanna, огромное спасибо ещё раз, только сейчас понял, как вы мне облегчили работу! Я даже разобрался, как отредактировать код и документ сбора для того, чтобы увеличить количество отображаемых данных: требуется дополнить 1 и 2 строчки, например, ввести названия листов и адреса ячеек ещё в 2 столбца, а в теле макроса изменить ReDim arr(0 To 7) на ReDim arr(0 To 9) и cellOut.Resize(dic.Count, 8) на cellOut.Resize(dic.Count, 10).

Спасибо!!! hands hands hands

Автор - Сергей-К
Дата добавления - 24.02.2015 в 04:28
Leanna Дата: Вторник, 24.02.2015, 15:23 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
В сообщение #6 добавила комментарии.


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеВ сообщение #6 добавила комментарии.

Автор - Leanna
Дата добавления - 24.02.2015 в 15:23
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Отобразить данные из закрытой книги по условиям в ячейках (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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