Caixa de diálogo de arquivo VBA .FileName removendo .1 do final do nome do arquivo

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

  •  11-12-2019
  •  | 
  •  

Pergunta

Estou usando o visual basic para escrever uma macro para o Autodesk Inventor.Criei uma macro que chama uma caixa de diálogo de arquivo, veja o código abaixo.Tudo funciona bem, exceto quando um usuário insere um nome de arquivo com um ponto final e um número maior que zero após ele.

Por exemplo, se um usuário colocar testfile.test na caixa e clicar em ok.Quando peço o que eles colocaram lá usando .FileName, recebo "testfile.test".Assim como eu deveria.

Porém, se o usuário colocar testfile.1 ou testfile.10 ou testfile.1mdksj ou qualquer coisa, desde que um número maior que zero siga diretamente o período, recebo de volta "testfile".Por algum motivo, tudo depois da menstruação e da menstruação é removido.

Qual é a razão para isto?Isso é um bug no visual basic ou estou fazendo algo errado?

'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

ATUALIZAR:

Acabei fazendo o seguinte "hack" para fazer as coisas ainda funcionarem ao lidar com um período:

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

Isso funcionou bem por um bom tempo no Windows 7 e depois no Windows 10.Infelizmente, a atualização do Windows 10 Creative parece ter mudado o funcionamento da caixa de diálogo do arquivo.Com o código acima, fullName voltaria em branco se não houvesse pontos no nome e truncaria tudo, desde o PRIMEIRO ponto a partir da esquerda, se houvesse um ponto no nome.

Não tenho certeza do que mudou no Windows 10, mas isso praticamente destruiu meu hack.O Windows 7 ainda funciona bem e o Windows 10 antes da atualização criativa funcionar.Acabei fazendo o seguinte para que tudo voltasse a funcionar na versão do Windows que mencionei acima.

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

Solução

Esta é uma propriedade do VB, mas também pode se estender ao VBA.Você já tentou definir as configurações de salvamento para suportar extensões multipontos?Tente algo assim:

SupportMultiDottedExtensions = True

Esta configuração destina-se a permitir o uso de extensões pontilhadas - ou seja, o uso de pontos no nome do arquivo.Consulte esta referência do MSDN para documentação e informações: http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.supportmultidottedextensions.aspx#Y129

Este artigo do SO também pode esclarecer mais: A caixa de diálogo SaveAs com um ponto final no nome do arquivo não retorna extensão

EDITAR

Depois de verificar a documentação da Autodesk - uma tarefa difícil e desagradável, na minha opinião - parece não haver suporte para MultidottedExtensions.No entanto, encontrei uma função no VBAExpress que adaptei de perto.A função pode ser usada para filtrar strings que contenham caracteres inaceitáveis.O blog de Jimmy Pena tem uma excelente função justamente para esse propósito: http://www.jpsoftwaretech.com/excel-vba/validate-filenames/.Eu apenas adicionei substancialmente um ponto final e uma substituição ao 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

O blog de Jimmy Pena também contém uma versão recursiva, embora ele não a recomende.

Você pode filtrar qualquer string a ser usada como nome de arquivo com outro caractere - um espaço neste caso.Você pode usar um sublinhado, entretanto, ou qualquer outro caractere que considere agradável.

Em geral, se você estiver tentando usar pontos para controle de versão ou para uma finalidade semelhante, e o inventor não permitir, eu recomendo fortemente que você vá para outro caractere ou conjunto de caracteres que possa fornecer tal indicação, como um sublinhado "_", um sistema de numeração, "001", "002", um sistema de letras, "AAA", "AAB" ou qualquer outro que faça sentido para o seu foco.

Se você está apenas tornando o aplicativo amigável, sugiro filtrar as strings inseridas antes de salvá-las no tipo de arquivo desejado e separar a filtragem das strings da caixa de diálogo Salvar se a filtragem do período lhe causar problemas.Pode adicionar uma etapa extra, mas pode ser a maneira melhor e mais fácil de filtrar caracteres inválidos incômodos sem criar problemas extras desnecessários para seus usuários.

~JOL

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top