Макрос эксель вставить в ячейку название файла

Обновлено: 02.07.2024

С помощью OLE можно включать контент из других программ, таких как Word или Excel.

OLE поддерживается многими различными программами, а OLE используется для того, чтобы содержимое, созданное в одной программе, было доступно в другой программе. Например, можно вставить документ Office Word в книгу Office Excel. Чтобы узнать, какие типы содержимого можно вставить, на вкладке Вставка в группе Текст нажмитекнопку Объект. В поле Тип объекта отображаются только программы, которые установлены на компьютере и поддерживают объекты OLE.

При копировании данных между Excel или любой программой, которая поддерживает OLE, например Word, вы можете скопировать их как связанный объект или внедренный объект. Основные различия между связанными и внедренными объектами заключается в том, где хранятся данные и как обновляется объект после его конечный файл. Внедренные объекты хранятся в книге, в которую они вставляются, и не обновляются. Связанные объекты остаются отдельными файлами, и их можно обновлять.

Связанные и внедренные объекты в документе

1. Внедренный объект не имеет подключения к исходным файлам.

2. Связанный объект связан с исходным файлом.

3. Исходный файл обновляет связанный объект.

Когда использовать связанные объекты

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

При связываемом объекте исходные данные сохраняются в исходном файле. В конечном файле отображается представление связанных данных, но хранится только расположение исходных данных (и размер, если объект является объектом диаграммы Excel). Исходный файл должен оставаться доступным на компьютере или в сети, чтобы сохранить связь с исходными данными.

Связанные данные могут обновляться автоматически при изменении исходных данных в исходном файле. Например, если вы вы выбрали абзац в документе Word, а затем вклеили его как связанный объект в книгу Excel, то при изменении сведений в документе Word сведения могут обновляться в Excel.

Когда использовать внедренные объекты

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

Когда пользователь открывает файл на другом компьютере, он может просмотреть внедренный объект, не имея доступа к исходным данным. Поскольку внедренный объект не имеет ссылок на исходный файл, он не обновляется при изменении исходных данных. Чтобы изменить внедренный объект, дважды щелкните его, чтобы открыть и изменить в программе-источнике. На компьютере должна быть установлена программа-источник (или другая программа, которая может редактировать объект).

Изменение способа отображения объекта OLE

Вы можете отобразить связанный объект или внедренный объект в книге точно так же, как в программа-источник или в качестве значка. Если книга будет просмотрена в Интернете и вы не собираетесь ее печатать, вы можете отобразить объект в виде значка. Таким образом уменьшается объем отображаемого пространства, занимаемого объектом. Пользователи, которые хотят отобразить сведения, могут дважды щелкнуть значок.

Иногда бывает необходимо заполучить на лист Excel список файлов в заданной папке и ее подпапках. В моей практике такое встречалось неоднократно, например:

  • перечислить в приложении к договору на проведение тренинга список файлов из раздаточных материалов для особо щепетильных юристов в некоторых компаниях
  • создать список файлов для ТЗ проекта
  • сравнить содержимое папок (оригинал и бэкап, например)

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

Способ 1. Скелет из шкафа - функция ФАЙЛЫ

Этот способ использует древнюю функцию ФАЙЛЫ (FILES) , оставшуюся в Microsoft Excel с далеких девяностых. Вы не найдете эту функцию в общем списке функций, но для совместимости, она всё ещё остаётся внутри движка Excel, и мы вполне можем её использовать.

1. В любую ячейку листа (например, в А1) введём путь к папке, список файлов из которой мы хотим получить.

Путь к папке

Обратите внимание, что путь должен оканчиваться шаблоном со звездочками:

  • *.* - любые файлы
  • *.xlsx - книги Excel (только с расширением xlsx)
  • *.xl* - любые файлы Excel
  • *отчет* - файлы, содержащие слово отчет в названии

2. Создадим именованный диапазон с помощью вкладки Формулы - далее кнопка Диспетчер имен - Создать (Formulas - Names Manger - Create) . В открывшемся окне введем любое имя без пробелов (например Мои_файлы) и в поле диапазона выражение:

Создаем именованный диапазон с функцией ФАЙЛЫ

После нажатия на ОК будет создан именованный диапазон с именем Мои_файлы, где хранится список всех файлов из указанной в А1 папки. Останется их оттуда только извлечь.

3. Чтобы извлечь имена отдельных файлов из созданной переменной, используем функцию ИНДЕКС (INDEX) , которая в Excel вытаскивает данные из массива по их номеру:

Список файлов

Если лениво делать отдельный столбец с нумерацией, то можно воспользоваться костылем в виде функции СТРОКИ (ROWS) , которая будет подсчитывать количество заполненных строк с начала списка автоматически:

=ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3) )

= ЕСЛИОШИБКА( ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3)) ; "")

