Excel имя сохраняемого файла

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Посоветуйте пожалуйста, хочу сделать так, чтобы информация, которая содержится в определённой ячейке листа, стала бы именем сохраняемого файла.

В ячейке A1 листа 1 указана цифра «9», жму на «сохранить как» и хочу, чтобы в строку «имя файла» перенеслась бы цифра, содержащаяся в ячейке  A1 листа 1, в данном случае «9».

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#2

22.05.2015 17:59:08

В модуль книги («ЭтаКнига», НЕ в обычный модуль «Module1»!)

Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Static esc As Boolean
If esc Then Exit Sub
If SaveAsUI Then
  esc = True
  Cancel = True
  Application.Dialogs(xlDialogSaveAs).Show Range("A1")
  esc = False
End If
End Sub

Изменено: Казанский22.05.2015 18:00:22

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Казанский

Спасибо, получилось!

Подскажите пожалуйста, как сделать так,  чтобы данные, содержащиеся в двух строчках  в ячейках b2:c2 и ячейках b3:c3 стали бы именем сохраняемого файла «акт проверки деталей партии № 455». Если бы желаемое имя сохраняемого файла находилось бы в одной строке, то ясно, что надо в строке Show Range указать диапазон, например, Show Range(«b2:c2»). А вот что сделать, если желаемое имя сохраняемого файла находится в двух строках?

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#4

23.05.2015 09:41:43

Цитата
Olga H. написал: что сделать, если желаемое имя сохраняемого файла находится в двух строках

перечислить ячейки в коде выше

Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Static esc As Boolean
If esc Then Exit Sub
If SaveAsUI Then
  s$ = Join(Array([B2], [B3]), "")  'переменная из значений 2х ячеек 
  esc = True
  Cancel = True
  Application.Dialogs(xlDialogSaveAs).Show s  
  esc = False
End If
End Sub

Изменено: JeyCi23.05.2015 09:43:07

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

JeyCi

. В отношении  » ‘переменная из значений 2х ячеек», покажите пожалуйста в строчке макроса, как эта переменная будут выглядеть в приложении к моему Примеру 2

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

уже показала ячейки B2, B3 и подписала в комменте…
код должен находиться там же, где указал Казанский…
прежде, чем задавать вопрос — пробуйте разобраться сами, когда уже всё написано…
непонятно ваше непонимание  

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

JeyCi

, извините, я не очень хорошо знаю терминологию по макросам. Что означает в отношении моего Примера 2   ‘переменная из значений 2х ячеек?

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#8

23.05.2015 10:44:20

Цитата
Olga H. написал: Что означает

для кода — ничего не означает — комментарии не исполняются — просто для инфо…

Цитата
JeyCi написал: подписала в комменте…

для вас — просто прочитать, чтобы понять… неизвестные слова лучше прогуглить, если хотите узнать терминологию макросов ;) для продуктивной работы
p.s. ответ по теме дан — просто примените его

Изменено: JeyCi23.05.2015 10:45:42

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

JeyCi

