[Excel] Vba_creation de code

Fermé
Bird001 Messages postés 5 Date d'inscription lundi 4 septembre 2017 Statut Membre Dernière intervention 6 juin 2021 - Modifié le 4 sept. 2017 à 13:43
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 3 oct. 2017 à 13:08
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.
A voir également:

3 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié le 6 sept. 2017 à 09:02
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
4 sept. 2017 à 23:18
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
 
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
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
 
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
 
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
Bird001 > steve
2 oct. 2017 à 10:33
Peux-tu me retransmettre le fichier, je n'arrive pas à accéder au lien
0
steve > Bird001
2 oct. 2017 à 14:00
Fichier Excel 2007 : https://mon-partage.fr/f/xloJm74j/
0
Bird001 Messages postés 5 Date d'inscription lundi 4 septembre 2017 Statut Membre Dernière intervention 6 juin 2021
2 oct. 2017 à 14:57
Toujours pas accéssible, je vais essayer sur un autre PC ce soir

Merci beaucoup à tous en tout cas
0