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

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

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

Ответ 1

strTestString = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))

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

Ответ 2

Ответы, приведенные здесь, уже могут работать в ограниченных ситуациях, но, конечно же, это не лучший способ. Не изобретайте велосипед. Объект файловой системы в Microsoft Runtime библиотеки 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

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

Ответ 3

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

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

Ответ 4

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

[код]

Функция WorkbookIsOpen (FWNa $, необязательный AnyExt As Boolean = False) В качестве логического

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

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

Ответ 5

На мой взгляд, использование функции 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

Ответ 6

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