, спасибо, всё получилось!  Просто подумала, что по вашему примечанию «‘переменная из значений 2х ячеек » требуется дополнительно что то писать в строку макроса s$ = Join(Array([B2], [B3], «»), что то указывать в кавычках этой строки. На самом деле ничего не надо добавлять. Спасибо.

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#10

23.05.2015 10:52:24

Цитата
Olga H. написал: что то указывать в кавычках этой строки

кавычки пустые в данном случае дают пробел между значениями 2х ячеек,
— это разделитель (см справку функции Join — в редакторе vba кнопка F1)
— если поставите в кавычки любой символ(ы), то они пропишутся между значениями ячеек — например, запятую…
хорошо, что разобрались — не бойтесь тестировать СВОИ идеи  

Изменено: JeyCi23.05.2015 10:53:58

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

JeyCi

, подскажите пожалуйста, что необходимо сделать если в ячейках, данные в которые становятся именем сохраняемого файла, имеется элемент, который построен с помощью ActiveХ и в окошке этого элемента указаны данные? Чтобы имя сохраняемого файла было бы «акт проверки деталей партии № 455».

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#12

24.05.2015 09:28:44

Цитата
Olga H. написал: если в ячейках, данные в которые становятся именем сохраняемого файла, имеется элемент, который построен с помощью ActiveХ

я не использую такие варианты!!…, считаю, чем проще файл в обращении — тем удобнее его обслуживать…
если вы решили вставить этот Элемент — то разберитесь с его свойствами: можете назначить  Linked Cell — и результат будет в ячейке…
P.S. google в помощь по Элементам ActiveX

Изменено: JeyCi24.05.2015 09:37:32

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#13

24.05.2015 14:16:22

Цитата
Olga H. написал:
если в ячейках, данные в которые становятся именем сохраняемого файла, имеется элемент, который построен с помощью ActiveХ

Такого не может быть — ActiveX на листе находится НАД ячейкой. Делайте, как советует JeyCi — связывайте контрол с ячейкой.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

#14

02.06.2015 09:19:48

Подскажите пожалуйста, как сделать так, чтобы данные, содержащиеся в двух строчках в ячейках b2:c2 и b3:d3, стали бы именем сохраняемого файла, а именно акт проверки деталей партии № 455. Отличие от предыдущего моего примера № 2 в том, что теперь номер документа (455) расположен в отдельной ячейке (d3), а раньше он был в одной ячейке с текстом «деталей партии №». Помогите пожалуйста подредактировть указанный ниже макрос, чтобы имя сохраняемого документа стало акт проверки деталей партии № 455 Предыдущий работоспособный макрос:

Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Static esc As Boolean 
If esc Then Exit Sub 
If SaveAsUI Then 
  s$ = Join(Array([B2], [B3]), "")  'переменная из значений 2х ячеек 
  esc = True 
  Cancel = True 
  Application.Dialogs(xlDialogSaveAs).Show s   
  esc = False 
End If
End Sub

Прикрепленные файлы

  • Пример 4.xlsm (8.32 КБ)

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#15

02.06.2015 09:34:55

Код
s$ = Join(Array([B2], [C2], [B3], [D3]), "")
 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Ольга, Вы не первый день на форуме — коды следует оформлять тегом.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

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

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#18

02.06.2015 15:19:30

А может попробовать обычное сцепление?

Код
Ячейка1 & " " & ячейка2 & " " & ...
 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Уберите из строки точку — кавычек не будет.
Ну и двоеточие — его всё равно придётся удалять.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo, убрала точку и двоеточие и апострофы исчезли. А можно ли подредактировать макрос, чтобы точка и двоеточие в ячейке остались или же эти символы недопустимы в названии файла?

Подскажите пожалуйста, что необходимо сделать чтобы в названии файла между no (в книге это находится в ячейке E8) и 455 (в книге это находится в ячейке F8) был бы единичный пробел, а то они сейчас в названии файла сливаются.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Лист сохраняется под именем, указанным в ячейках A1:C1, то есть aa-bb-cc. Но если из крайней ячейки (C1) удалить данные (сс), то имя сохраняемого файла получается с «хвостиком» (тире после bb: то есть aa-bb-).

Подскажите пожалуйста, как изменить макрос (он записан в «ЭтаКнига»), чтобы при удалении данных из ячеек B1:C1 имя файла сохранялось бы без «хвостика», и было aa-bb или aa

 

Михаил Лебедев

Пользователь

Сообщений: 2855
Регистрация: 17.01.2013

#22

16.06.2015 10:09:55

Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Static esc As Boolean
If esc Then Exit Sub
If SaveAsUI Then
  s$ = [A1] & "-" & [B1] & "-" & [C1]
  For i = Len(s$) To 1 Step -1
    If Right(s$, 1) = "-" Then s$ = Left(s$, Len(s$) - 1) Else Exit For
  Next
  esc = True
  Cancel = True
  Application.Dialogs(xlDialogSaveAs).Show s
  esc = False
End If
End Sub

Изменено: Михаил Лебедев16.06.2015 10:12:02

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

#23

16.06.2015 10:23:16

Михаил Лебедев, спасибо, работает! Вставила ваш макрос в «ЭтаКнига» взамен того, который был в Примере 6, и «хвостики» в имени сохраняемого файла исчезают при удалении данных из ячеек B1:C1.

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

Содержание

  1. Исходные данные
  2. Сохранение файла Excel с названием из ячейки — с привязкой к этой ячейке
  3. Добавление кнопки в Excel для запуска макроса
  4. Сохранение файла Excel с названием из ячейки — без привязки к ячейке
  5. Сохранение файла Excel с названием, которое сформировано из значений двух ячеек

Исходные данные

Сначала давайте разберем исходные данные, которые я буду использовать в примерах. Пусть это будет некая абстракция марок автомобилей с указанием их VIN номера.

Примечание! Я использую Excel 2013.

Скриншот 2

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

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

Заметка! Этапы разработки программы – как создаются и проектируются программы?

Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.

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

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

Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.

Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».

Код процедуры

   
   Sub SaveFile()

   'Объявление переменных
   Dim CellValue As String
   Dim Path As String
   Dim FinalFileName As String

   'Временно отключаем показ вспомогательных сообщений
   Application.DisplayAlerts = False

   'Задаём каталог сохранения файла (в данном случае текущий каталог)
   Path = ThisWorkbook.Path & ""

   'Получаем значение ячейки
   CellValue = Range("B14")

   'Формируем итоговый путь и название файла
   FinalFileName = Path & CellValue

   'Сохраняем файл
   ActiveWorkbook.SaveAs FileName:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbook
                      'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом

   'Включаем вывод сообщений
   Application.DisplayAlerts = True

   'Сообщение с результатом выполнения процедуры
   MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат"

  End Sub

После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).