Важное примечание : формально функция ФАЙЛЫ относится к макро-функциям, поэтому необходимо будет сохранить ваш файл в формате с поддержкой макросов (xlsm или xlsb).

Способ 2. Готовый макрос для ленивых

Если вы знакомы с макросами (не в смысле их программирования, а в смысле копипастинга готовых кодов на VBA), то вам, возможно, отлично зайдёт небольшой макрос, добавляющий в текущую книгу новый пустой лист и выводящий на него список всех файлов с их параметрами из заданной пользователем папки.

Для добавления макроса в вашу книгу нажмите сочетание клавиш Alt + F11 , или кнопку Visual Basic на вкладке Разработчик (Developer) , в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:

Для запуска макроса нажмите сочетание клавиш Alt + F8 ,или кнопку Макросы (Macros) на вкладке Разработчик (Developer) , выберите наш макрос FileList и нажмите кнопку Выполнить (Run) . В диалоговом окне выберите любую папку или диск и - вуаля!

Если захотите, чтобы вместо пути к файлу в столбце B выводилась живая гиперссылка, то замените 52-ю строку

Cells(r, 2).Formula = FileItem.Path

Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"

Способ 3. Мощь и красота - надстройка Power Query

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

Если у вас Excel 2016 или новее, то Power Query уже встроена в Excel по умолчанию, поэтому просто на вкладке Данные выберите команду Создать запрос / Получить данные - Из файла - Из папки (Create Query / Get Data - From file - From folder) . Если у вас Excel 2010-2013, то Power Query нужно будет скачать с сайта Microsoft и установить как отдельную надстройку и она появится у вас в Excel в виде отдельной вкладки Power Query. На ней будет аналогичная кнопка Из файла - Из папки (From file - From folder) .

В открывшемся окне нужно будет указать папку, содержимое которой мы хотим получить. После нажатия на ОК Power Query обшарит указанную папку и все вложенные подпапки и выдаст на экран окно с предварительным просмотром результатов:

Предварительный просмотр списка файлов в Power Query

Если внешний вид списка вас устраивает, то можно смело жать внизу кнопку Загрузить (Load) , чтобы залить эти данные на новый лист. Если же хочется дополнительно обработать список (удалить лишние столбцы, отобрать только нужные файлы и т.п.), то нужно выбрать команду Изменить / Преобразовать данные (Edit / Transform Data).

Поверх окна Excel откроется окно редактора Power Query, где мы увидим список всех наших файлов в виде таблицы:

Окно Power Query

Дальше возможны несколько вариантов:

    Если нужны только файлы определенного типа, то их можно легко отобрать с помощью фильтра по столбцу Extension:

Фильтр по расширению файла

Фильтры по дате

Фильтры по пути и папкам

После того, как необходимые файлы отобраны, можно смело удалить ненужные столбцы, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить (Remove column ) . Это, кстати, уже никак не повлияет на фильтрацию или сортировку нашего списка:

Готовый список

Если в будущем планируется подсчитывать количество файлов в каждой папке (например, для контроля поступивших заявок или подсчета статистики по заявкам), то имеет смысл дополнительно сделать ещё пару действий:

  • Щелкните правой кнопкой мыши по столбцу Folder Path и выберите команду Дублировать столбец (Duplicate Column) .
  • Выделите скопированный столбец и на вкладке Преобразование (Transform) выберите Разделить столбец - По разделителю (Split Column - By delimiter)

Мы получим рядом с нашими данными еще несколько столбцов, где будут продублированы имена вложенных папок - это пригодится нам чуть позже для подсчета статистики с помощью сводной таблицы:

Разделить столбец пути по разделителю

Получившиеся столбцы можно переименовать (Диск, Папка1, Папка2 и т.д.), просто щёлкнув дважды по заголовку каждого.

И, наконец, когда список готов, то его можно выгрузить на лист с помощью команды Главная - Закрыть и загрузить - Закрыть и загрузить в. (Home - Close & Load - Close & Load to. ) :

Выгруженные на лист результаты

И, само-собой, теперь можно построить по нашей таблице сводную (вкладка Вставка - Сводная таблица), чтобы легко подсчитать количество файлов в каждой папке:

Сводная со статистикой по каждой папке

Дополнительным бонусом можно сделать еще один столбец с функцией ГИПЕРССЫЛКА (HYPERLINK) , которая создаст красивые стрелочки-ссылки для моментального перехода к каждому файлу:

Функция ГИПЕРССЫЛКА

Мелочь, а приятно :)

И вдвойне приятно, что в будущем, при изменении содержимого исходной папки, достаточно будет просто щелкнуть мышью по нашей таблице и выбрать команду Обновить (Refresh) - и Power Query выполнит всю цепочку запрограммированных нами единожды действий уже автоматически, отобразив все изменения в составе папки.

