Excel имя файла в макросе

The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

1

30.01.2017, 12:58. Показов 27667. Ответов 18

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Скрипт должен получить имя активного файла, создать его копию, и в копии имени заменить некоторые символы.
Например файл назывался «12File_Name.xlsm» нужно создать копию с именем «!55File_Name.xlsm». Подскажите как реализовать такую замену символов в имени.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Create_xls()
Sheets(1).Copy
With ActiveWorkbook
With .Sheets(1)
.Rows("11:" & .Rows.Count).Delete
.Columns("E:IV").Delete
End With
.SaveAs Filename:=ThisWorkbook.Path & "!55" & "ThisWorkbook.Name"
.Close True
End With
End Sub

т.е. проблема со строчкой

Visual Basic
1
.SaveAs Filename:=ThisWorkbook.Path & "!55" & "ThisWorkbook.Name"

Добавлено через 28 минут
Вот нашел на форуме такое решение

Visual Basic
1
.SaveAs Filename:=ThisWorkbook.Path & "!" & Replace(ActiveDocument.Name, "23", "55")

Но пишет ошибку Run-time error ‘424’ Object required.

=(



0



3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

30.01.2017, 13:58

2

Цитата
Сообщение от The_Fog
Посмотреть сообщение

Replace(ActiveDocument.Name

А причем здесь ActiveDocument?



0



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

30.01.2017, 14:15

 [ТС]

3

Я так понял

PureBasic
1
ActiveDocument.Name

с помощью этой функции можно получить имя файла. Если нет подскажите пожалуйста как получить это имя и заменить в нем пару символов.



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

30.01.2017, 14:19

4

Цитата
Сообщение от The_Fog
Посмотреть сообщение

ActiveDocument.Name

Это Word документ…
может так

Visual Basic
1
ThisWorkbook.Name



0



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

30.01.2017, 14:37

 [ТС]

5

Visual Basic
1
ThisWorkbook.Name

Не не не, я тоже думал что так, но не так =(

Тоже выдает ошибку =(



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

30.01.2017, 14:40

6

ThisWorkbook — это не активная книга, а книга с кодом, не факт что они совпадают!



0



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

30.01.2017, 15:22

 [ТС]

7

обе функции ошибку выдают

Visual Basic
1
.SaveAs Filename:=ThisWorkbook.Path & "!" & Replace(ActiveDocument.Name, "23", "55")



0



CyberHelp

6 / 6 / 1

Регистрация: 29.01.2017

Сообщений: 29

30.01.2017, 15:27

8

Visual Basic
1
2
3
4
5
6
Public Sub Fog()
Dim Fog1, Fog2 As String
Fog1 = ActiveWorkbook.Name
Fog2 = ActiveWorkbook.Path
ActiveWorkbook.SaveAs Filename:=Fog2 + "!55" + Fog1
End Sub

Этот макрос скопирует вам активный файл 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) Скиньте скриншот.
2) Вы код куда сохранили код макросов? В личную книгу макросов PERSONAL.XLSB?

У меня всё отлично работает.



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, Если проблема только в имени нового файла, то :

Visual Basic
1
2
3
4
5
6
Private Sub Test()
    Worksheets(1).Copy
    Rows("11:" & Rows.Count).Delete
    Columns("E:" & Columns.Count).Delete
    ActiveWorkbook.Close True, Replace(ThisWorkbook.FullName, "12", "!55")
End Sub



1



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

31.01.2017, 12:51

 [ТС]

13

Visual Basic
1
2
3
4
5
6
Public Sub Fog()
Dim Fog1, Fog2 As String
Fog1 = ActiveWorkbook.Name
Fog2 = ActiveWorkbook.Path
ActiveWorkbook.SaveAs Filename:=Fog2 + "!55" + Fog1
End Sub

Этот макрос скопирует вам активный файл excel в ту же директорию, где находится активный файл, при этом активный файл (например «файл1») будет закрыт и будет открыто окно сохраненного файла (например «!55файл1»).

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

Ваш код работает, а у меня почему то нет

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Create_xls()
Dim Fog1, Fog2 As String
 Fog1 = ActiveWorkbook.Name
Fog2 = Replace(Fog1, "ÆÄÓ", "ÝèÔ")
Sheets(1).Copy
With ActiveWorkbook
With .Sheets(1)
.Rows("11:" & .Rows.Count).Delete
.Columns("E:IV").Delete
End With
'ActiveWorkbook.Close True, Replace(ThisWorkbook.FullName, "ÆÄÓ.xlsm", "ÝèÔ.xlsm")
 
'.SaveAs Filename:=ThisWorkbook.Path & "!" & Replace(ThisWorkbook.FullName, "ÆÄÓ", "ÝèÔ")
.SaveAs Filename:=ThisWorkbook.Path & "!" + "Fog2"
.Close True
End With



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

31.01.2017, 12:52

14

The_Fog, что напишет

Visual Basic
1
msgbox ThisWorkbook.FullName



0



6 / 6 / 1

Регистрация: 29.01.2017

Сообщений: 29

31.01.2017, 17:11

15

Попробуйте заменить & на + везде



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

31.01.2017, 17:15

16

CyberHelp, вообще обычно рекомендуют делать наоборот



0



6 / 6 / 1

Регистрация: 29.01.2017

Сообщений: 29

31.01.2017, 17:24

17

Мой код тоже не работал пока я & не заменил на + :-D



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

31.01.2017, 17:26

18

Это интересно, не слышал о таком казусе. Это на какой системе такое?



0



The_Fog

0 / 0 / 2

Регистрация: 24.02.2016

Сообщений: 75

01.02.2017, 17:12

 [ТС]

19

Ошибка в моем коде была…
Вот правильный вариант :

Visual Basic
1
2
3
4
5
6
7
8
Sub Create_xls()
With ActiveWorkbook
With .Sheets(1)
.Rows("150:" & .Rows.Count).Delete
.Columns("Q:IV").Delete
End With
 
.SaveAs Filename:=.Path & "!" & Replace(.Name, "ЖДУ.xlsm", "ЭиФ.xlsm")



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

01.02.2017, 17:12

19

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)))

 

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)