В результате в моем случае процедура успешно выполнилась, файл сохранился с названием «Марка Авто 1», данное значение взято из ячейки B14, о чем будет свидетельствовать сообщение в конце процедуры. Файл сохранен в каталоге, где и исходный файл (во всех примерах ниже прописано то же самое, т.е. сохранение рядом с исходником, но это Вы можете изменить).

Скриншот 3

Заметка! Статический анализ кода в теории и на практике.

Добавление кнопки в Excel для запуска макроса

Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».

Скриншот 4

Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».

Скриншот 5

Курс по SQL для начинающих

В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.

Скриншот 6

Заметка! ТОП 7 популярных языков программирования.

Сохранение файла Excel с названием из ячейки — без привязки к ячейке

Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).

Замените код процедуры следующим кодом, который совсем немного, но изменен.

  
   Sub SaveFile()

  'Объявление переменных
   Dim CellValue As String
   Dim Path As String
   Dim FinalFileName As String

   'Временно отключаем показ вспомогательных сообщений
   Application.DisplayAlerts = False

   'Задаём каталог сохранения файла (в данном случае текущий каталог)
   Path = ThisWorkbook.Path & ""

   'Проверка значения ячейки
   If ActiveCell.Value = "" Then
     MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!"
     Exit Sub
   End If

   'Получаем значение активной ячейки
   CellValue = ActiveCell.Value

   'Формируем итоговый путь и название файла
   FinalFileName = Path & CellValue

   'Сохраняем файл
   ActiveWorkbook.SaveAs FileName:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbook
                      'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом

   'Включаем вывод сообщений
   Application.DisplayAlerts = True

   MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат"

   End Sub

Проверяем работу, становимся на нужную ячейку, и запускаем макрос (в процедуре я добавил проверку, если выбрана пустая ячейка, возникнет ошибка).

Скриншот 7

Как видим, все отработало.

Сохранение файла Excel с названием, которое сформировано из значений двух ячеек

Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.

В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.

Код процедуры в данном случае будет выглядеть следующим образом.

   
   Sub SaveFile()

   'Объявление переменных
   Dim CellValue As String
   Dim Path As String
   Dim FinalFileName As String

   'Временно отключаем показ вспомогательных сообщений
   Application.DisplayAlerts = False

   'Задаём каталог сохранения файла (в данном случае текущий каталог)
   Path = ThisWorkbook.Path & ""

   'Проверка значения ячеек B14 и D14
   If Range("B14").Value = "" Or Range("D14").Value = "" Then
     MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!"
     Exit Sub
   End If

   'Складываем значения из двух ячеек B14 и D14
   CellValue = Range("B14").Value & " - " & Range("D14").Value

   'Формируем итоговый путь и название файла
   FinalFileName = Path & CellValue

   'Сохраняем файл
   ActiveWorkbook.SaveAs FileName:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbook
                      'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом

   'Включаем вывод сообщений
   Application.DisplayAlerts = True

   MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат"

   End Sub

Запускаем макрос.

Скриншот 8

Все ОК, файл создан.

Заметка! Как измерить сложность кода программы при программировании?

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

Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.

