VBA problème pour incrémenter

Résolu/Fermé
onra - 25 juin 2008 à 14:33
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 26 juin 2008 à 23:37
Bonjour,

Je suis entrain de créer un code qui me permet d'enregistrer des devis.
J'essaye de les enregistrer en leurattribuant un numéro chronologique et un indice.
Par exemple lorsque l'on enregistre pour la première fois le devis il se nommera pas la valeur juste supérieur au précédent. Puis si le devis est modifer il serait indicé:

Ca doit donner ca:

devis 1
devis 2
devis 2 a
devis 2 b
devis 3
Le truc , c'est que je ne sais pas comment incrémenter les indices (qui sont des lettres...)

Toutes les idées sont les bienvenues.

Merci d'avance

7 réponses

blux Messages postés 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289
25 juin 2008 à 14:36
Salut,

il faut que tu prennes le code ascii (qui est numérique) des lettres pour le faire augmenter en séquence.

colle ton code VBA ici pour qu'on voie où il faut faire une modif...
0
Salut,
et merci de répondre si vite.

Voici le code:

Sub Chrono()
Workbooks("Menu").Worksheets(1).Activate
i = 1
While Worksheets(1).Cells(i, 1).Value <> ""
i = i + 1
Wend
Cells(i - 1, 1).Select
Cells(i, 1) = 1 + Cells(i - 1, 1)
Workbooks("FM Originale").Sheets("Fiche").Range("D4").Value = Cells(i, 1).Value
Nchrono.ControlSource = "D4"
End Sub

Ce code est celui qui me permet la première incrémentation. Pour les indices , je ne sais toujours comment faire.
0
onra > onra
25 juin 2008 à 14:56
En fait le principe de mon code, est qu'il va lire dans une colonne les n° de lot qui sont déjà enregistrer et prend le suivant.
C'est certainement pas ce qu'il y a de plus léger; mais bon, ca fonctionne.
c'est déjà ca!
0
blux Messages postés 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289
25 juin 2008 à 15:03
Tu peux générer la lettre 'a' avec le code suivant :

msgbox chr(97)

ensuite, il te suffit de tester si le dossier existe déjà et dans l'affirmative, concaténer son numéro avec un chr(x), où x sera récupéré avec la fonction asc(y)+1, le y étant la lettre déjà affectée précédemment, le cas échéant.

C'est clair ou pas ? :-)
0
merci beaucoup
j'essaye ca tout de suite...
0
Je viens d'essayzer ton bout de code, et ca marche.

Par contre tu m'a dit que je pouuvais tester si le nom de dossier existe déjà.
Comment fait tu; car moi je passe par une feuille esxcel ou j'enregistre dans une colonne les noms. Autant dire que ca n'est aps très pratique et plutôt lourd.
Si tu pouvais m'aiguiller sur ce coup....

