Boîte de dialogue de fichier VBA .Filenne retrait .1 à partir de la fin du nom du fichier

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

  •  11-12-2019
  •  | 
  •  

Question

J'utilise Visual Basic pour écrire une macro pour l'inventeur Autodesk. J'ai créé une macro qui appelle une boîte de dialogue de fichier, voir code ci-dessous. Tout fonctionne bien, sauf lorsqu'un utilisateur met un nom de fichier avec une période et un nombre supérieur à zéro en suivant.

Par exemple, si un utilisateur met le fichier TestFile.test dans la boîte et frappe OK. Quand je demande ce qu'ils ont mis là-bas en utilisant .Filename, je reçois "testfile.test". Tout comme je devrais.

Toutefois, si l'utilisateur met le fichier TestFile.1 ou Testfile.10 ou TestFile.1mdksj ou quoi que ce soit aussi longtemps qu'un nombre supérieur à zéro suit directement la période que je récupère "Testfile". Pour une raison quelconque, tout après la période et la période est supprimée.

Quelle est la raison de cela? Est-ce un bug de Visual Basic ou je fais quelque chose de 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

mise à jour:

J'ai fini par faire le suivant "Hack" pour que les choses fonctionnent toujours tout en traitant d'une période:

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

qui a fonctionné bien pendant un certain temps sur Windows 7, puis Windows 10. Malheureusement, la mise à jour de la création Windows 10 semble avoir modifié la manière dont la boîte de dialogue Fichier fonctionne. Avec le code ci-dessus, le nom complet reviendrait en blanc s'il n'y avait aucune période au nom et tout tronquerait de la première période de la gauche s'il y avait une période au nom.

Je ne suis pas vraiment sûr de ce qui a changé dans Windows 10, mais il a presque détruit mon hack. Windows 7 fonctionne toujours bien et Windows 10 avant que la mise à jour de la création ne fonctionne. J'ai fini par faire ce qui suit pour que tout fonctionne à nouveau dans la version de Windows que j'ai mentionnée ci-dessus.

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

Était-ce utile?

La solution

Ceci est une propriété VB, mais elle peut également s'étendre à la VBA. Avez-vous essayé de définir les paramètres d'enregistrement pour prendre en charge les extensions multidoutées? Essayez quelque chose comme ceci:

SupportMultiDottedExtensions = True

Ce paramètre est conçu pour permettre l'utilisation des extensions en pointillées - ce qui signifie l'utilisation de périodes dans le nom du fichier. Voir cette référence de MSDN pour la documentation et les informations: http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.supportmultidroudextensions.aspx#y129

Cet article peut également verser plus loin: NIVENANOG SAVEAS AVEC une période dans le nom de fichier ne renvoie pas l'extension

Modifier

Après avoir vérifié la documentation Autodesk - une tâche difficile et désagréable, à mon avis, il semble en effet n'ayant aucun support pour les multidouilles. Cependant, j'ai fait une fonction sur VBAexpress que j'ai très étroitement adapté. La fonction peut être utilisée pour filtrer les chaînes avec contenant des caractères inacceptables. Le blog de Jimmy Pena a une excellente fonction pour un tel but: http:// www. jpsoftwaretech.com/excel-vba/validate-filenames/ . J'ai seulement ajouté de manière substantielle une période et un remplacement au code:

'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

Le blog de Jimmy Pena contient également une version récursive également, bien qu'il ne le recommande pas.

Vous pouvez filtrer toutes les chaînes à utiliser comme nomination de fichiers avec un autre caractère - un espace dans ce cas. Vous pouvez toutefois utiliser un soulignement ou tout autre caractère que vous avez jugé agréable.

En général, si vous essayez d'utiliser des périodes de versions ou un objectif similaire, et l'inventeur ne vous laissera pas vous laisser, je vous conseillerais fortement d'aller à un autre caractère ou à un autre caractère pouvant fournir une telle indication, un tel soulignement » _ ", un système de numérotation" 001 "," 002 ", un système de lettrage" AAA "," AAB ", ou tout ce qui est logique de votre objectif.

Si vous faites simplement l'application conviviale, je vous suggère de filtrer les chaînes saisies avant de les sauver dans le type de fichier souhaité et séparez le filtrage des chaînes de la boîte de dialogue Enregistrer si le filtrage de la période vous donne du chagrin. Cela peut ajouter une étape supplémentaire, mais il peut être le moyen le plus simple et le plus simple de filtrer des caractères pesky invalides sans créer de tracas supplémentaires inutiles pour vos utilisateurs.

~ jol

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top