Инженер не тот, кто все знает, а тот кто знает где найти ответ.

Доброго дня!

Обычно делаю так:

Перед открытием файла, запоминаю параметры исходного:

WBOld = Thisworkbook.Name
WSOld = ActiveSheet.Name

Теперь открываю нужный файл. Естественно, что он после открытия становится активным.
Ну а дальше варианты:
Если мне нужно из этого активного файла переписать данные в файл открывающий (например значение в ячейке E2, вызываемого файла, активный лист), то записываю данные в переменную (-нные) и затем:

  param=0
  param=cells(2,5).Value
  With workbooks(WBOld).Worksheets(WSOld)
     .cells(3,2)=param
     param=0
  End With

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

workbooks(WBOld).activate
Worksheets(WSOld).select

Вот кусок кода:

'собираем перечень использованных в эти даты объектов = Start ===
    'запоминаем исходные книгу и лист
    wobk = ThisWorkbook.Name
    wost = "DayWork"

        'Открываем Tbl&CC.xls
    ''Проверяем не открыта ли она уже,
    fil01 = False
    For Each wbk In Workbooks
        If wbk.Name = "Tbl&CC.xls" Then
            fil01 = True
            Exit For
        End If
    Next
    'если не открыта, то открываем
    If fil01 = False Then
        Application.ScreenUpdating = False '- отключаем обновление экрана
        Application.EnableEvents = False '- отключаем реакцию на события

                Workbooks.Open Filename:="\EnergypoleTbl&CC.xls", ReadOnly:=True, Password:="Wolf" '- только на чтение

                Application.EnableEvents = True '- включаем реакцию на события
    End If

        With Workbooks("Tbl&CC.xls").Worksheets("CCS")
        'определяем занятую данными область листа == Start ==
        Set blok = .UsedRange
        nREnd = blok.Row + blok.Rows.Count - 2
        Set blok = Nothing
        'определяем занятую данными область листа == Stop ==
        If nREnd < 3 Then
            MsgBox "База Табеля [Tbl&CC.xls] - ПУСТА!", vbQuestion + vbOKOnly, ""

                        closeTabel fil01

                        Exit Sub
        End If

                'формируем массив объектов
        k = 0
        ReDim arrNabor(k)
        datT = 0

                i = 0
        For i = nREnd To 4 Step -1
            datT = .Cells(i, 6).Value
            flgT = False
'Stop
            j = 0
            For j = LBound(arrVibor) To UBound(arrVibor)
                If datT = CDate(arrVibor(j)) Then
                    flgT = True
                End If
            Next j

                        If flgT = True Then
'
                datR = .Cells(i, 2).Text
                flgQ = False
                f = 0
                For f = LBound(arrNabor) To UBound(arrNabor)
                    If datR = arrNabor(f) Then
                        flgQ = True
                    End If
                Next f

                            If flgQ = False Then
                    If k > 0 Then
                        ReDim Preserve arrNabor(k)
                    End If
                    arrNabor(k) = datR
                    k = k + 1
                End If
            End If
