[Excel] Vba_creation de code

Bird001 Messages postés 8 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour

Etant un vrai débutant en Vba, je souhaiterai créer un fichier excel afin de générer automatiquement des codes (sous le format : codepays_chiffre, voir resultat en cellule L1)

Je voudrais que les chiffres/nombre dans la partie exception (cellule en jaune) ne soient pas pris en compte mais cela ne fonctionne pas

Pouvez-vous m'aider svp ?

le code

Sub location()
'
' Macro3 Macro
'
Dim Country As String
Dim NoCol As Integer
Dim exception As Integer
Dim Location_code As String
 
Country = InputBox("Enter your Country code", "Country code")

If Not VarType("Country") = vbString Then
    MsgBox ("le country code doit être en MAJ ou cette valeur n'est pas correcte")
End If

NoCol = 1

'Pour récupérer le no de colonne
Do Until Cells(1, NoCol).Value = Country
    NoCol = NoCol + 1
Loop

'Pour verifier les exceptions

exception = Cells(6, NoCol).Value
Do Until Cells(5, NoCol) = exception
      exception = exception + 1
     Loop
     
'créer location code
If Cells(5, NoCol).Value = exception Then
   Location_code = Country & exception + 1
   Cells(5, NoCol).Value = exception + 2
Else
    Location_code = Country & Cells(5, NoCol).Value
    Cells(5, NoCol).Value = Cells(5, NoCol).Value + 1
End If

Range("L1").Value = Location_code


'Créer les remarks
If Cells(1, NoCol).Value = "FR" Or Cells(1, NoCol).Value = "DE" Or Cells(1, NoCol).Value = "ES" Then
     Range("L2").Value = "Vendor" & "_" & Country
     Range("L3").Value = ""
ElseIf Cells(1, NoCol).Value = "GB" Then Range("L2").Value = "Vendor_UK"
ElseIf Cells(1, NoCol).Value = "US" Then
    Range("L3").Value = "VENDOR_USCA_NOT_INTEGATED"
    Range("L2").Value = ""
Else
Range("L2").Value = ""
Range("L3").Value = ""
End If

If Cells(1, NoCol).Value = "US" Then Range("L4").Value = "carrier_account: SDV_EDI::DUMMY;" Else Range("L4").Value = ""

End Sub


