Say, I’m writing a VBA inside my excel file sample.xls. Now I want to get the full path of sample.xls in my VBA. How do I do it?
asked Dec 13, 2009 at 5:12
2
If you mean VBA, then you can use FullName, for example:
strFileFullName = ThisWorkbook.FullName
(updated as considered by the comments: the former used ActiveWorkbook.FullName
could more likely be wrong, if other office files may be open(ed) and active. But in case you stored the macro in another file, as mentioned by user @user7296559 here, and really want the file name of the macro-using file, ActiveWorkbook
could be the correct choice, if it is guaranteed to be active at execution time.)
answered Dec 13, 2009 at 9:57
FionnualaFionnuala
90.1k7 gold badges111 silver badges150 bronze badges
3
this is a simple alternative that gives all responses, Fullname, Path, filename.
Dim FilePath, FileOnly, PathOnly As String
FilePath = ThisWorkbook.FullName
FileOnly = ThisWorkbook.Name
PathOnly = Left(FilePath, Len(FilePath) - Len(FileOnly))
answered Mar 13, 2017 at 9:44
APWAPW
2913 silver badges3 bronze badges
1
strScriptFullname = WScript.ScriptFullName
strScriptPath = Left(strScriptFullname, InStrRev(strScriptFullname,""))
answered Dec 13, 2009 at 5:18
Mitch WheatMitch Wheat
295k43 gold badges465 silver badges540 bronze badges
1
If you need path only this is the most straightforward way:
PathOnly = ThisWorkbook.Path
lucascaro
16.1k4 gold badges37 silver badges47 bronze badges
answered Oct 27, 2018 at 5:39
LouisLouis
392 bronze badges
if you need path only without file name:
ActiveWorkbook.Path
it would return D:Folder
if you need file path with file name also:
ActiveWorkbook.FullName
it would return D:Foldersample.xls
if you need file name only:
ActiveWorkbook.Name
it would return sample.xls
so if you want combine file path and file name to get full directory don’t forget to add “” between. otherwise its simpler using .Path
Reeno
5,71011 gold badges37 silver badges50 bronze badges
answered Mar 17, 2021 at 4:17
ActiveWorkbook.FullName would be better I think, in case you have the VBA Macro stored in another Excel Workbook, but you want to get the details of the Excel you are editing, not where the Macro resides.
If they reside in the same file, then it does not matter, but if they are in different files, and you want the file where the Data is rather than where the Macro is, then ActiveWorkbook is the one to go for, because it deals with both scenarios.
Emil
7,20117 gold badges76 silver badges134 bronze badges
answered Dec 14, 2016 at 12:41
There is a universal way to get this:
Function FileName() As String
FileName = Mid(Application.Caption, 1, InStrRev(Application.Caption, "-") - 2)
End Function
answered May 15, 2018 at 16:46
1
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||||||||||
1 |
||||||||||||
30.01.2017, 12:58. Показов 28471. Ответов 18 Метки нет (Все метки)
Скрипт должен получить имя активного файла, создать его копию, и в копии имени заменить некоторые символы.
т.е. проблема со строчкой
Добавлено через 28 минут
Но пишет ошибку Run-time error ‘424’ Object required. =(
0 |
3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
|
30.01.2017, 13:58 |
2 |
Replace(ActiveDocument.Name А причем здесь ActiveDocument?
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 14:15 [ТС] |
3 |
|||
Я так понял
с помощью этой функции можно получить имя файла. Если нет подскажите пожалуйста как получить это имя и заменить в нем пару символов.
0 |
toiai 3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
||||
30.01.2017, 14:19 |
4 |
|||
ActiveDocument.Name Это Word документ…
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 14:37 [ТС] |
5 |
|||
Не не не, я тоже думал что так, но не так =( Тоже выдает ошибку =(
0 |
6878 / 2810 / 534 Регистрация: 19.10.2012 Сообщений: 8,571 |
|
30.01.2017, 14:40 |
6 |
ThisWorkbook – это не активная книга, а книга с кодом, не факт что они совпадают!
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
30.01.2017, 15:22 [ТС] |
7 |
|||
обе функции ошибку выдают
0 |
CyberHelp 6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
||||
30.01.2017, 15:27 |
8 |
|||
Этот макрос скопирует вам активный файл excel в ту же директорию, где находится активный файл, при этом активный файл (например “файл1”) будет закрыт и будет открыто окно сохраненного файла (например “!55файл1”). Если вам необходимо, чтобы копия файла сохранялась отдельно, т.е. без закрытия оригинального файла, то немного другой код будет.
0 |
0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
|
30.01.2017, 16:53 [ТС] |
9 |
не получается ошибка…
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
30.01.2017, 17:30 |
10 |
1) Скиньте скриншот. У меня всё отлично работает.
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
30.01.2017, 17:37 |
11 |
Вот вложил файл. Зайдите и нажмите на кнопку.
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
30.01.2017, 18:13 |
12 |
|||
The_Fog, Если проблема только в имени нового файла, то :
1 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||||||
31.01.2017, 12:51 [ТС] |
13 |
|||||||
Этот макрос скопирует вам активный файл excel в ту же директорию, где находится активный файл, при этом активный файл (например “файл1”) будет закрыт и будет открыто окно сохраненного файла (например “!55файл1”). Если вам необходимо, чтобы копия файла сохранялась отдельно, т.е. без закрытия оригинального файла, то немного другой код будет. Ваш код работает, а у меня почему то нет
0 |
Hugo121 6878 / 2810 / 534 Регистрация: 19.10.2012 Сообщений: 8,571 |
||||
31.01.2017, 12:52 |
14 |
|||
The_Fog, что напишет
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
31.01.2017, 17:11 |
15 |
Попробуйте заменить & на + везде
0 |
6878 / 2810 / 534 Регистрация: 19.10.2012 Сообщений: 8,571 |
|
31.01.2017, 17:15 |
16 |
CyberHelp, вообще обычно рекомендуют делать наоборот
0 |
6 / 6 / 1 Регистрация: 29.01.2017 Сообщений: 29 |
|
31.01.2017, 17:24 |
17 |
Мой код тоже не работал пока я & не заменил на + 😀
0 |
6878 / 2810 / 534 Регистрация: 19.10.2012 Сообщений: 8,571 |
|
31.01.2017, 17:26 |
18 |
Это интересно, не слышал о таком казусе. Это на какой системе такое?
0 |
The_Fog 0 / 0 / 2 Регистрация: 24.02.2016 Сообщений: 75 |
||||
01.02.2017, 17:12 [ТС] |
19 |
|||
Ошибка в моем коде была…
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
01.02.2017, 17:12 |
19 |
I need to get file name without extension name by VBA. I know ActiveWorkbook.Name
property , but if user haves Windows property Hide extensions for known file types
turn off, the result of my code will be [Name.Extension]. How can I return only name of Workbook independent of windows property?
I try even ActiveWorkbook.Application.Caption
but I can’t customize this property.
asked Jan 13, 2015 at 14:02
0
The answers given here already may work in limited situations, but are certainly not the best way to go about it. Don’t reinvent the wheel. The File System Object in the Microsoft Scripting Runtime library already has a method to do exactly this. It’s called GetBaseName. It handles periods in the file name as is.
Public Sub Test()
Dim fso As New Scripting.FileSystemObject
Debug.Print fso.GetBaseName(ActiveWorkbook.Name)
End Sub
Public Sub Test2()
Dim fso As New Scripting.FileSystemObject
Debug.Print fso.GetBaseName("MyFile.something.txt")
End Sub
Instructions for adding a reference to the Scripting Library
answered Jan 13, 2015 at 14:51
RubberDuckRubberDuck
11.8k4 gold badges50 silver badges95 bronze badges
9
Simple but works well for me
FileName = ActiveWorkbook.Name
If InStr(FileName, ".") > 0 Then
FileName = Left(FileName, InStr(FileName, ".") - 1)
End If
answered Apr 19, 2017 at 7:39
IfcaIfca
1711 silver badge2 bronze badges
3
Using the Split function seems more elegant than InStr and Left, in my opinion.
Private Sub CommandButton2_Click()
Dim ThisFileName As String
Dim BaseFileName As String
Dim FileNameArray() As String
ThisFileName = ThisWorkbook.Name
FileNameArray = Split(ThisFileName, ".")
BaseFileName = FileNameArray(0)
MsgBox "Base file name is " & BaseFileName
End Sub
answered Jan 25, 2019 at 12:07
1
This gets the file type as from the last character (so avoids the problem with dots in file names)
Function getFileType(fn As String) As String
''get last instance of "." (full stop) in a filename then returns the part of the filename starting at that dot to the end
Dim strIndex As Integer
Dim x As Integer
Dim myChar As String
strIndex = Len(fn)
For x = 1 To Len(fn)
myChar = Mid(fn, strIndex, 1)
If myChar = "." Then
Exit For
End If
strIndex = strIndex - 1
Next x
getFileType = UCase(Mid(fn, strIndex, Len(fn) - x + 1))
End Function
answered Feb 20, 2019 at 16:05
You could always use Replace()
since you’re performing this on the workbook’s Name, which will almost certainly end with .xlsm
by virtue of using VBA.
Using ActiveWorkbook per your example:
Replace(Application.ActiveWorkbook.Name, ".xlsm", "")
Using ThisWorkbook:
Replace(Application.ThisWorkbook.Name, ".xlsm", "")
answered Nov 29, 2020 at 3:29
David MetcalfeDavid Metcalfe
2,1471 gold badge28 silver badges44 bronze badges
0
This thread has been very helpful to me lately. Just to extend on the answer by @RubberDuck, the File System Object in the Microsoft Scripting Runtime library is already there to achieve this. Also if you define it as an Object as below, it will save you the hassle of having to enable ‘Microsoft Scripting Runtime’ in VBA Tools > References:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Debug.Print fso.GetBaseName(ActiveWorkbook.Name)
In this way it will return name of the ActiveWorkbook without extension.
There is another way by using INSTRREV function as below:
Dim fname As String
fname = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
MsgBox fname
Both will return the same result. Also in both of the methods above, they will retain any full-stops in the file name and only get rid of the last full-stop and the file extension.
answered Jun 29, 2022 at 18:02
To be verbose it the removal of extension is demonstrated for
workbooks.. which now have a variety of extensions .
. a new unsaved Book1 has no ext
. works the same for files
Function WorkbookIsOpen(FWNa$, Optional AnyExt As Boolean = False) As Boolean
Dim wWB As Workbook, WBNa$, PD%
FWNa = Trim(FWNa)
If FWNa <> "" Then
For Each wWB In Workbooks
WBNa = wWB.Name
If AnyExt Then
PD = InStr(WBNa, ".")
If PD > 0 Then WBNa = Left(WBNa, PD - 1)
PD = InStr(FWNa, ".")
If PD > 0 Then FWNa = Left(FWNa, PD - 1)
'
' the alternative of using split.. see commented out below
' looks neater but takes a bit longer then the pair of instr and left
' VBA does about 800,000 of these small splits/sec
' and about 20,000,000 Instr Lefts per sec
' of course if not checking for other extensions they do not matter
' and to any reasonable program
' THIS DISCUSSIONOF TIME TAKEN DOES NOT MATTER
' IN doing about doing 2000 of this routine per sec
' WBNa = Split(WBNa, ".")(0)
'FWNa = Split(FWNa, ".")(0)
End If
If WBNa = FWNa Then
WorkbookIsOpen = True
Exit Function
End If
Next wWB
End If
End Function
answered Jan 29, 2017 at 21:44
Harry SHarry S
4616 silver badges5 bronze badges
I use a macro from my personal.xlsb and run it on both xlsm and xlsx files so a variation on David Metcalfe’s answer that I use is
Dim Wrkbook As String
Wrkbook = Replace(Application.ActiveWorkbook.Name, “.xlsx”, “.pdf”)
Wrkbook = Replace(Application.ActiveWorkbook.Name, “.xlsm”, “.pdf”)
answered Apr 6, 2021 at 14:04
VulkaVulka
134 bronze badges
Here is a solution if you do not want to use FSO.
There were some similar answers before, but here some checks are done to handle multiple dots in name and name without extension.
Function getFileNameWithoutExtension(FullFileName As String)
Dim a() As String
Dim ext_len As Integer, name_len As Integer
If InStr(FullFileName, ".") = 0 Then
getFileNameWithoutExtension = FullFileName
Exit Function
End If
a = Split(ActiveWorkbook.Name, ".")
ext_len = Len(a(UBound(a))) 'extension length (last element of array)
name_len = Len(FullFileName) - ext_len - 1 'length of name without extension and a dot before it
getFileNameWithoutExtension = Left(FullFileName, name_len)
End Function
Sub test1() 'testing the function
MsgBox (getFileNameWithoutExtension("test.xls.xlsx")) ' -> test.xls
MsgBox (getFileNameWithoutExtension("test")) ' -> test
MsgBox (getFileNameWithoutExtension("test.xlsx")) ' -> test
End Sub
answered May 2, 2022 at 16:37
LeoLeo
4203 silver badges18 bronze badges
strTestString = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
full credit: http://mariaevert.dk/vba/?p=162
answered Jan 13, 2015 at 14:20
bp_bp_
4024 silver badges14 bronze badges
9
Irbis_evs
Пользователь
Сообщений: 337
Регистрация: 30.03.2017
частично, забыл уточнить, что код открывает другой файл, необходимо вернуться обратно.
начало кода:
Код |
---|
Dim sh 'As Worksheet, i&, lRow Dim lSpisok, itable, dSpisok, prod, dd book = ThisWorkbook.Name ' Настройка списка фильтров Filt = ("XLS Files(*.xl*),*.xl*") 'Получение имени файла FileName1 = Application.GetOpenFilename(FileFilter:=Filt) ' При отмене выйти иэ окна If FileName1 = False Then MsgBox "Файл не выбран." End If Set objCloseBook = GetObject(FileName1) 'objCloseBook.Close False Windows("123.xlsm").Activate Worksheets("Список").Select ActiveSheet.Unprotect ' Отображение полного имени и пути 'MsgBox OpenWorkbook(GetObject(FileName1).Name) |
Инженер не тот, кто все знает, а тот кто знает где найти ответ.
|
|
|
Популярные разделы FAQ: Общие вопросы Особенности VBA-кода Оптимизация VBA-кода Полезные ссылки
1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость – сестра таланта.
3. Не забывайте использовать теги [сode=vba] …текст программы… [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
как получить имя текущего открытого файла?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): 1 |
Уважаемые форумчане, знаю в ВБА функция CurDir возвращает строковый параметр, определяющий текущую директорию файла. А есть ли функция возвращающая просто имя текущего открытого документа? (например, документа с расширением xls) |
Old Bat |
|
Moderator Рейтинг (т): 128 |
ActiveWorkbook.Name |
goodass |
|
Junior Рейтинг (т): 1 |
2 Old Bat добавлено |
Alex77 |
|
Full Member Рейтинг (т): 20 |
Myfle = Dir(DIRECTORY & “” & NAME & “.xml” ) ‘ Проверяем наличие файла If Myfle = “” Then ‘код если нет End If |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- VB for Application
- Следующая тема
[ Script execution time: 0,0227 ] [ 16 queries used ] [ Generated: 16.05.23, 04:42 GMT ]