Incrémentation IF and IF

Bonjour le Forum,

Toujours à l'aide du VBA je recherche aujourd'hui à faire une icrémentation si ma TextBox1 est égale à Cells(i,1) et sur la même ligne la textbox2 est également = à Cells("même ligne",2) alors

SI Cells("même ligne",3)=1 alors

Range("même ligne",3)=2

Ou si

Cells("même ligne",3)=2 alors

Range("même ligne",3)=3

Ou si

Cells("même ligne",3)=3 alors

Range("même ligne",3)=4

Ou si

Cells("même ligne",3)=4 alors

Range("même ligne",3)=5

Ou si

Cells("même ligne",3)=5 alors

Range("même ligne",3)=1

Ou si

Cells("même ligne",3)="Première" alors

Range("même ligne",3)=2

Pour ceci j'ai pensé à ce code:

Private Sub CommandButton1_Click()
Dim aa, i%
    aa = Feuil2.Range("A1").CurrentRegion
    For i = 2 To UBound(aa)
        If aa(i, 1) = TextBox1 And aa(i, 2) = TextBox2 Then
           If Feuil2.Cells(i, 3) = "Première" Then
           Feuil2.Range(i, 3) = 2
           Else
           If Feuil2.Cells(i, 3) = 1 Then
           Feuil2.Range(i, 3) = 2
           Else
           If Feuil2.Cells(i, 3) = 2 Then
           Feuil2.Range(i, 3) = 3
           Else
           If Feuil2.Cells(i, 3) = 3 Then
           Feuil2.Range(i, 3) = 4
           Else
           If Feuil2.Cells(i, 3) = 4 Then
           Feuil2.Range(i, 3) = 5
           Else
           If Feuil2.Cells(i, 3) = 5 Then
           Feuil2.Range(i, 3) = 1
           Else
           MsgBox "Le Produit n'existe pas."
           End If
           End If
           End If
           End If
           End If
           End If
    Else
        End If
        Next
    Feuil2.Select
    Unload Me
End Sub

PS: Ce code se trouve dans Mon UserForm pour le bouton "Valider"

En vous remerciant d'avance,

Sebyg

Bonjour,

Il te faut utiliser ElseIf :

If Feuil2.Cells(i, 3) = "Première" Then
    Feuil2.Range(i, 3) = 2
ElseIf Feuil2.Cells(i, 3) = 1 Then
    Feuil2.Range(i, 3) = 2
ElseIf Feuil2.Cells(i, 3) = 2 Then
    Feuil2.Range(i, 3) = 3
ElseIf Feuil2.Cells(i, 3) = 3 Then
    Feuil2.Range(i, 3) = 4
ElseIf Feuil2.Cells(i, 3) = 4 Then
    Feuil2.Range(i, 3) = 5
ElseIf Feuil2.Cells(i, 3) = 5 Then
    Feuil2.Range(i, 3) = 1
Else
    MsgBox "Le Produit n'existe pas."
End If

personnellement, j'utilisera Select Case :

Select Case Feuil2.Cells(i, 3).Value

    Case "Première": Feuil2.Range(i, 3).Value = 2
    Case 1 To 4: Feuil2.Range(i, 3).Value = Feuil2.Range(i, 3).Value + 1
    Case 5: Feuil2.Range(i, 3).Value = 1
    Case Else: MsgBox "Le Produit n'existe pas."

End Select

Bonjour, Salut Theze !

Je vois que tu n'as pas lu mes commentaires sur ton code avec cette invraisemblable imbrication de if... Tu devrais, de même que regarder de près la réécriture de code sur ton fichier quelque peu modifié.

https://forum.excel-pratique.com/viewtopic.php?p=659828#p659828

Bonjour,

Si je l'ai bien lu, mais j'avais déjà posté ce post avant que tu réponde hier pour traiter à part de la listbox cette

invraisemblable imbrication de if

^^

Je me penche sur le sujet de suite dans l'espoir de tout comprend.

Je reviens..

PS: Merci de vos réponses

Re,

