Diálogo de archivo VBA .FileName Eliminando .1 desde el final del nombre del archivo

StackOverflow https://stackoverflow.com//questions/11657234

  •  11-12-2019
  •  | 
  •  

Pregunta

Estoy usando Visual Basic para escribir una macro para Autodesk Inventor. Creé una macro que llama un cuadro de diálogo de archivo, vea el código a continuación. Todo funciona bien, excepto cuando un usuario pone un nombre de archivo con un período y un número mayor que cero lo siguiente.

Por ejemplo, si un usuario pone a TestFile.test en la casilla y se realiza bien. Cuando pido lo que ponen allí usando .FileName, obtengo "TestFile.test". Al igual que debería.

Sin embargo, si el usuario pone el archivo TestFile.1 o TestFile.10 o TestFile.1MDSJ o cualquier cosa, siempre que un número mayor que cero siga directamente el período, vuelvo "TestFile". Por alguna razón, todo después del período y el período se quita.

¿Cuál es la razón de esto? ¿Es este un error en Visual Basic o estoy haciendo algo mal?

'Set up the file dialog
Dim oFileDlg As FileDialog
' Create a new FileDialog object.
Call ThisApplication.CreateFileDialog(oFileDlg)
'Define the filter to select part and assembly files or any file.
oFileDlg.Filter = "All Files (*.*)|*.*"
'Define the part and assembly files filter to be the default filter.
oFileDlg.FilterIndex = 1
'Set the title for the dialog.
oFileDlg.DialogTitle = "Save File As"
'Tell the dialog box to throw up and error when cancel is hit by user
oFileDlg.CancelError = True

'Show the file dialog
On Error Resume Next
oFileDlg.ShowSave

'save the user specified file
Dim newFileName As String
newFileName = oFileDlg.FileName

Actualización:

Terminé haciendo el siguiente "Hack" para hacer que las cosas sigan trabajando mientras se ocupan de un período:

oFileDlg.fileName = sFname & "."
oFileDlg.ShowSave
fullName = Left$(oFileDlg.fileName, Len(oFileDlg.fileName) - 1)

que funcionó bien durante bastante tiempo en Windows 7 y luego Windows 10. Desafortunadamente, la actualización creativa de Windows 10 parece haber cambiado la forma en que funciona el cuadro de diálogo Archivo. Con el código anterior, el nombre completo volvería en blanco si no hubiera períodos en el nombre y truncaría todo desde el primer período desde la izquierda si hubo un período en el nombre.

No estoy realmente seguro de lo que cambió en Windows 10, pero prácticamente destruyó mi hack. Windows 7 todavía funciona bien y Windows 10 antes de que funcione la actualización creativa. Terminé haciendo lo siguiente para hacer que todo vuelva a trabajar en la versión de Windows que mencioné anteriormente.

oFileDlg.fileName = sFname & ".00"
oFileDlg.ShowSave
fullName = Left$(oFileDlg.fileName, Len(oFileDlg.fileName) - 3)

¿Fue útil?

Solución

Esta es una propiedad de VB, pero también puede extenderse a VBA. ¿Ha intentado configurar la configuración de guardar para admitir extensiones multiplicadas? Prueba algo como esto:

SupportMultiDottedExtensions = True

Esta configuración está prevista. Permitir el uso de extensiones punteadas: lo que significa el uso de períodos en el nombre del archivo. Consulte esta referencia de MSDN para la documentación e información: http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.supportmultidottedextens.aspx##y129

Este artículo también puede arrojar más luz: Saveas Dialog con un período en el nombre de archivo no devuelve la extensión

editar

Después de verificar la documentación de Autodesk, una tarea difícil y desagradable, en mi opinión, de hecho, no parece haber apoyo a Multidottedextensions. Sin embargo, sí encontré una función en VBAExpress que me he adaptado muy estrechamente. La función se puede usar para filtrar las cadenas con contener caracteres inaceptables. El blog de Jimmy Pena tiene una excelente función para un propósito de este tipo: http:// www. jpsoftwaretech.com/excel-vba/validate-filenames/ . Solo he agregado sustancialmente un período y una reemplaza al código:

'A function for filtering strings, with a focus on filenames.
Function FilterFileNameString(stringToScrub As String) As String
'Filters a filename string - or any string for that matter.
Dim FilteredString As String

  'A highly nested replace function.
  FilteredString = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(stringToScrub, ".","|", ""), ">", ""), "<", ""), Chr(34), ""), "?", ""), "*", ""), ":", ""), "/", ""), "\", "") 

  'Returns filtered string.
  FilterFileNameString = FilteredString 
End Function

El blog de Jimmy Pena también contiene una versión recursiva, aunque no lo recomiendo.

Puede filtrar cualquier cadena que se utilizará como nombres de archivo con otro carácter, un espacio en este caso. Sin embargo, podrías usar un subrayado, o cualquier otro personaje que considere agradable.

En general, si está tratando de usar períodos de control de versiones o un propósito similar, e Inventor no le permitirá, aconsejaría encarecidamente ir a otro personaje o conjunto de caracteres que puedan proporcionar dicha indicación, tal subrayado " _ ", un sistema de numeración," 001 "," 002 ", un sistema de letras," AAA "," AAB ", o lo que tenga sentido para su enfoque.

Si solo está haciendo que la aplicación sea fácil de usar, sugeriría filtrar las cadenas ingresadas antes de guardarlas en el tipo de filetipo deseado, y separaría el filtrado de las cuerdas del cuadro de diálogo Guardar si el filtrado del período le da pena. Puede agregar un paso adicional, pero puede ser la mejor y más fácil manera de filtrar los caracteres inválidos molestos sin crear problemas adicionales innecesarios para sus usuarios.

~ jol

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top