Код процедуры

   
   Sub SaveFile()

   'Объявление переменных
   Dim CellValue As String
   Dim Path As String
   Dim FinalFileName As String

   'Временно отключаем показ вспомогательных сообщений
   Application.DisplayAlerts = False

   'Задаём каталог сохранения файла (в данном случае текущий каталог)
   Path = ThisWorkbook.Path & ""

   'Проверка номера столбца
   If ActiveCell.Column <> 2 Then
     MsgBox "Указан некорректный столбец", vbCritical, "Ошибка!"
     Exit Sub
   End If

  'Проверка значения ячейки
   If ActiveCell.Value = "" Then
     MsgBox "В ячейке отсутствует значение", vbCritical, "Ошибка!"
     Exit Sub
   End If

   'Получаем значение активной ячейки
   CellValue = ActiveCell.Value

   'Смещаемся на 2 столбца, относительно активной ячейки
   ActiveCell.Offset(0, 2).Select

   'Складываем значения из двух ячеек
   CellValue = CellValue & " - " & ActiveCell.Value

   'Формируем итоговый путь и название файла
   FinalFileName = Path & CellValue

   'Сохраняем файл
   ActiveWorkbook.SaveAs FileName:=FinalFileName, _
                      FileFormat:=xlOpenXMLWorkbook
                      'FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Для сохранения файла с макросом

   'Включаем вывод сообщений
   Application.DisplayAlerts = True

   MsgBox "Файл успешно сохранен с названием - " & CellValue, vbInformation, "Результат"

   End Sub

Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.

Заметка! Опрос. Какой операционной системой Вы пользуетесь?

У меня на этом все, надеюсь, материал был Вам полезен, пока!

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Еще…Меньше

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

Вставка текущего имени файла, его полного пути и имени активного листа

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

=ЯЧЕЙКА(«filename»)

Вставка текущего имени файла и имени активного листа

Введите или вставьте следующую формулу в виде формула массива, чтобы отобразить текущее имя файла и имя активного листа.

=ПРАВСИМВ(ЯЧЕЙКА(«filename»);ДЛСТР(ЯЧЕЙКА(«filename»))- МАКС(ЕСЛИ(НЕ(ЕОШ(ПОИСК(«»;ЯЧЕЙКА(«filename»); СТРОКА(1:255))));ПОИСК(«»;ЯЧЕЙКА(«filename»);СТРОКА(1:255)))))

Примечания: 

  • Чтобы ввести формулу в виде формулы массива, нажмите клавиши CTRL+SHIFT+ВВОД.

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

Вставка только текущего имени файла

Введите или вставьте следующую формулу, чтобы вставить имя текущего файла в ячейку.

