[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 23487 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 mars 2025 - 3 oct. 2017 à 13:08
yg_be Messages postés 23487 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 mars 2025 - 3 oct. 2017 à 13:08
A voir également:
- [Excel] Vba_creation de code
- Liste déroulante excel - Guide
- Code ascii de a - Guide
- Code puk bloqué - Guide
- Code de déverrouillage oublié - Guide
- Si et excel - Guide
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 754
Modifié le 6 sept. 2017 à 09:02
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 :
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
23487
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 mars 2025
Ambassadeur
1 570
4 sept. 2017 à 23:18
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:
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).
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
2 oct. 2017 à 14:57
Toujours pas accéssible, je vais essayer sur un autre PC ce soir
Merci beaucoup à tous en tout cas
Merci beaucoup à tous en tout cas