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)
avec les col (B à H) :
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 SubMerci à 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).
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.