=ПСТР(ЯЧЕЙКА(«filename»);ПОИСК(«[«;ЯЧЕЙКА(«filename»))+1; ПОИСК(«]»;ЯЧЕЙКА(«filename»))-ПОИСК(«[«;ЯЧЕЙКА(«filename»))-1)

Примечание: Если вы используете эту формулу на несохраненном листе, вы увидите сообщение об ошибке #ЗНАЧ! в ячейке. После сохранения листа ошибка заменяется именем файла.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

Нужна дополнительная помощь?

In this guide, we’re going to show you how to get filename from path in Excel. We will cover how to do this with and without VBA.

Download Workbook

File path and file name

A file path is a string identifier that specifies the unique location in a file system. It contains folders in a hierarchical order following by a file name. Each element is separated by a delimiter which is usually a backslash «». The goal of getting filename from path is to parse that filename after the last delimiter.

Warning: If your paths contain another separator, update the formulas by replacing backslash («») with the separator character fits your case.

We will show you four different approaches to get filename from path in Excel.

Conservative method

Our first approach is using well known Excel functions MIN, SUBSTITUE and LEN to get the file name. You can use this formula in any Excel version.

=MID(<path>,FIND(«*»,SUBSTITUTE(<path>,»»,»*»,LEN(<path>)-LEN(SUBSTITUTE(<path>,»»,»»))))+1,LEN(<path>))

This formula has couple of steps:

  1. At the inner section, all separators («») get replaced with empty strings.
  2. The formula subtracts the length of substituted path (1) from original path to find the number of separators.
  3. The outer SUBSTITUTE function replaces the last separator («») with «*». Obviously, the last separator’s instance is equal to number of separators (2).
  4. Finally, the FIND locates the «*» character, and the MID function parses the file name after the character.

How to get filename from path in Excel 02 - Conservative

VBA with FileSystemObject

You can use VBA to create your own custom functions which you can use in worksheet as well. Of course, you can use this function in your macros as well.

The code is very short. It uses GetFileName method of FileSystemObject object. The important section of the code is the initializing of the object. The following code sets FileSystemObject object to fso variable.

Set fso = CreateObject(«Scripting.FileSystemObject»)

Once the object is initialized, use the GetFileName method by providing the path.

GetFileNameFromPath_FSO = fso.GetFileName(«C:Excel FilesDashboards.xlsm»)

The above line returns «Dashboard.xlsm» string. Here is the function version you can use in your worksheets as well.

Function GetFileNameFromPath_FSO(ByVal Path As String) As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    GetFileNameFromPath_FSO = fso.GetFileName(Path)
End Function

How to get filename from path in Excel 03-VBA

VBA with a recursive function

A recursive function is function which calls itself. The recursive approach acts like an iteration and helps us to parse values starting from the end of a string. You could have used recursive functions only in VBA until the LAMBDA function has been released. Because the most of Excel users do not have access to the LAMBDA function, we will show you VBA version which any Excel user can use.

This function has only few rows as well. The function’s name is GetFilenameFromPath_Recursive and take a single argument named Path.

The first row is a logical test that checks if the last character in the argument is a backslash («») or not and if the argument is not an empty string. If the test is passed, the function returns itself with the argument without its last character and the last character of the path. This is where the recursion occurs.

The function runs itself until coming up a backslash («») or not a character left. It parses the characters from the right side and combines them with each run.

The last row contains a standard End If statement which determines where the If block ends.

Function GetFilenameFromPath_Recursive(ByVal Path As String) As String
    If Right$(Path, 1) <> "" And Len(Path) > 0 Then
        GetFilenameFromPath_Recursive = GetFilenameFromPath_Recursive(Left$(Path, Len(Path) - 1)) & Right$(Path, 1)
    End If
End Function

Using LAMBDA to get filename from path

If you are Microsoft 365 subscriber, you can create recursive functions without using VBA. Briefly, the LAMBDA function is a special function that converts named ranges into user defined functions. Its syntax allows you to define arguments and a custom formula which uses that defined arguments.

For example, let’s say my custom function will have two arguments and returns multiplication of two arguments. All I need to is creating a named range, such as «MyLambda» and enter the following formula into Refers to box.

Syntax Sample Formula Sample Result
=LAMBDA(x, y, x*y) =MyLambda(2,3) 6

If you call the named range «MyLambda» in the «MyLambda» function, you will create a recursive function. Same logic can be applied to VBA function at previous section.

The following is the LAMBDA version of our VBA code. The function’s name is GetFileNameFromPath_Lambda. Check out how the function calls itself after IF function’s logical test.

=LAMBDA(Path,IF(AND(RIGHT(Path,1)<>»»,LEN(Path)>0),GetFileNameFromPath_Lambda(LEFT(Path,LEN(Path)-1))&RIGHT(Path,1),»»))

Warning: Do not forget to update formula name in the formula if you change the named range’s name. Otherwise, the function returns #NAME? error due to incorrect function name.

Using LAMBDA Function with different approach

Alternatively, you can use the LAMBDA function without calling the «function name».  The definition may sound complicated since you must call the function in the function by its name. This structure dictates you to update each occurrence of the name every time change the function’s name.

You can overcome this necessity by using another Microsoft 365-specific function called LET. The LET function allows you to define named ranges in a formula scope. You can define repeating values or blocks into these names and use them continuously.

If you define the name of the LAMBDA function in the formula, you can use the in-formula name over and over to make the function recursive. In our example, we create the name «Func» in the formula and call it within self. Outer LAMBDA function is to give the whatever name we want, «GetFileNameFromPath_LambdaMe».

=LAMBDA(Path,LET(Func,LAMBDA(ME,Path,IF(AND(RIGHT(Path,1)<>»»,LEN(Path)>0),ME(ME,LEFT(Path,LEN(Path)-1))&RIGHT(Path,1),»»)),Func(Func,Path)))

Задавать свое имя файла при сохранении

Хомка

Дата: Пятница, 10.06.2016, 09:54 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый день. Есть необходимость при сохранении файла указывать необходимое имя файла в диалоговом окне. И так что бы это срабатывало при «Сохранить», «Сохранить как» и «Ctrl + S»
Сама додумалась только до
[vba]

Код

Sub FileSaveAs()
Dim AD As String
Dim fd As FileDialog
    AD = ActiveSheet.Range(«ИмяФайла»).Value & «.xlsm»

‘    With Application.Dialogs(Excel.xlDialogSaveAs)
‘        If .Show = -1 Then ThisDocument.SaveAs Filename:=.Name
‘    End With
    W = Application.ActiveWorkbook.Path

  Set fd = Application.FileDialog(msoFileDialogSaveAs)
With fd
.InitialFileName = AD
If .Show = 0 Then
Else
.Execute
End If
End With
Set fd = Nothing

End Sub

[/vba]

Но чувствую пошла не в том направлении :(

 

Ответить

sboy

Дата: Пятница, 10.06.2016, 10:07 |
Сообщение № 2

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

Добрый день.
Может это поможет?
[vba]

Код

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

End Sub

[/vba]


Яндекс: 410016850021169

 

Ответить

_Boroda_

Дата: Пятница, 10.06.2016, 10:15 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Сходите в макросы (Альт+F11) — ВБАПроджект (Контрл+R) — даблклик на «ЭтаКнига» для нужного файла. Вылезет окошко с двумя вып. списками наверху. В левом выберите Workbook (Все то, что напишется в этом окошке автоматически, потом сотрите), в правом выберите BeforeSave, а вот то, что напишется в окошке теперь, как раз Вам и нужно. Между Sub и End Sub и пишите свой код.
Вот справка
https://msdn.microsoft.com/en-us….5).aspx


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Хомка

Дата: Пятница, 10.06.2016, 11:13 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

_Boroda_, sboy, Спасибо) Диалог работает) clap

