Finestra di dialogo del file VBA .FileName Rimozione .1 Dalla fine del nome del file

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

  •  11-12-2019
  •  | 
  •  

Domanda

Sto usando Visual Basic per scrivere una macro per Autodesk Inventor. Ho creato una macro che chiama una finestra di dialogo file, vedere il codice qui sotto. Tutto funziona bene tranne quando un utente mette un nome di file con un periodo e un numero maggiore di zero che lo segue.

Ad esempio, se un utente inserisce testfile.test nella casella e colpisce OK. Quando chiedo cosa hanno messo lì usando .filename, ottengo "testfile.test". Proprio come dovrei.

Tuttavia, se l'utente inserisce testfile.1 o testfile.10 o testfile.1mdksj o qualsiasi cosa fino a quando un numero maggiore di zero segue direttamente il periodo che recupera "TestFile". Per qualche ragione, tutto dopo il periodo e il periodo viene rimosso.

Qual è il motivo per questo? È un bug in Visual Basic o sto facendo qualcosa di sbagliato?

'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
.

Aggiornamento:

Ho finito per fare il seguente "hack" per far funzionare le cose mentre si tratta di un periodo:

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

che ha funzionato bene per un bel po 'su Windows 7 e poi Windows 10. Sfortunatamente, l'aggiornamento creativo di Windows 10 sembra aver cambiato come funziona la finestra di dialogo del file. Con il codice sopra riportato, FullName tornerebbe in bianco se non ci fossero periodi nel nome e troncarebbe tutto dal primo periodo da sinistra se c'è stato un periodo nel nome.

Non sono proprio sicuro di cosa è cambiato in Windows 10, ma è praticamente distrutto il mio hack. Windows 7 funziona ancora fine e Windows 10 prima che funzioni di aggiornamento creativo. Ho finito per fare quanto segue per rendere tutto il lavoro di nuovo nella versione di Windows ho menzionato sopra.

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

È stato utile?

Soluzione

Questa è una proprietà VB, ma potrebbe estendersi anche a VBA. Hai provato a impostare le impostazioni di salvataggio per supportare le estensioni multidotte? Prova qualcosa del genere:

SupportMultiDottedExtensions = True
.

Questa impostazione è prevista consente l'utilizzo delle estensioni tratteggiate - che significa l'uso dei periodi nel nome del file. Vedere questo riferimento MSDN per documentazione e informazioni: http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.supportmultidottedextensions.aspx#y129

Questo questo articolo potrebbe anche sviare ulteriore luce: Finestra di dialogo Salvas con un periodo nel nome del file non restituisce l'estensione

Modifica

Dopo aver controllato la documentazione di Autodesk - un compito difficile e spiacevole, a mio parere - sembra davvero non essere alcun sostegno per i multidottestensions. Tuttavia, ho trovato una funzione su VBaexpress che ho strettamente adattato. La funzione può essere utilizzata per filtrare le stringhe con contenere caratteri inaccettabili. Il blog di Jimmy Pena ha una funzione eccellente per solo uno scopo: http:// www. jpsoftwaretech.com/excel-vba/validate-filenames/ . Ho solo aggiunto sostanzialmente un periodo e una sostituzione al codice:

'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
.

Blog Jimmy Pena contiene anche una versione ricorsiva, anche se non lo consiglia.

È possibile filtrare tutte le stringhe da utilizzare come file nomi di file con un altro carattere - uno spazio in questo caso. Potresti usare un sottolineatura, tuttavia, o qualsiasi altro personaggio che hai ritenuto piacevole.

In generale, se stai cercando di utilizzare periodi per il versioning o uno scopo simile, e inventore non ti permetterà, consiglierei vivamente di andare a un altro personaggio o insieme di personaggi che possono fornire una tale indicazione, un tale sottolineatura " _ ", un sistema di numerazione," 001 "," 002 ", un sistema di lettering," AAA "," AAB ", o qualunque cosa abbia senso per la tua attenzione.

Se stai solo facendo l'applicazione user-friendly, suggerirei di filtrare le stringhe inserite prima di salvarle nel tipo di file del file desiderato e separare il filtraggio delle stringhe dalla finestra di dialogo Salva se il filtro del periodo ti dà dolore. Può aggiungere un passo in più, ma potrebbe essere il modo migliore e più semplice per filtrare i pesky caratteri non validi senza creare problemi extra inutili per i tuoi utenti.

~ jol

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top