Merci
0
blux Messages postés 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289 > onra
25 juin 2008 à 15:41
Par contre tu m'a dit que je pouuvais tester si le nom de dossier existe déjà.
Voui, c'est la moindre des chose avant d'incrémenter (en numérique ou avec une lettre, d'ailleurs).

Mais ma phrase était 'générique' puisque je ne sais pas sous quelle forme se présentent tes dossiers : feuille excel de ton classeur ou fichier enregistré sur le disque...
0
onra > blux Messages postés 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024
25 juin 2008 à 15:48
En fait mon code ouvre un devis vierge que je remplie et que j'enregistre dans un fichier à part.
Les devis sont apperlés Lot.
Et mon but avec ces incrémentations est de pouvoir obtenir:
FM 1
FM 2
FM 3
FM 3a
FM 3b

La lettre étant un indice de révision.

Et comme je te disait je passais par une feuille Exel où les noms s'enregistraient dans une colonne et s'incrémentaient au fur et à mesure qu'un nouveau devis étati créer.
0
blux Messages postés 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289 > onra
25 juin 2008 à 16:18
donc il faut que tu fasses un peu de VBA pour voir si le fichier existe, comme ça, tu n'auras plus à gérer de colonnes avec des noms de fichier...

https://support.microsoft.com/fr-fr/help/462253
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 juin 2008 à 17:09
Bonjour, j'ai été voir sur le lien donner... Mais tu va avoir quelques difficulté avec
    ExisteFichier = (Répertoire(nomfic) <> "")


le test...
Chemin= "C:\NomRép1\NomSousRép\LeFichier.extension"
if ExisteFichier(Chemin) then

Function ExisteFichier(TesterFich as  Chaîne) as Booléen
     ExisteFichier = (Dir(TesterFich ) <> "")
End Function

Faut connaître la fonction pour comprendre ce qu'ils veulent dire.
A+



0
Merci, j'ai pas encore eu le temps de regarder ca en détail.
Mais en lisant ton message , effectivement je crois que ca m'aurait poser problème.

Je profite de ta petite intervention pour te poser une autre question à ce sujet:

Mon objectif pour ce code, est d'enregistre des devis dont le nom serait incrémenter par raport au précédent.
(il doit y avoir quelques explication en plus au dessus)

Mais je ne sais pas trop comment faire.

Si tu avaix quelques idées lumineuses, ca m'aiderait bien

Merci

Bonne soirée
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 juin 2008 à 19:10
Essaye de comprendre cette fonction et éventuellement adapte la...
'Ici, envoyer avec le nom du devis à tester
'Par exemple FM 3 Pas envoyer de FM 3a ou FM 3b
'je reprend l'appel.. Sauver sous le nom...
'NomDuNouVeauFichier = ChercherNouvNom("FM 3")
'
Function ChercherNouvNom(NomAvoir) As String
Dim i As Integer, TxtNom As String
Dim Chemin As String
Dim Ch As Integer
   Ch = 97: TxtNom = NomAvoir
   For i = 1 To 10
       Chemin = "C:\NomRép1\NomSousRép\" & TxtNom & ".xls"
       If Not ExisteFichier(Chemin) Then
           ChercherNouvNom = Chemin
           Exit Function
       End If
       TxtNom = NomAvoir & Chr(Ch)
       Ch = Ch + 1
   Next i
End Function  


A+
0
Salut,
merci pour ton code,
mais je t'avoue que je suis complètement paumé. Mon expérience en VbA se compte en semaines et je n'ai jamais utilsé de fonction.
Alors j'ai une ou deux petites question.
La première est que je n'arrive pas à exécuter la fonction (j'ai un peu cherché mais c tellement évident que je n'ai pas trouvé).
La seconde question est que j'ai essayé d'adapté la fonction en la simplifiant un peu: c'est à dire que dans un premier temps je n'ai besoin que d'affecter au fichier l'indice numérique.
(C'est seulement en cas de modif que j'affecte l'indice de révision "lettre")
Donc bien que je 'nai pas pu tester la fonction, j'ai essayé de l'adapter tant bien que mal, et voilà ce que c donne:

Function ChercherNouvNom(TextNom) As String
Dim i As Integer, TxtNom As String
Dim Chemin As String
For i = 1 To 500
TxtNom = "FM" & i
Chemin = "G:\5518 Servier Croissy\00 stagiaire\Economie de chantier\Outil bis\derneir outil\OUtil avec menu\FM\" & TxtNom & ".xls"
While ExisteFichier(Chemin)
i = i + 1
Wend
ChercherNouvNom = Chemin
TxtNom = "FM" & i
MsgBox ("FM" & i)
Exit Function
Next i
End Function

Le but est donc que la fonction teste les ficheirs entre 1 et 500, pour donner le premier nom non-existant.
J'ai changer la boucle If par While, car je veux que ca incrémente tant que la fonction trouve le ficheir correspondant.
Mais comme je tedisais, me sentant fébril avec se genre de fonction, je suis perplexe vis à vis de mes mofis.

Si tu avais un petit moment pour jeter un coup d'oeil, ca serait cool;

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 juin 2008 à 10:26
Tu t'est bien débrouillé mais ca n'ira pas..
Function ChercherNouvNom(TextNom) As String
Dim i As Integer, Nom As String
Dim Chemin As String
    For i = 1 To 500
        Nom = TextNom & i 'TextNom doit pas changer sinon ca s'ajoute et tu va avoir FM1234567891011..
        Chemin = "G:\5518 Servier Croissy\00 stagiaire\Economie de chantier\Outil bis\derneir outil\OUtil avec menu\FM\" & Nom & ".xls"
        If Not ExisteFichier(Chemin) Then Exit For
    Next i
    ChercherNouvNom = Chemin
End Function

'Si c'est TOUJOURS FM...
Function ChercherNvNom() As String
Dim i As Integer, Nom As String
Dim Chemin As String
Dim Txt As String
    Txt = "G:\5518 Servier Croissy\00 stagiaire\Economie de chantier\"
    Txt = Txt & "Outil bis\derneir outil\OUtil avec menu\FM\"
    For i = 1 To 500
        Nom = "FM " & i
        Chemin = Txt & Nom & ".xls"
       ' If Not ExisteFichier(Chemin) Then Exit For
        tu peu raccourcir par
        If Dir(Chemin ) = "" then Exit For
    Next i
    ChercherNvNom = Chemin
End Function

Attention derneir il y a une inversion de lettre
Suivant le cas tu choisi l'une ou l'autre
Mais c'est bien, au moins tu suis et essaye de te débrouillé, de cette façon tu apprendras vite.
A+
0
Merci,
j'ai testé la seconde et ca m'a pas l'air mal.
Le truc c'est que je n'arrive pas à enregistrer le fichier:
J'ai pourtant rajouter avant End Function:
Worksheets(1).SaveAs ChercherNvNom
mais rien à faire.

Il se passe seulement deux chose:
Ca m'inscrit sur la cellule selectionnée de la feuille active le chemin
Et quand je fait "Insertion/Fonction/ChercherNvNom(); j'ai une boîte de dialogue qui me dit que je n'ai pas d'argument????

Au passage, c'est tu qomment je peux appeler une fonction à partir d'une macro?

A+
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 juin 2008 à 11:32
Worksheets(1).SaveAs ChercherNvNom ??
Worksheets = une feuille !!
C'est le classeur que tu doit sauver.
et un classeur c'est
ActiveWorkBooks.saveAs ChercherNvNom
Mais attention, le classeur que tu à sur ton écran c'est le nouveau !!
Faudrait donc faire
Dim Nom as string
Nom = activeWorkbooks.FullName
ActiveWorkBooks.saveAs ChercherNvNom
ActiveWorkbooks.close
Workbooks.open Nom
J'ai pas tester, peu y avoir une erreur de syntaxe, tu vois...
0
Merci bien,
j'y vois plus clair petit à petit.

Je test ca et je te donne des nouvelles un peu plus tard

A plus
0
Salut,

Bon j'ai eu le temps de tester ton code et c marche super bien.
J'ai juste changer la fonction en preocédure classique (Sub) parce que j'ai du mal à m'en servir. Mais pour le reste c parfait.
Jute une petite question , histoire d'améliorer ma culture VBAiste... :
Tu as écris le chemin en deux partie , et je voulais savoir pourquoi:
Txt = "G:\5518 Servier Croissy\00 stagiaire\Economie de chantier\"
Txt = Txt & "Outil bis\derneir outil\OUtil avec menu\FM\"

Sinon voici le code que j'utilise maintenant:

Sub ChercherNvNom()
Dim i As Integer, Nom As String
Dim Chemin As String
Dim Txt As String
Txt = "G:\5518 Servier Croissy\00 stagiaire\Economie de chantier\"
Txt = Txt & "Outil bis\derneir outil\OUtil avec menu\FM\"
For i = 1 To 500
Nom = "Fiche " & i & " "
Chemin = Txt & Nom & ".xls"
If Dir(Chemin) = "" Then Exit For
Next i
Range("D4") = "FM" & i
ActiveWorkbook.SaveAs Chemin
End Sub


Et pour ce qui est de l'indice de révision, je me suis rendu compte que pour l'outil que je met en place , il était plus logique de faire une petite boucle toute simple dans mon programme.

Voilà, voilà

En tout cas merci beaucoup,
tu m'a était d'une grande aide.

A plus
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 juin 2008 à 23:37
J'ai scindé Txt parce que généralement je n'écrit jamais de code qui dépasse la largeur de la fenêtre (question de facilité de déboguage et de lvisualisation du code) je coupe alors les lignes en mettant le tiret bas "_"
Mais là, pour une raison que j'ignore VB n'a pas voulu accepter cette facon de faire et pour y remédier j'ai employé ce stratagème.
Voil, content d'avoir pu t'aider.
A+
0