[Excel] Vba_creation de code
Bird001
Messages postés
8
Statut
Membre
-
yg_be Messages postés 24281 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 24281 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 puk bloqué - Guide
- Code de déverrouillage oublié - 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
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 586
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).