VBA Insérer une formule dans une colonne selon la ligne

Bonjour,

Après mainte recherches, je poste ma première demande.

Pour le taff, je cherche à automatiser un stock de pneu. Pour le suivi, j'ai créer cette formule :

=SI(ESTVIDE($K2);"";SI(ET($I2=STOCK!$B2;$J2=STOCK!$C2;$K2=STOCK!$D2;$L2=STOCK!$E2;$M2=STOCK!$F2;$N2=STOCK!$G2;$O2<=STOCK!$H2);STOCK!$A2;"HS"))

Contexte :

J'ai 2 feuilles : DEMANDES_21(feuil1) et STOCK(Feuil2). L'idée est de comparer plusieurs colonnes de la feuil1 à des colonnes de la feuil2. LA formule ci-dessus est placé dans la colonne P (N° LOT)

Screens : (comparer les col de I à O)

1

avec les col (B à H) :

image

Et ainsi récupérer la valeur de la col A de la ligne correspondante si tout correspond.

Le code fonctionne bien mais elle doit être étirer jusqu'à la fin.... Ce qui n'est pas recommandé...

(Pour info, j'ai créé un formulaire vba qui remplie la feuille DEMANDES_21 et va en créer un autre pour le magasin afin de remplir le STOCK).

Je devrais faire le même principe avec la col CASIER dont voici le code actuel :

=SI(ESTNUM($P2);STOCK!$K2;"")

Ce que je souhaite : Je voudrais que lorsque la Macro créer une nouvelle ligne, que la formule soit incluse dans la colonne P à la ligne en dessous.(voici mon code actuel) :

Private Sub BoutonValide_Click() 'Au moment où tu clique sur valider, ça lance ce code ci-dessous

Dim DR, DR1 As Long 'définition des variables
Dim ws_demandes As Worksheet 'défini une variable reprennant le nom d'une feuille excel

Set ws_demandes = Worksheets("DEMANDES_21") 'reprend la variable de la feuille en lui indiquand quelle feuille c'est

DR = ws_demandes.Cells(Rows.Count, "A").End(xlUp).Row 'DR = DerniereLigne, retrouve la dernière ligne utilisée
DR1 = DR + 1 'ajoute 1 pour trouver donc la dernière ligne VIDE

    If TextBox1 = "" Or TextBox3 = "" Or TextBox4 = "" Or TextBox10 = "" Or TextBox11 = "" Or TextBox12 = "" Or ComboBox1 = "" Or TextBox14 = "" Then 'vérifie si les textbox et combobox sont vides
        MsgBox ("Veuillez renseigner correctement les informations obligatoires.")
    Else
        With ws_demandes 'sur la feuille dite, indique de coller les valeur ou texte des textbox/combobox dans les cellules défini
            .Cells(DR1, "A").Value = DR
            .Cells(DR1, "B").Value = DateValue(Now) 'Date de l'ordinateur
            .Cells(DR1, "C").Value = UCase(TextBox1) 'Nom
            .Cells(DR1, "D").Value = UCase(TextBox3) 'Id
            .Cells(DR1, "E").Value = UCase(TextBox4) 'CA
            .Cells(DR1, "F").Value = UCase(TextBox5) 'Immat
            .Cells(DR1, "G").Value = UCase(TextBox6) 'Chassis
            .Cells(DR1, "H").Value = UCase(TextBox7) 'Lieu
            .Cells(DR1, "I").Value = UCase(TextBox8) 'Marque
            .Cells(DR1, "J").Value = UCase(TextBox9) 'Type
            .Cells(DR1, "K").Value = TextBox10 'Taille
            .Cells(DR1, "L").Value = Val(TextBox11) 'Charge
            .Cells(DR1, "M").Value = TextBox12 'Vitesse
            .Cells(DR1, "N").Value = ComboBox1 'Saison
            .Cells(DR1, "O").Value = Val(TextBox14) 'Qté
        End With
    End If
    'Unload MacroFormulaireClient 'Fermer le formulaire
End Sub

Private Sub TextBox11_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii > 47 And KeyAscii < 58) Then
        KeyAscii = 0  'Si les caractères Ascii ne sont pas compris entre 47 et 58 (donc entre 0 et 9), impossible d'écrire
    End If