Du coup c'est très bien d'avoir eu un retour concernant mon code IF+IF

Ca me permet vraiment d'apprendre et me rendre compte de mes erreurs.

Ce n'est pas le code que je vais utiliser mais pour être sûr d'avoir tout compris j'ai voulu retoucher mon code

Private Sub CommandButton1_Click()
    Dim aa, i%
    aa = Feuil2.Range("A1").CurrentRegion
    For i = 2 To UBound(aa)
        If aa(i, 1) = TextBox1.Text And aa(i, 2) = TextBox2.Text Then
            If aa(i, 3) = "Première" Then
                aa(i, 3) = 2
               ElseIf aa(i, 3) = 1 Then
                    aa(i, 3) = 2
                    ElseIf aa(i, 3) = 2 Then
                        aa(i, 3) = 3
                        ElseIf aa(i, 3) = 3 Then
                            aa(i, 3) = 4
                            ElseIf aa(i, 3) = 4 Then
                                aa(i, 3) = 5
                                ElseIf aa(i, 3) = 5 Then
                                    aa(i, 3) = 1
                                    Else
                                    MsgBox "Le Produit n'existe pas."
            End If
          End If
    Next i
    Feuil2.Select
    Unload Me
End Sub

Ceci dit mon code IF ne fonctionne toujours pas.. ^^ (Du coup je vais refaire mon code et essayer avec Select case...)

Mais tant pis je ne savais pas qu'il y avait la possibilité de faire la combobox ce qui évite toute sorte d'erreur c'est extra !!!!

Néanmoins ça fait 40 minutes que je suis sur le code et je comprend des lignes mais pleins d'autre reste flou.

Split

déjà dès le début je ne sais pas ce que c'est j'imagine vue son emplacement et ce qui s'ensuit que c'est un frère de Cells et Range.. lol mais sa fonction... Puis Colonne

(0)

de la combobox ?

Tu dis que

d

est une date. Colonne

(1)

?

Puis tu dis Tableau à partir de A1 CurrentRegion.

Et tu commence avec i=2 ce qui signifie deuxième ligne donc à partir de A2

.Rows.Count

le nb de ligne jusqu'à une ligne vide j'imagine ?

Si cette ligne colonne 1 est égale à la première partie de la combobox donc p et dans le même prince colonne 2 deuxième partie de la combobox alors

n = IIf(.Cells(i, 3) = "Première", 1, .Cells(i, 3))
                    .Cells(i, 3) = n Mod 5 + 1

Tu déclare n mais là il y a de I dans IF je ne connais pas :/ et je ne comprend pas comment tu dis que 2=3 / 3=4 etc j'imagine que c'est grace à

n Mod

puis tu dis que 5 passe à 1 .. ?

Le reste facile.

Maintenant afficher la combobox dans l'UserForm:

d= .... inconnue au bataillon pour moi

Tu crée un tableau aa pour récupérer les donnés des colonnes 1 et 2

Tu dis que k c'est colonne 1 avec - et Colonne 2(que tu déclare en date)

d(k) ...

La fin je sèche :/

J'espère ne pas être trop mal, avoir compris et réussi a expliquer pour me faire comprendre.

Apprends à indenter correctement ton code !

        If aa(i, 1) = TextBox1.Text And aa(i, 2) = TextBox2.Text Then
            If aa(i, 3) = "Première" Then
                aa(i, 3) = 2
            ElseIf aa(i, 3) = 1 Then
                aa(i, 3) = 2
            ElseIf aa(i, 3) = 2 Then
                aa(i, 3) = 3
            ElseIf aa(i, 3) = 3 Then
                aa(i, 3) = 4
            ElseIf aa(i, 3) = 4 Then
                aa(i, 3) = 5
            ElseIf aa(i, 3) = 5 Then
                aa(i, 3) = 1
            Else
                MsgBox "Le Produit n'existe pas."
            End If
        End If

Ici tu n'as plus qu'une instruction If imbriqué dans la première...

Ceci dit mon code IF ne fonctionne toujours pas

