[Excel] Vba_creation de code
Bird001
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 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
https://drive.google.com/file/d/0B1ihnzsJJTQ3ZWJ2VDREWllVTUE/view?usp=sharing
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:
- [Excel] Vba_creation de code
- Code ascii - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
3 réponses
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 :
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
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
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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:
qu'essaies-tu d'y faire précisément?
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?
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).
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
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
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
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).