'
            datT = 0
            datR = ""
        Next i

            End With

        Erase arrVibor

        closeTabel fil01

    Workbooks(wobk).Worksheets(wost).Activate

    'собираем перечень использованных в эти даты объектов = Stop ===

если непонятно — спрашивайте …

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?

Community's user avatar

asked Dec 13, 2009 at 5:12

Veera's user avatar

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.)

Andreas Covidiot's user avatar

answered Dec 13, 2009 at 9:57

Fionnuala's user avatar

FionnualaFionnuala

90.1k7 gold badges110 silver badges148 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

APW's user avatar

APWAPW

2913 silver badges3 bronze badges

1

   strScriptFullname = WScript.ScriptFullName 
   strScriptPath = Left(strScriptFullname, InStrRev(strScriptFullname,"")) 

answered Dec 13, 2009 at 5:18

Mitch Wheat's user avatar

Mitch WheatMitch Wheat

294k43 gold badges465 silver badges540 bronze badges

1

If you need path only this is the most straightforward way:

PathOnly = ThisWorkbook.Path

lucascaro's user avatar

lucascaro

15.9k3 gold badges37 silver badges47 bronze badges

answered Oct 27, 2018 at 5:39

Louis's user avatar

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's user avatar

Reeno

5,69911 gold badges39 silver badges50 bronze badges

answered Mar 17, 2021 at 4:17

TheAccountant's user avatar

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's user avatar

Emil

7,20117 gold badges77 silver badges134 bronze badges

answered Dec 14, 2016 at 12:41

user7296559's user avatar

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

Riccardo La Marca's user avatar

1

Скажем, я пишу VBA внутри своего excel файла sample.xls. Теперь я хочу получить полный путь sample.xls в моем VBA. Как это сделать?

4b9b3361

Ответ 1

Если вы имеете в виду VBA, то вы можете использовать FullName, например:

strFileFullName = ThisWorkbook.FullName

(обновлено с учетом комментариев: ранее использовавшийся ActiveWorkbook.FullName скорее всего, ошибался, если другие офисные файлы могут быть открыты (ed) и активны. Но в случае, если вы сохранили макрос в другом файле, как упомянуто пользователем @user7296559 здесь, и действительно нужно имя файла файла, использующего ActiveWorkbook, ActiveWorkbook может быть правильным выбором, если он гарантированно активен во время выполнения.)

Ответ 2

   strScriptFullname = WScript.ScriptFullName 
   strScriptPath = Left(strScriptFullname, InStrRev(strScriptFullname,"")) 

Ответ 3

Это простая альтернатива, которая дает все ответы: полное имя, путь, имя файла.

Dim FilePath, FileOnly, PathOnly As String

FilePath = ThisWorkbook.FullName
FileOnly = ThisWorkbook.Name
PathOnly = Left(FilePath, Len(FilePath) - Len(FileOnly))

Ответ 4

Если вам нужен только путь, это самый простой способ:

PathOnly = ThisWorkbook.Path

Ответ 5

ActiveWorkbook.FullName было бы лучше, я думаю, если у вас есть макрос VBA, хранящийся в другой книге Excel, но вы хотите получить информацию о Excel, который вы редактируете, а не о том, где находится макрос.

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

Ответ 6

Есть универсальный способ получить это:

Function FileName() As String
    FileName = Mid(Application.Caption, 1, InStrRev(Application.Caption, "-") - 2)
End Function

Это взято из snippets.dzone.com:

Function GetFilenameFromPath(ByVal strPath As String) As String
' Returns the rightmost characters of a string upto but not including the rightmost ''
' e.g. 'c:winntwin.ini' returns 'win.ini'

    If Right$(strPath, 1) <> "" And Len(strPath) > 0 Then
        GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
    End If
End Function

Gonzalo
16 нояб. 2009, в 18:15

Поделиться

Лучший способ работы с файлами и каталогами в VBA для Office 2000/2003 — использовать библиотеку скриптов. Добавьте ссылку на Microsoft Scripting Runtime (Инструменты > Ссылки в среде IDE).

Создайте объект файловой системы и выполните все операции с этим.

Dim fso as new FileSystemObject
Dim fileName As String
fileName = fso.GetFileName("c:any pathfile.txt")