Tu t'es aligné à travailler sur un tableau, c'est cohérent, et si ton code est correct, le tableau sera mis à jour...

Mais le tableau ne se réaffecte pas tout seul à la plage d'origine, qui elle demeure inchangée... !

Si tu ne le réaffectes pas, tu ne verras jamais le travail réalisé...

Split

Split est une fonction VBA qui permet des manipulations de texte...

NB- Il y a de nombreuses fonctions VBA, certaines ont un lien de parenté avec les fonctions Excel, mais d'autres ne se retrouvent pas dans Excel et sont souvent intéressantes pour aboutir à des résultats auxquels on ne parviendrait pas en formules... A l'inverse, VBA peut utiliser les fonctions Excel (WorksheetFunction) dont certaines n'ont aussi pas d'équivalent en VBA et demeurent intéressantes pour élargir les possibilités de VBA.

La bonne attitude est de connaître les fonctions VBA, de les utiliser en priorité selon besoins dans le code, et faire appel aux fonctions Excel lorsqu'on n'a pas d'équivalent VBA, ou lorsque cela simplifie l'opération en cours...

Split est une fonction qui transforme une chaîne de texte en tableau en scindant les éléments selon un séparateur inclus dans la chaîne.

Tbl = Split("élement1;élément2;élément3", ";")

Tbl (variable Variant) va se voir affecter un tableau résultant de la scission de la chaîne selon le caractère désigné comme séparateur, on obtiendra :

Tbl(0) contenant "élément1"

Tbl(1) contenant "élément2"

Tbl(2) contenant "élément3"

On peut réaliser l'opération inverse, avec la fonction Join, convertissant le tableau en chaîne texte en adjoignant un séparateur :

Tbl = Join(Tbl, ", ")