https://drive.google.com/file/d/0B1ihnzsJJTQ3ZWJ2VDREWllVTUE/view?usp=sharing

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Beaucoup de choses à dire sur ton code.

    La principale étant : découper le code en petites fonctions, chacune d'elles ne traitant qu'un sujet.

    Avant d'aller plus loin, on voit dans ton fichier des cellules en jaune.
    Est ce que, par exemple, les cellules B6:B8 représentent toutes les exceptions pour la France? ou alors uniquement B6?
    Que devient la nouvelle exception que tu créées?
    Tu la stockes, ultérieurement en B9?

    Sinon, pour en revenir à mon idée de fonctions (qui devrait être la base pour toutes programmations), je te fais un exemple avec tes lignes de code de 1 à 21 :

    Option Explicit
    
    Sub location()
    Dim Feuille As Worksheet, Country As String, Location_code As String
    Dim NoCol As Integer, exception As Integer
    
        Const strRANGECOUNTRY As String = "B1:F1"       'A ADAPTER
        Const MSG_ANNULE As String = "Abort..."         'A ADAPTER
        Set Feuille = Worksheets("Feuil1")              'A ADAPTER
        
        Country = Funct_MyInputBox(Feuille, strRANGECOUNTRY, True, MSG_ANNULE)
        If Country = MSG_ANNULE Then Exit Sub
        
        NoCol = Funct_Numero_Colonne(Feuille, 1, Country)
        If NoCol = 0 Then MsgBox "This country doesn't exists on the ActiveSheet's first line": Exit Sub
    
        'Pour verifier les exceptions
        'etc...
    End Sub
    
    Private Function Funct_MyInputBox(Wsh As Worksheet, rngValues As String, Optional ForceMajuscules As Boolean, Optional strMessage As String) As String
    'Fonction utilisant l'inputbox.
        'clic sur OK sans saisie ==> relance l'inputbox
        'clic sur annuler ==> retourne le message d'annulation
        'mauvaise saisie ==> relance l'inputbox
    'PARAMETRES :
        'Wsh (Worksheet): Feuille ou sont situées les données permettant la vérification de la saisie
        'rngValues (String) : l'adresse du Range ou sont situées les données (soit sur 1 ligne, soit sur 1 colonne)
        'ForceMajuscules (Boolean) : si True transforme les saisies en Majuscules
        'strMessage (String / Optional) : le message d'abandon par l'utilisateur
    'ATTENTION : utilise la fonction Funct_Dimension
    
    Dim bon As Boolean, entree As String, MyArray As Variant, i As Long, Dimens As Byte, Valeur As String
    
        MyArray = Wsh.Range(rngValues).Value
        If UBound(MyArray, 1) > 1 And UBound(MyArray, 2) > 1 Then
            MsgBox "Plage non valide (toléré : 1 ligne ou 1 colonne)"
            Funct_MyInputBox = strMessage: Exit Function
        End If
        Dimens = Funct_Dimension(MyArray)
        Do While Not bon
            entree = InputBox("Enter your Country code", "Country code")
            If StrPtr(entree) = 0 Then Funct_MyInputBox = strMessage: Exit Function ' -->> on a annulé
            If entree <> "" Then
                entree = IIf(ForceMajuscules, UCase(entree), entree)
                If Dimens = 1 Then
                    For i = LBound(MyArray, Dimens) To UBound(MyArray, Dimens)
                        Valeur = IIf(ForceMajuscules, UCase(MyArray(i, 1)), MyArray(i, 1))
                        If Valeur = entree Then
                            bon = True: Exit For
                        End If
                    Next i
                Else
                    For i = LBound(MyArray, Dimens) To UBound(MyArray, Dimens)
                        Valeur = IIf(ForceMajuscules, UCase(MyArray(1, i)), MyArray(1, i))
                        If Valeur = entree Then
                            bon = True: Exit For
                        End If
                    Next i
                End If
            End If
        Loop
        Funct_MyInputBox = IIf(ForceMajuscules, UCase(entree), entree)
    End Function
    
    Private Function Funct_Dimension(Arr As Variant) As Byte
    'retourne la dimension la plus grande de l'Array Arr
    'si pas de "plus grande" dimension retourne 1 par défaut
        Select Case True
            Case UBound(Arr, 1) > UBound(Arr, 2)
                Funct_Dimension = 1
            Case UBound(Arr, 2) > UBound(Arr, 1)
                Funct_Dimension = 2
            Case Else
                Funct_Dimension = 1
        End Select
    End Function
    
    
    Private Function Funct_Numero_Colonne(Wsh As Worksheet, Ligne As Long, strVal As String) As Integer
    'Retourne le numéro de la colonne à partir des paramètres :
        'Wsh : feuille ou chercher
        'Ligne : Ligne ou chercher
        'strVal : Valeur à chercher
    Dim Rng As Range
    
        Set Rng = Wsh.Rows(Ligne).Cells.Find(strVal)
        If Not Rng Is Nothing Then
            Funct_Numero_Colonne = Rng.Column
        Else
            Funct_Numero_Colonne = 0
        End If
    End Function
    
    


    Alors, oui, ça parait plus complexe. En réalité, c'est juste plus long à coder, à écrire.
    Mais tu y gagnes en :
    > lisibilité,
    > maintenance
    > ces fonctions sont utilisables pour d'autres projet
    > tu peux gérer des retours d'erreur dans ton code principal sans souci
    ...

    Il est vrai que ma fonction Funct_MyInputBox est complexe.
    Mais à vrai dire, j'ai voulu la "blinder" pour que tu sois tranquille à l'utilisation dans ce classeur ou dans tout autre projet...

    Cordialement,
    Franck
    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonsoir,
    1) "cela ne fonctionne pas": peux-tu être plus précis?

    2) peux-tu indiquer la réponse à donner au msgbox pour tester ton programme?

    3) je trouve le code suivant très suspect:
    'Pour récupérer le no de colonne
    Do Until Cells(1, NoCol).Value = Country
        NoCol = NoCol + 1
    Loop

    qu'essaies-tu d'y faire précisément?
    0
    1. steve
       
       
      Pour le 2) j'ai vu ces 5 codes pays :

      FR : France
      DE : Deutch (Allemagne)
      ES : Espagne
      GB : Grande-Bretagne
      US : United States (États-Unis)

      Note que dans Vendor_UK, UK est pour United Kingdom :
      Royaume Uni (= Grande Bretagne).

      Dans VENDOR_USCA_NOT_INTEGATED, USCA est probablement pour
      United States of Central America : États-Unis d'Amérique Centrale.

      ------------------------------------------

      Pour le 3) ça retourne le n° de la colonne qui correspond au Pays
      en regardant sur la ligne n° 1 des en-têtes de colonnes (il y a un
      pays par colonne).
       
      0
  3. Bird001
     
    Bonjour et merci pour vos réponse;

    Le code n'est pas totalement parfait, mais bon...dans l'input Box, on insert le code pays (en MAJ) FR, DE, US...et au bout on doit obtenir un code de format FR123, US456 dans la cellule L1;

    Seul la boucle des exceptions ne fonctionne pas:

    Les exceptions contiennent des chiffres déjà utilisés et ne doivent plus être utilisé pour créer le resultat dans la cellule L1
    0
    1. steve
       
       
      Bonjour Bird001,

      Fichier Excel 2007 : https://mon-partage.fr/f/W7uGzv4I/

      Ctrl l (L minuscule) => fenêtre "Country code"

      Tu pourras voir que les exceptions sont bien détectées,
      même si tu changes pour mettre 2 nombres suivis :

      exemple 1 : 75 en B6 et 76 en B7
      exemple 2 : 61 en C6 et 62 en C7

      Vérifie bien tout : exceptions et remarques.

      Alt F11 pour voir la macro, puis revenir sur Excel

      Si besoin, tu peux me demander une adaptation.
      Merci de me dire si ça te convient.

      Cordialement
       
      0
    2. steve > steve
       
       
      Ajout : même si mes 2 exemples sont pour 2 exceptions, mon code VBA
      teste quand même la 3ème exception, donc 3 exceptions en tout pour
      la colonne du pays concerné (lignes 6 à 8).

      Pour AT (Autriche), tu ne mets pas "Vendor_AT" ni de texte "remarks" ?
      si oui, n'oublie pas d'indiquer en quelle zone : zone 4 ou 3.

      Il y a le code 14 en H5 mais H1 est vide : c'est pour quel pays ?

      Précise bien si tu veux ajouter AT et cet autre pays inconnu
      dans la liste des pays (il faudra alors adapter le code VBA).
       
      0
    3. Bird001 > steve
       
      Peux-tu me retransmettre le fichier, je n'arrive pas à accéder au lien
      0
    4. steve > Bird001
       
      Fichier Excel 2007 : https://mon-partage.fr/f/xloJm74j/
      0
    5. Bird001 Messages postés 8 Statut Membre
       
      Toujours pas accéssible, je vais essayer sur un autre PC ce soir

      Merci beaucoup à tous en tout cas
      0