FileSystemObject отлично. Он предлагает множество функций, таких как получение специальных папок (Мои документы и т.д.), Создание, перемещение, копирование, удаление файлов и каталогов объектно-ориентированным способом. Проверьте это.

Zen
18 нояб. 2009, в 13:52

Поделиться

Dir("C:Documentsmyfile.pdf")

вернет имя файла, но только если оно существует.

Dick Kusleika
22 нояб. 2009, в 15:14

Поделиться

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

Function FileNameFromPath(strFullPath As String) As String

    FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, ""))

End Function

http://vba-tutorial.com/parsing-a-file-string-into-path-filename-and-extension/ имеет этот код плюс другие функции для разбора пути файла, расширения и даже имени файла без расширения.

user2780436
05 окт. 2013, в 02:23

Поделиться

Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "")(UBound(Split(sFilePath, "")))

Artur Piwkowski
08 фев. 2013, в 15:45

Поделиться

Чтобы получить имя файла в макросе excel:

filname = Mid(spth, InStrRev(spth, "", Len(spth)) + 1, Len(spth))
MsgBox Mid(filname, 1, InStr(filname, ".") - 1)

niki
19 сен. 2012, в 15:09

Поделиться

Самый простой подход, если вы уверены, что файл физически существует на диске:

Dim fileName, filePath As String
filePath = "C:Documentsmyfile.pdf"
fileName = Dir(filePath)

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

fileName = Mid(filePath, InStrRev(filePath, "") + 1)

ePandit
23 март 2017, в 06:13

Поделиться

Здесь простое решение VBA, которое я написал, работает с путями Windows, Unix, Mac и URL.

sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "") + 1)

sFolderName = Left(sPath, Len(sPath) - Len(sFileName))

Вы можете проверить результат с помощью этого кода:

'Visual Basic for Applications 
http = "https://www.server.com/docs/Letter.txt"
unix = "/home/user/docs/Letter.txt"
dos = "C:userdocsLetter.txt"
win = "\Server01userdocsLetter.txt"
blank = ""

sPath = unix 
sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "") + 1)
sFolderName = Left(sPath, Len(sPath) - Len(sFileName))

Debug.print "Folder: " & sFolderName & " File: " & sFileName

Также см.: Википедия — Путь (вычисление)

Roberto
13 окт. 2013, в 18:38

Поделиться

Если вам требуется более надежное решение, которое даст вам полный путь к папке И имя файла, вот оно:

Dim strFileName As String, strFolderPath As String
Dim lngIndex As Long
Dim strPath() As String

strPath() = Split(OpenArgs, "")   'Put the Parts of our path into an array
lngIndex = UBound(strPath)
strFileName = strPath(lngIndex)    'Get the File Name from our array
strPath(lngIndex) = ""             'Remove the File Name from our array
strFolderPath = Join(strPath, "") 'Rebuild our path from our array

Или как суб/функция:

Private Sub SeparatePathAndFile(ByRef io_strFolderPath As String, ByRef o_strFileName As String)    
    Dim strPath() As String
    Dim lngIndex As Long

    strPath() = Split(io_strFolderPath, "")  'Put the Parts of our path into an array
    lngIndex = UBound(strPath)
    o_strFileName = strPath(lngIndex)   'Get the File Name from our array
    strPath(lngIndex) = ""              'Remove the File Name from our array
    io_strFolderPath = Join(strPath, "")     'Rebuild our path from our array  
End Sub

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

dnLL
04 дек. 2012, в 18:57

Поделиться

Попробуйте использовать функцию split, чтобы получить имя файла из пути:
Ссылка MSDN

jonaspp
16 нояб. 2009, в 17:36

Поделиться

Dim nme As String = My.Computer.FileSystem.GetFileInfo(pathFicheiro).Name
Dim dirc As String = My.Computer.FileSystem.GetFileInfo(nomeFicheiro).Directory

Paulos02
25 авг. 2015, в 10:27

Поделиться

Здесь альтернативное решение без кода. Этот VBA работает в строке формул Excel:

Чтобы извлечь имя файла:

=RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"","~",LEN(A1)-LEN(SUBSTITUTE(A1,"","")))))

Чтобы извлечь путь к файлу:

=MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"",""))))+1,LEN(A1))))

40-Love
23 авг. 2013, в 15:07

Поделиться

Это почерпнуто из Twiggy @http://archive.atomicmpc.com.au и других мест:

'since the file name and path were used several times in code
'variables were made public

Public FName As Variant, Filename As String, Path As String

Sub xxx()
   ...
   If Not GetFileName = 1 Then Exit Sub '
   ...