Ici on a choisi comme séparateur ", " (virgule, suivie d'une espace).

Au terme Tbl contiendra le texte suivant : "élément1, élément2, élément3"

Retenir que l'on peut omettre le séparateur, et dans ce cas, le séparateur par défaut est l'espace.

2 fonctions liées auxquelles, chemin faisant, tu pourras trouver de nombreuses utilisations, comme tous ceux qui les ont accostées...

Dans le cas particulier de mon utilisation pour ton Userform, tu noteras que j'ai d'une part utilisé l'outil Dictionnaire pour créer une liste d'éléments uniques produit - date (au cas où le couple se répèterait.

J'ai donc formé des éléments dico en concaténant le produit (texte) suivi de " - " suivi de la date sous forme texte formaté (afin d'éviter les surprises). En tant qu'éléments de dico, ces clés sont uniques, il ne peut y avoir de doublons, si donc un couple est répété dans la liste, il sera éliminé. La valeur affecté à chaque élément est uniformément "", parce que l'on n'en a pas besoin, on n'utilise ici que les clés. On affecte à la fin les clés de dico sous forme de tableau à la propriété List de la Combo.

Tu peux alors sélectionner un couple produit - date, dont tu es sûr qu'il existe au moins une fois dans la base. (Donc le message de produit absent ne se justifie plus...)

Lors de la sélection d'un élément de la Combo, on resépare les deux composant du couple pour les retrouver dans la base. On aurait pu faire simplement :

k = Split(ComboBox1.Value, " - ")

Et on aurait eu k(0) contenant le produit, et k(1) contenant la date... [Je l'ai d'ailleurs fait et cela fonctionnait...]

Cependant , l'on a toujours une incertitude sur les dates si on ne les traite pas activement... Dans k(1) on aurait eu un texte, identifiable comme date par VBA donc convertible en date. VBA comme Excel d'ailleurs, a une propension à convertir en date toute expression qu'il peut identifier comme telle (cela présente quelques avantages, mais aussi quelques inconvénients lorsque l'on veut saisir du texte sans que cela soit une date... mais on s'en débrouille dans le tableur.) Le problème avec VBA est que son mode de reconnaissance est américain, ce qui peut toujours réserver quelques surprises (inversion mois/jour par rapport au format FR). On le force à reconnaître en mode FR en convertissant explicitement une expression en date au moyen de CDate ou DateValue, fonction qui l'obligent à utiliser les paramètres FR définis dans Windows.

D'où l'affectation de chaque élément résultant du Split à une variable distincte, type String pour le produit, et type Date, en convertissant, pour la date.

Plus de problèmes alors pour comparer avec le contenu de la colonne Excel contenant des dates. On est sûr ainsi que l'on n'aura aucune surprise susceptible de surgir...

Iif

Il s'agit encore d'une fonction, celle-ci assez proche de la fonction SI du tableur.

Dans la 3e colonne on peut avoir les nombres 1 à 5 et éventuellement "Première", que l'on traitera comme s'il s'agissait de 1.

n = Iif(Cellule = "Première", 1, Cellule)

Avec ceci on affecte 1 s'il s'agit de "Première" et la valeur dans le cas contraire.

n contiendra un nombre de 1 à 5, que l'on va incrémenter, en retournant à 1 lorsqu'il s'agit de 5.

n Mod 5 renvoie le modulo de n, soit 1 à 4 inchangé lorsqu'il s'agit de 1 à 4, et 0 lorsqu'il s'agit de 5. On incrémente en ajoutant 1, et on obtient le résultat voulu sans manipuler de nombreuses conditions If...

Cordialement.

Mais le tableau ne se réaffecte pas tout seul à la plage d'origine, qui elle demeure inchangée... !

Comment faire dans ce cas ? avec

Case

?

D'accord, donc là p(0) élément 1 du tableau

With Feuil2.Range("A1").CurrentRegion

et d(1) élément 2 idem séparé par " - "

Okey mon pti truc mémotechnique SPLIT et JOIN c'est OUI et NON l'inverse quoi

Le séparateur doit toujours ce trouver après la

,

et les éléments sont toujours couper par

;

et du coup si on omet le séparateur on fini comme ceci :

Tbl = Split("élement1;élément2;élément3")

?

La ComboBox j'ai pigé, c'est logique et simple finalement.

Okey, la date est vraiment délicat à traiter du coup. Ca aurait pu etre une source d'erreur en faisant le raccourcie k(0) k(1)

Finalement à l'avenir si je ne traite pas de date je pourrai effectuer ce raccourcie sans aucune source d’erreur ?

D'accord, ... vue comme ça

n Mod 5

est quand même bien plus simple que mes IF en multitude Ce qui d'ailleurs est très intéressant à l'avenir.

Bon, franchement je crois vraiment avoir tous compris. Je te remercie sincèrement pour le temps et la patience que tu as eu pour m'expliquer tous ceci.

Merci Beaucoup

Re,

L'affectation du tableau à la plage, c'est l'opération inverse :

Feuil2.Range("A1").CurrentRegion = aa

Tu dois mettre la plage d'affectation à la dimension du tableau affecté, mais n'ayant rien touché sur la feuille entretemps, la même façon de dimensionner convient.

Pour les chaînes tu utilises les séparateurs qui te conviennent, et ce n'est pas limité à un seul caractère...

Tu peux par exemple utiliser Chr(10) (c'est le saut de ligne), pour former une chaîne à partir d'un tableau d'éléments, l'affecter à une cellule, et définissant la propriété WrapText de la cellule sur True, le texte apparaîtra sous forme de liste d'élément dans la cellule...

Il faut sinon toujours retenir que le séparateur VBA est la virgule, alors que le séparateur dans ExcelFR est le point-virgule, donc si tu écris une formule en VBA, tu utiliseras des virgules dans la formule (et tu utilises les noms anglais des fonctions...) et une fois que tu l'auras placée dans une cellule, elle apparaîtra en français avec des point-virgules...

[Ceci dit, je ne conseille pas en principe d'utiliser VBA pour placer des formules, à la fois parce que c'est plus long à faire en VBA... et parce que l'intérêt de VBA est le plus souvent d'éviter d'utiliser des formules...]

Cordialement et bonne soirée (je la sens arriver chez moi !)

Rechercher des sujets similaires à "incrementation"