Имя файла без расширения VBA

Мне нужно получить имя файла без расширения имени VBA. я знаю ActiveWorkbook.Name свойство, но если у пользователя есть свойство Windows Hide extensions for known file types выключите, результатом моего кода будет [Name.Extension]. Как я могу вернуть только имя Workbook независимо от свойства windows?

Я стараюсь даже ActiveWorkbook.Application.Caption но я не могу настроить это свойство.

11 ответов

Решение
strTestString = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))

полный кредит: http://mariaevert.dk/vba/?p=162

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

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

Инструкция по добавлению ссылки в библиотеку сценариев

Просто, но у меня хорошо работает

FileName = ActiveWorkbook.Name 
If InStr(FileName, ".") > 0 Then 
   FileName = Left(FileName, InStr(FileName, ".") - 1) 
End If

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

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

В последнее время мне очень помогла эта тема. Чтобы расширить ответ @RubberDuck, объект файловой системы в библиотеке Microsoft Scripting Runtime уже существует для достижения этой цели. Кроме того, если вы определите его как объект , как показано ниже, это избавит вас от необходимости включать «Среду выполнения сценариев Microsoft» в Инструменты VBA> Ссылки :

      Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Debug.Print fso.GetBaseName(ActiveWorkbook.Name)

Таким образом, он вернет имя ActiveWorkbook без расширения.

Существует еще один способ использования функции INSTRREV, как показано ниже:

      Dim fname As String
fname = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") - 1)
MsgBox fname

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

Это получает тип файла, начиная с последнего символа (поэтому избегает проблемы с точками в именах файлов)

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

Конечная функция

Вы всегда можете использовать Replace() поскольку вы выполняете это с именем книги, которое почти наверняка закончится на .xlsm в силу использования VBA.

Используя ActiveWorkbook в вашем примере:

Replace(Application.ActiveWorkbook.Name, ".xlsm", "")

Используя ThisWorkbook:

Replace(Application.ThisWorkbook.Name, ".xlsm", "")

Я использую макрос из моего файла personal.xlsb и запускаю его как для файлов xlsm, так и для файлов xlsx, поэтому вариант ответа Дэвида Меткалфа, который я использую,

Dim Wrkbook как строка

Wrkbook = Заменить (Application.ActiveWorkbook.Name, «.xlsx», «.pdf»)

Wrkbook = Заменить (Application.ActiveWorkbook.Name, «.xlsm», «.pdf»)

Вот решение, если вы не хотите использовать FSO. Раньше было несколько похожих ответов, но здесь выполняются некоторые проверки для обработки нескольких точек в имени и имени без расширения.

      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

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

[код]

Функция WorkbookIsOpen(FWNa$, необязательный 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

Конечная функция [/code]

Ответ здесь: я думаю, что этот ответ хорош, пожалуйста, попробуйте его http://mariaevert.dk/vba/?p=162

Другие вопросы по тегам