End Sub

Private Function GetFileName()
   GetFileName = 0 'used for error handling at call point in case user cancels
   FName = Application.GetOpenFilename("Ramp log file (*.txt), *.txt")
   If Not VarType(FName) = vbBoolean Then GetFileName = 1 'to assure selection was made
   Filename = Split(FName, "")(UBound(Split(FName, ""))) 'results in file name
   Path = Left(FName, InStrRev(FName, "")) 'results in path
End Function

Dan
03 окт. 2014, в 07:30

Поделиться

Мне нужен был путь, а не имя файла.

Итак, чтобы извлечь путь к файлу в коде:

JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "")(UBound(Split(sFileP, ""))))) 

Doug
03 окт. 2013, в 18:09

Поделиться

Ещё вопросы

  • 0Преобразование шестнадцатеричной строки в изображение
  • 1Ошибка при посещении класса AST
  • 0phpMyAdmin объяснение ошибок
  • 1Несколько спрайтов для сборного в Unity
  • 1Получить значения из JSON Parse Object в Object; Динамические ключи (JavaScript)
  • 0Почему SqlExceptionHelper интерпретирует нарушение логического ограничения как x00
  • 0QList :: at () возвращает ссылку на константу?
  • 0MySQL сохранить порядок в группе для дочерней таблицы
  • 1Попытка создать случайный массив, который я могу вызвать 5 раз, и который я могу проверить на ввод пользователя
  • 0Как ng-повторить массив внутри td, чтобы td содержал все значения массива
  • 1Невозможно получить доступ к спискам sharepoint, используя python
  • 1Как получить уникальное значение строки и вернуть логический результат в python pandas?
  • 0как получить значения всех элементов одного класса
  • 0Как создать модуль для модульного тестирования?
  • 1WCF KnownType Входные Entity Framework
  • 0Поведение boost :: condition_variable :: notify_one ()
  • 1Общая путаница с подстановочными знаками
  • 0В приложении AngularJS мы можем иметь несколько файлов служб
  • 0Вызов функций Javascript в порядке
  • 0Добавьте значение к существующему значению в почасовых интервалах с помощью jQuery
  • 0Почему эти объекты jQuery не работают?
  • 1Определить пакет тишины в байтовом массиве
  • 0Помощь по ошибкам PHP в цикле while
  • 0Использование $ .get () для получения локального HTML не работает в IE8
  • 0инициализация unique_ptr во время выполнения
  • 0PHP сортирует входной список textarea в нумерованный список
  • 0Шаблон электронной почты: Внутренние ссылки
  • 0Обработка аргументов командной строки для кода на c ++ для случайного и пользовательского ввода
  • 0Как бы вы вызывали данные из main и передавали их в функцию? (C ++)
  • 1Прозрачный StatusBar при свернутом
  • 0Выход из пустого пространства в PDO odbc
  • 1Почему Python logger не отображает информацию или сообщение об отладке на уровне logging.INFO?
  • 0Получение значения из JavaScript с помощью php preg_match
  • 0Зацикливание заполнения текстовых полей и нажатие кнопок в JS
  • 1Заменить значения столбца средним значением групп в кадре данных
  • 1открыть новый просмотр списка из предыдущего просмотра списка
  • 0ПЕРВИЧНЫЙ КЛЮЧ для таблицы с 2 столбцами, используемой для подсчета?
  • 0filter_var логическое возвращение false
  • 0Как автоматически открывать диалоговое окно JQuery UI в определенное время
  • 0Учимся у C Primer. Ожидаемая ошибка выражения Xcode
  • 1Повторяющиеся записи в ответе сервера .net
  • 1Страница делает слишком много HTTP-запросов в Angular2
  • 0Как проверить, какая переменная в коллекции используется?
  • 0MySQL перемещает или архивирует неиспользуемые данные
  • 0Может ли ссылочный параметр C ++ иметь то же имя, что и аргумент?
  • 0Уменьшите потребление ресурсов для скрытых элементов с помощью телефонной щели
  • 0Перенаправить на другой UI-маршрутизатор с тем же URL-адресом с сервера?
  • 0Попытка конвертировать старый mysql db на движке ARCHIVE в innodb
  • 0Чтение файла в Chrome
  • 0UI-Grid автоматически изменяет ширину столбцов после скрытия столбцов

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

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

  • Excel имя уже существует как убрать
  • Excel использование формул с примерами
  • Excel использование формул на диаграмме
  • Excel итоги на другой лист
  • Excel использование формул массива

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

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