web-dev-qa-db-fra.com

Nom du fichier sans nom d'extension VBA

J'ai besoin d'obtenir le nom du fichier sans l'extension par VBA. Je connais la propriété ActiveWorkbook.Name, mais si l'utilisateur a la propriété Windows Hide extensions for known file types désactivée, le résultat de mon code sera [Name.Extension]. Comment puis-je renvoyer uniquement le nom du classeur indépendant de la propriété windows?

J'essaie même ActiveWorkbook.Application.Caption mais je ne peux pas personnaliser cette propriété.

14
Liniel

Les réponses données ici peuvent déjà fonctionner dans des situations limitées, mais ne sont certainement pas la meilleure façon de s'y prendre. Ne réinventez pas la roue. Le objet système de fichiers dans la la bibliothèque Microsoft Scripting Runtime a déjà une méthode pour le faire. Il s'appelle GetBaseName . Il gère les points dans le nom du fichier tel quel.

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 pour l'ajout d'une référence à la bibliothèque de scripts

54
RubberDuck

Simple mais fonctionne bien pour moi 

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

L'utilisation de la fonction Split semble plus élégante que InStr et Left, à mon avis.

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
0
Bob Nightingale

Pour être bavard, la suppression de l'extension est démontrée pour Classeurs .. qui ont maintenant diverses extensions .. un nouveau Book1 non enregistré n'a pas d'ext . fonctionne de la même manière pour les fichiers

[code]

Fonction WorkbookIsOpen (FWNa $, facultatif 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 [/ Code]

0
Harry S

Cela obtient le type de fichier à partir du dernier caractère (évite donc le problème avec les points dans les noms de fichiers)

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

Fonction de fin

0
Jeremy Smith