End Sub

Private Sub TextBox14_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii > 47 And KeyAscii < 58) Then
        KeyAscii = 0  'Si les caractères Ascii ne sont pas compris entre 47 et 58 (donc entre 0 et 9), impossible d'écrire
    End If
End Sub

Private Sub TextBox10_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not (KeyAscii > 46 And KeyAscii < 58) Then
        If Not (KeyAscii > 64 And KeyAscii < 91) Then
            KeyAscii = 0  'Si les caractères Ascii ne sont pas compris entre 46 et 58 , 64 et 91, impossible d'écrire
        End If
    End If
End Sub

Private Sub TextBox10_Enter() 'Quand tu clique sur la textbox, ça efface le xxx/xxRxx
    MsgBox ("Il est important de respecter le format de la taille du pneu choisi : xxx/xxRxx (cas spécial accepté).")
    If TextBox10 = "xxx/xxRxx" Then
        TextBox10 = ""
    End If
End Sub

Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Quand tu sors de la textbox, ça remet xxx/xxRxx
    If TextBox10 = "" Then
        TextBox10 = "xxx/xxRxx"
    Else
        TextBox10 = Format(TextBox10, "000/00R00")
    End If
End Sub

Private Sub UserForm_Initialize()
    Me.TextBox1.SetFocus 'place le curseur sur la case textbox
    TextBox10.Text = "xxx/xxRxx"
    MsgBox ("Veuillez bien respecter les formats indiqués afin d'éviter toute problématique d'Excel")
    With ComboBox1
        .AddItem "ÉTÉ"
        .AddItem "HIVER"
    End With
End Sub

Merci à vous ! :)

Bonjour FAFE93,

Si j'ai bien compris ta demande, je te propose d'ajouter dans le code 'BoutonValide_Click()' :

.Cells(DR1, "P").FormulaLocal = '=SI(ESTVIDE($K2);"";SI(ET($I2=STOCK!$B2;$J2=STOCK!$C2;$K2=STOCK!$D2;$L2=STOCK!$E2;$M2=STOCK!$F2;$N2=STOCK!$G2;$O2<=STOCK!$H2);STOCK!$A2;"HS"))'

(non testé en l'absence de classeur).

11pneu.xlsm (124.77 Ko)

Bonjour,

j'ai testé mais cela ne fonctionne pas. Voici mon fichier en question.

La formule doit être capable de modifier à chaque fois qu'elle être utilisé selon la ligne. Le DR1 reprend le numéro de ligne (ligne vide, car à chaque fois que le code est utilisé, il ajoute une nouvelle ligne avec les nouvelles informations.) Du coup, le code doit faire la recherche selon la ligne et donc modifier (par exemple) le I2 (du début) par I3 puis I4, pareil pour les autres cellules.

PS : j'en profite sur une autre question, pour la textox10, je souhaite imposer un format de pneu de type xxx/xxLLxx (avec x = chiffre et L = Lettre, sauf qu'il peut y avoir une ou deux lettre). comment imposer ce genre de format ?

Bon j'ai réussi à écrire une formule simple dans la cellule, mais avec ma formule que voici :

.Cells(DR1, "P").FormulaLocal = "=SI(ESTVIDE($K" & DR1 & ");"";SI(ET($I" & DR1 & "=STOCK!$B" & DR1 & ";$J" & DR1 & "=STOCK!$C" & DR1 & ";$K" & DR1 & "=STOCK!$D" & DR1 & ";$L" & DR1 & "=STOCK!$E" & DR1 & ";$M" & DR1 & "=STOCK!$F" & DR1 & ";$N" & DR1 & "=STOCK!$G" & DR1 & ";$O" & DR1 & "<=STOCK!$H" & DR1 & ");STOCK!$A" & DR1 & ";"HS"))"

Il me met l'erreur : erreur de compilation : attendu : fin d'instruction sur le "HS")) à la fin ... Si j'enlève les entres-côtes, ça fonctionne mais du coup une erreur 1004 apparaît quand je lance le code.

EDIT : Problème ci-dessus corrigé. il suffit de mettre 2 entrecôtes ""HS"" pour que cela fonctionne.

Rechercher des sujets similaires à "vba inserer formule colonne ligne"