Возник еще один момент, можно ли как-то указать тип файла (*.xmlt) ?

 

Ответить

sboy

Дата: Пятница, 10.06.2016, 12:47 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

AD = ActiveSheet.Range(«ИмяФайла»).Value & «.xlsm»

[/vba]

если в этой строке поправить? не помогает?


Яндекс: 410016850021169

Сообщение отредактировал sboyПятница, 10.06.2016, 12:48

 

Ответить

Хомка

Дата: Пятница, 10.06.2016, 13:36 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

в этой строке указывается имя, а не тип. Да и «.xlsm» даже в имени почему-то не добавляет
[moder]Излишнее цитирование запрещено Правилами форума. Удалил[/moder]

Сообщение отредактировал _Boroda_Пятница, 10.06.2016, 14:17

 

Ответить

Хомка

Дата: Пятница, 10.06.2016, 14:56 |
Сообщение № 7

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

_Boroda_, Получается какая-то странная вещь :(
добавила свой код в BeforeSave и теперь открывается сперва мое окно для сохранения, потом стандартное. %) И если один раз сохранить то потом при очередном сохранении отображается только мое диалоговое окно. А так же по поводу формата. Пробовала уже брать то что выдает стандартный макрос при сохранении (FileFormat:=xlOpenXMLWorkbookMacroEnabled) он на него ругается :(

[vba]

Код

‘ThisWorkbook.SaveAs( Filename:=AD & «.xlms»
‘        , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False)
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim AD As String
Dim fd As FileDialog
    AD = ActiveSheet.Range(«ИмяФайла»).Value & «.xlsm»
Set fd = Application.FileDialog(msoFileDialogSaveAs)
With fd
.InitialFileName = AD
‘.FileFormat = xlOpenXMLWorkbookMacroEnabled
If .Show = 0 Then
‘Else
.Execute
Cancel = False

End If
End With
Set fd = Nothing

Cancel = False

End Sub

[/vba]

 

Ответить

Manyasha

Дата: Пятница, 10.06.2016, 16:37 |
Сообщение № 8

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Хомка,

указать тип файла (*.xmlt) ?

не поняла, что это за расширение, но xlOpenXMLWorkbookMacroEnabled(или 52) — это .xlsm.
Попробуйте использовать GetSaveAsFilename.
[vba]

Код

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False
    Dim AD As String
    Dim fd As FileDialog
    AD = ActiveSheet.Range(«ИмяФайла»).Value & «.xlsm»
    Dim Filename
    Filename = Application.GetSaveAsFilename(AD, «Книга с поддержкой макросов, *.xlsm»)
    Cancel = True
    If Filename <> False Then ActiveWorkbook.SaveAs Filename:=Filename, FileFormat:=52
    Application.EnableEvents = True
End Sub

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Excel имя на несколько ячеек
  • Excel имя модуля с ошибкой
  • Excel имя месяца по номеру
  • Excel имя месяца по дате
  • Excel имя листа уже используется

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии