[Faites défiler jusqu'à la fin de la version très courte!]
Juste pour vous faire savoir que c'est ma deuxième fois que j'ai jamais posté sur un forum de site Web et que je suis tout neuf sur le codage, mais je le choisis définitivement (Bien qu'il soit extrêmement lentement!) Et vraiment en profiter. P>
Contexte du problème: P>
Dans mon organisation, il est nécessaire de sauvegarder des fichiers conformément à une convention de dénomination particulière, qui est comme suit: p> où par exemple J'ai créé une macro qui bouclait tous les fichiers et les dossiers, renvoie les noms actuels et renomme les fichiers (s'ils sont incorrects (s'ils sont incorrects ) Basé sur des alternatives populées par l'utilisateur (écrites dans une colonne "Nouveau nom" en regard de la colonne "Nom original"). p> La tâche à la main: p> J'essaie d'automatiser le population de la colonne "Nouveau nom" autant que possible, mais je suis bloqué sur la correction du numéro de version. P> J'ai constaté qu'il y avait essentiellement 5 façons différentes d'obtenir le numéro de version et les ont résumés ci-dessous avec comment ils seraient corrects: p> La clé trouvée que je veux de la formule est de pouvoir identifier Je veux aussi que cela ignore les instances de "nov1" comme celles-ci apparaissent plusieurs fois par exemple "NOV18CAccounts", etc. P> Je ne suis pas totalement sûr que cela puisse être fait sur Excel lui-même ou si le Vbe est requis donc étiqueté les deux dans le poste. P> espère que cela fait sens. p> merci. p> Version courte: p> est-il possible d'identifier Merci d'avance pour votre aide. P> P> vxx.xx code> représente le numéro de version qui doit être écrit à 2 chiffres avant la décimale et 2 chiffres après. p> 2019-07-24StackoverflowQuestonV01.00.doc Code>. P>
"V" et numéro code> dans une chaîne de texte et où il se trouve, à modifier conformément à ce qui précède . P>
"v" & numéro code> dans une chaîne de texte pour retourner des instances de quand ils apparaissent ensemble?
Par exemple. Pour "StackoverflowQuestonv1.00.doc" dans une cellule Excel, puis-je utiliser une fonction pour trouver "V1" et remplacer par 01? Le "V" sera toujours le même mais les chiffres changeront. P>
4 Réponses :
Public Function NormalizeVersionNumbers(ByVal s As String) As String
NormalizeVersionNumbers = s
With CreateObject("VBScript.RegExp") ' New VBScript_RegExp_55.RegExp
.IgnoreCase = False
.MultiLine = False
.Global = True
.Pattern = "V\.?([0-9]{1,2})(\.([0-9]{1,2}))?(?=.{0,8}\.*?$)"
With .Execute(s)
Dim i As Long
For i = .Count - 1 To 0 Step -1
NormalizeVersionNumbers = Left$(NormalizeVersionNumbers, .Item(i).FirstIndex) & Format$(CLng(.Item(i).SubMatches(0)), "V00") & Format$(CLng(.Item(i).SubMatches(2)), "\.00") & Mid$(NormalizeVersionNumbers, .Item(i).FirstIndex + .Item(i).Length + 1)
Next
End With
End With
End Function
It should be noted that it (in my opinion correctly) converts V1.1 to V01.01 as opposed to V01.10. If that is in fact not desired, do something to that second CLng (such as multiplying it by 10).
Merci c'est génial! J'aurais dû spécifier dans la question mais je l'ai réellement voulu en tant que fonction et c'est ce que vous avez fait. En outre, j'y ai pensé, je suis d'accord avec votre suggestion de nommer comme V1.1 à V01.01 afin que je garde comme ça!
Si ce n'est pas trop d'effort, une modification mineure pourrait-elle être apportée. Il y a 2 choses que j'ai remarquées. 1) S'il se trouve être un "V #" n'importe où dans le nom du fichier, il le modifie actuellement dans tous les domaines. Je sais que c'est ce que j'ai demandé, mais à la réflexion, est-il assez facile de mener la recherche de "V #" sur les 8 derniers chiffres avant l'extension de fichier? 2) Encore une fois, n'a pas mentionné dans la question cependant, il y a 2 autres variations de "faux" que je voudrais que cela corrige - "v.x" et "v.xx". Est-il assez facile d'inclure celles-ci? Merci d'avance.
Merci beaucoup @gserg. Je pousse peut-être ma chance ici mais finale (promesse) Question liée: Une fois que le "VXX.XX" a été corrigé, bien qu'il ne soit que la recherche dans les 8 derniers caractères de l'extension de fichier peut-il être déplacé pour que "VXX .xx "apparaîtra toujours comme" vxx.xx.fileextension ". Donc, "filenamev01.00sr.ext" devient "filenamesrv01.00.ext"? Je sais que cela semble terriblement pédant, mais avec des millions de documents sur le lecteur partagé, chaque peu d'automatisation aide.
@Haris Vous devez alors vous garantir qu'il existe une extension (pas actuellement une exigence) et qu'il n'y a qu'un seul élément V dans la chaîne (peut être actuellement plusieurs). Si vous garantissez cela, recherchez la dernière position de la période avec Instrrev code>, supprimez le format Middle Format () et Format () CODE> Pièce, modifiez le suivi MID $ () CODE> PARTIE POUR NE SEULEMENT À LA POSITION DE LA PITIATE en fournissant le troisième argument, collez le format format () et le format () code> après cela, puis ajoutez un autre MID $ ( ) Code> avec deux arguments, tout comme l'original non prédéfini MID $ () code>, mais cette fois-ci à partir de la position de la période, pas à la fin de la période.
L'idée était de "renomme les fichiers (s'ils sont incorrects)" i>, pas seulement signaler si elles ont tort.
Merci pour vos réponses que je travaille avec eux. @Malamare vient d'essayer votre code et c'est génial de tester si le numéro de version est ou non dans le format correct (testé pour 60 fichiers et résultats étiés corrects dans tous les cas), car gserg a mentionné qu'il ne les corrige pas. qui est la fonctionnalité requise. Si ce bit pourrait être ajouté, ce serait génial.
@Haris, avez-vous essayé la prochaine réponse que j'ai envoyée? Je pense que cela corrige les problèmes en utilisant une autre perspective. De plus, il ne cherche que les derniers caractères du nom de fichier. Il n'y a pas de problèmes avec le "V" dans d'autres endroits de la chaîne de caractères.
@Malamare - Merci pour cela, j'ai essayé de cela et cela semblait aussi bien fonctionner bien que je n'ai pas testé un échantillon assez important que la solution de GSerg ait également très bien fonctionné et peut être utilisée comme fonction plutôt qu'une sous-procédure qui Bien que non spécifié, est mieux adapté à mes besoins actuels. Très apprécient votre contribution et cochons également la vôtre comme la réponse mais ne peut cocher que ceci que j'ai peur!
Si vous avez des milliers de noms de fichiers, je n'utiliserais pas d'appel de fonctions à la fois. Cela prendrait une longue période. Utilisez le code que vous utilisez tout mettre dans un tableau et les examiner avec le meilleur code dans une boucle de la matrice. Vous pouvez réduire le temps par des dizaines ou des centaines. Utilisez l'appel de la fonction pour vérifier une fois que l'utilisateur entre correctement le nom.
OK, comme Gserg suggère que c'est le code pour renommer les fichiers. Ne cherche que des motifs à la fin du nom du fichier, après le "V" avant l'extension. Gardez à l'esprit qu'il peut y avoir des schémas similaires le long du nom de fichier et ceux-ci doivent être jetés.
Copiez ces 6 lignes à la feuille 1 Colonne A: P>
et coller ce code dans un module1: p> vous verrez dans la colonne de la feuille 1 de ces noms p>
Cette approche est plus basique et plus facile à comprendre que le code avancé de @gserg: il utilise Instrrev code> pour identifier le premier "V" à partir de la droite (contourne le numéro de nov), vérifie s'il y a Une correspondance de modèle pour les cinq entrées d'utilisateur incorrectes possibles et, si elle est trouvée copiera la valeur des cellules à la cellule à droite, puis en utilisant application.replace code> insère de nouveaux caractères au besoin. Les commentaires sont fournis dans le code.
puis-je utiliser une fonction pour trouver "V1" et remplacer par 01? i> Oui, c'est ce qu'on s'appelle
remplacer code> mais b> montre, car si le nom de fichier estv10.00 code> il le remplacera aussi! Donc, vous devez d'abord isoler la chaîne que vous souhaitez modifier. Avez-vous essayé de commencer à la fin de la chaîne? En regardant votre exemple de données, on dirait que vos noms de fichiers (hors extension) Toujours (hors extension) avec 6 caractères, qui doit être de typevxx.xx code> oùx code> est un entier compris entre 0 et 9 . Essayez d'obtenir les 6 derniers caractères de chaque nom de fichier, puis remplacez-le si nécessaire.Merci de commenter. La convention est censée se terminer uniformément, mais elle est donc rarement pourquoi on m'a donné la tâche de la nettoyer. En appuie toutefois, il sera nettoyé sur une base mensuelle, mais pas par moi, en essayant d'automatiser la fonction. En outre, ce ne sera pas toujours V1, ce sera toujours V et n'importe quel nombre de 0 à 9. Je suis conscient de la recherche / trouvez / remplacer / remplacer / substituer, mais je ne sais pas comment dit "Recherchez la lettre" V "et un numéro ensemble" ...
Créez-vous ces noms de fichiers vous-même, c'est-à-dire avoir une chance de modifier le format de la convention de dénomination? Si tel est le cas, changez le "VXX.XX" sur quelque chose de clairement identifiable comme début des informations de version, par exemple "-Vxx.xx". De cette façon, vous pouvez rechercher "-v" et indiquer clairement que c'est le début des numéros de version. Si ce n'est pas possible, essayez de résoudre la chaîne de la fin, par exemple. Dessez d'abord l'extension de fichier, puis localisez le "V" avec Instrrev ().
Il est difficile de savoir comment les noms de vos fichiers peuvent obtenir. Avec l'exigence de
NomwithoutSpacesSorpecialcharactSandfirstletterCapitalise d code>, il est facile d'ignorer lenov118Counts code>, mais le fait que vous devez renommer les fichiers pour commencer avec signifie que vous pourriez avoir le non-nov18counts minuscules code> qui sera remplacé parnov18.00Counts code>. En fait, l'exemple même denov18counts code> casse les règles en ayant des lettres majuscules supplémentaires.@ Helo'ween - merci pour votre réponse. La convention de dénomination est très stricte. L'outil que je crée, pas de traits d'union autorisés autres que les 2 à la date. Instrrev () est quelque chose que je n'ai jamais entendu ni utilisé ni que je vais examiner cela et j'espère que cela aidera à le résoudre!
@Gserg - excuses, il n'aurait peut-être pas dû mentionner les autres critères que la date de la date / la sensibilité de l'affaire est quelque chose que je peux gérer. Il vient de pouvoir identifier le V & [un numéro] ensemble dans une chaîne. S'il existe un moyen de coder les 5 variantes différentes comme des cas dans le code VBA (je suis nouveau à VBA, mais de ce que je rassemble, cela pourrait être une possibilité?) E.G. Si v & singledigit & "." Puis changez à V & "0" et SingleDigit & "." etc. et ignorez le 6ème dans le cas de nov11. J'espère que j'ai du sens et des excuses pour trop compliquer!