в определенной папке есть файл у которого постоянно обновляется имя "файл_1" .. новая версия "файл_2" .. еще более новая "файл_3" и т.д. есть другой файл, который вытягивает из него определенную инфу.

данные, которые вытягиваются во второй файл вытягиваются посредством банального ВПР(), ГПР() и ПОИСКПОЗ() - в данной ситуации это наиболее удобно.

так вот, в эти функции ищут диапазоны из которых надо вытягивать данные через ДВССЫЛ в которой прописывается имя файла.

вопрос - как через макрос можно обновлять это имя??

т.е. надо чтобы при открытии, к примеру, ексель шел в определенную папку находил файл со словами в имени "файл", копировал имя файла полностью и вставлял в определенную ячейку в книге, после чего открывал эту книгу.

Sub Workbook_Open()
Dim i As Long, z As Long, ws As Worksheet, y As Variant
Dim fLdr As String
y = ".xls"
z = 1
fLdr = "C:\Мои документы"
Columns("A:A").Select
Selection.ClearContents
Range("A1").Select

With Application.FileSearch
.NewSearch
.LookIn = fLdr
.SearchSubFolders = True
.Filename = y
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
If Left$(.FoundFiles(i), 1) = Left$(fLdr, 1) Then
z = z + 1
Лист1.Cells(z + 1, 1).Resize(, 1) = Array(Dir(.FoundFiles(i)))
End If
Next i
End If
End With

Columns("A:A").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A1").Select
Workbooks.Open Filename:="C:\Мои документы\" & Range("A1")
End Sub

ЗЫ: Вместо C:\Мои документы укажите путь к папке, где лежат "файл_1" .. новая версия "файл_2". Макрос ищет все файлы с расширением .xls в указанной папке и записывает их в столбец А на Лист1, сортирует и в ячейке А1 получаем "старший" файл, который открывается.
Маленький нюанс: количество цифр в имени файла д.б. одинаковым для правильной сортировки. Т.е., если файлов больше 9 но меньше 100 имена должны начинаться с "файл_01".

Эта статья была написана Raddini Rahayu, Microsoft MVP.

Вот еженедельные отчеты о действиях продаж. Например, в этом случае имеется 15 человек. Нэнси, отчеты администратора, ей назначено суммировать все данные о продажах в один файл, где все продажи разделены на каждом листе. Чтобы легко организовать данные, каждый лист, который она дала, совпадает с именем продаж на этом листе. Сначала Нэнси чувствует себя комфортно с этим, но так как больше данных и требует быстрой обработки, она была настолько перегружена. Чтобы преодолеть это, Нэнси хочет, чтобы листы имен автоматически менялись в соответствии с именем продаж на каждом листе, не переименовывать его вручную.

Снимок экрана еженедельных отчетов о продажах.

Решения

Наилучшие решения для решения проблемы Нэнси — это использование макроса. Этот макрос предназначен для каждого листа в этом файле независимо от количества листов. Имя каждого листа будет изменяться в соответствии с именем продаж, которое было определено в одном расположении на каждом листе.

Выполнение

Первый шаг

Разработка форматов отчетов и указание расположения ячейки, где будет размещено имя продаж. В этом случае расположение находится на ячейке J2. Этот формат отчета должен быть одинаковым на каждом листе.

Храните имена листов в имени по умолчанию (Sheet1, Sheet2, Sheet3 и т.д.).

Снимок экрана, чтобы сохранить имена листов в имени по умолчанию.

Последний шаг

Шаг кодирования макроса

После того как мы знаем расположение ячейки, где будет размещено имя продаж, теперь мы можем продолжить следующий шаг — кодирование Макроса.

На вкладке Разработчик выберите Visual Basic в категории Code или нажмите клавишу Alt+F11 на клавиатуре, Visual Basic отображается окно.

Снимок экрана для Visual Basic в категории Code на вкладке Developer.

На области задач проекта нажмите кнопку Sales Report.xlsx (Имя книги), затем в меню Вставить выберите модуль и напишите следующий сценарий:

На скриншоте показаны действия для записи сценария в книге Report.xlsx продаж.

Нажмите клавишу F5key на клавиатуре, если отлаговка не закрывается Visual Basic окна и возвращается в Excel. Если отладка отладка, проверьте сценарий.

На скриншоте показано, как имя каждого листа переименовано после существующего имени продаж на каждом листе.

Вернись Excel и узнайте, что происходит, если коды верны, теперь имя каждого листа переименовано в соответствии с существующим именем продаж на каждом листе. Вот и все. Надеюсь, с пользой.

Заявление об отказе от ответственности за сведения о продуктах сторонних производителей

В этой статье упомянуты программные продукты независимых производителей. Корпорация Майкрософт не дает никаких гарантий, подразумеваемых и прочих, относительно производительности и надежности этих продуктов.

Читайте также: