Necesito obtener el nombre del archivo sin el nombre de la extensión por VBA. Conozco la propiedad ActiveWorkbook.Name
, pero si el usuario tiene desactivada la propiedad de Windows Hide extensions for known file types
, el resultado de mi código será [Name.Extension]. ¿Cómo puedo devolver sólo el nombre del Libro de Trabajo independientemente de la propiedad de Windows?
He probado incluso ActiveWorkbook.Application.Caption
pero no puedo personalizar esta propiedad.
Las respuestas dadas aquí ya pueden funcionar en situaciones limitadas, pero desde luego no son la mejor manera de hacerlo. No reinvente la rueda. El File System Object en la Microsoft Scripting Runtime library ya tiene un método para hacer exactamente esto. Se llama GetBaseName. Maneja los puntos en el nombre del archivo tal cual.
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
Instrucciones para añadir una referencia a la biblioteca de secuencias de comandos
Para ser verborreico se demuestra la eliminación de extensión para libros de trabajo .. que ahora tienen una variedad de extensiones . . un nuevo Libro1 sin guardar no tiene ext . funciona igual para los archivos
[code]
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 [/code]