VBA EX 2008 - récup formule et non valeur

Le
Congelator
Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B et insérer à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
pas de cell absolue Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 =
"=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Congelator
Le #19391161
rectification, il s'agit de XL 2007 et non 2008...
--
Céd / Lausanne


"Congelator" a écrit :

Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
pas de cell absolue... Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 =
"=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne



Mishell
Le #19394461
Bonjour.
Utilise la fonction =SOMMEPROD
Ex.: =SOMMEPROD(C2:C3;D2:D3)

Mishell

"Congelator" news:
rectification, il s'agit de XL 2007 et non 2008...
--
Céd / Lausanne


"Congelator" a écrit :

Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer
à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule
et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule,
donc
pas de cell absolue... Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette
question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai
sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des
colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° "
&
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 >> "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne





MichDenis
Le #19394661
Bonjour Congelator,

ça devrait ressembler à ce que tu cherches.

J'ai remplacé les "ActiveCell" par une variable objet
"Range" Ac qui représente ActiveCell dans la procédure.

'----------------------------------------
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 2
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(intCompteur)
Next

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(-1)
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub
'----------------------------------------



"Congelator" discussion :
Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
pas de cell absolue... Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne
Congelator
Le #19396161
Bonjour MichDenis,

Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
pour supprimer la limitation.

Merci !
--
Céd / Lausanne

"MichDenis" a écrit :

Bonjour Congelator,

ça devrait ressembler à ce que tu cherches.

J'ai remplacé les "ActiveCell" par une variable objet
"Range" Ac qui représente ActiveCell dans la procédure.

'----------------------------------------
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 2
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(intCompteur)
Next

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(-1)
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub
'----------------------------------------



"Congelator" discussion :
Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
pas de cell absolue... Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne




MichDenis
Le #19396281
| ton code s'arrête à 2 enregistrements

C'est assez simple à résoudre. Cela dépend de
la variable intNombreEnregistrements à laquelle
j'ai attribué la valeur 2. À toi de la définir selon
tes besoins.




"Congelator" discussion :
Bonjour MichDenis,

Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
pour supprimer la limitation.

Merci !
--
Céd / Lausanne

"MichDenis" a écrit :

Bonjour Congelator,

ça devrait ressembler à ce que tu cherches.

J'ai remplacé les "ActiveCell" par une variable objet
"Range" Ac qui représente ActiveCell dans la procédure.

'----------------------------------------
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 2
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(intCompteur)
Next

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(-1)
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub
'----------------------------------------



"Congelator" discussion :
Salut à tous,
J'ai besoin de vos lumières, voilà mon blème :
je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
non le résultat pour le total et là, je ne sais pas comment récupérer ces
infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
pas de cell absolue... Si qqn a une idée, je suis preneur.
Merci d'avance.

(PS : comme certaines questions concernant le VBA sont traitées dans ce
forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
celui qui n'en a pas.)

Voici mon code.
Option Explicit
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
ActiveCell.FormulaR1C1 = "Nom du produit"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "quantité"
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "prix à l'unité"

'écriture des valeurs données par l'utilisateur directement dans les
cellules sur X lignes
For intCompteur = 1 To intNombreEnregistrements
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'quantité
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
Next

'retour à la ligne + écriture du total
ActiveCell.Offset(1, -2).Range("A1").Select
ActiveCell.FormulaR1C1 = "TOTAL"
ActiveCell.Offset(0, 2).Range("A1").Select

'formule de calcul du total à modifier pour qu'elle soit dynamique et
relative
ActiveCell.FormulaR1C1 > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"

'redimentionnage des colonnes automatique
ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
End Sub

--
Céd / Lausanne




Congelator
Le #19397091
J'ai réussi à un détail près : je dois presser "Enter" pour que la formule
s'affiche au lieu de "##NOM?"... C'est déjà mieux. Est-ce que tu sais comment
contourner ce problème ?

Voici le code modifié.
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer
Dim strFormule As String
Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit" 'cellule active
Ac.Offset(0, 1) = "quantité" 'cellule active + 1 colonne à droite
Ac.Offset(0, 2) = "prix à l'unité" 'cellule active + 2 colonnes à droite

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes

Set Ac = Ac.Offset(1) ' cellule active + 1 ligne en dessous
For intCompteur = 1 To intNombreEnregistrements 'début de la boucle
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select 'cellule active + 1 colonne à droite
Ac.Offset(, 1) = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select 'cellule active + 2 colonnes à droite
Ac.Offset(, 2) = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1) 'cellule active + 1 ligne en dessous
Next 'fin de la boucle

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(1, 0) 'cellule active + 1 ligne en dessous
Ac = "TOTAL"
strFormule = 0
ActiveCell.Offset(2, 0).Range("A1").Select
'formule de calcul
strFormule = "=PRODUIT(" & Ac.Offset(-intNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"
For intCompteur = -intNombreEnregistrements + 1 To -1 'début de la
boucle en fonction du nombre d'enregistrements demandés
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur
- 1, 1).Resize(1, 2).Address(0, 0) & ")"
Next 'fin de la boucle
Ac.Offset(0, 2).Formula = strFormule 'inscription sous forme de "formule"
Ac.Resize(, 3).EntireColumn.AutoFit 'ajustement des colonnes
End Sub

Merci pour ton aide.
--
Céd / Lausanne


"MichDenis" a écrit :


| ton code s'arrête à 2 enregistrements

C'est assez simple à résoudre. Cela dépend de
la variable intNombreEnregistrements à laquelle
j'ai attribué la valeur 2. À toi de la définir selon
tes besoins.




"Congelator" discussion :
Bonjour MichDenis,

Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
pour supprimer la limitation.

Merci !
--
Céd / Lausanne

"MichDenis" a écrit :

> Bonjour Congelator,
>
> ça devrait ressembler à ce que tu cherches.
>
> J'ai remplacé les "ActiveCell" par une variable objet
> "Range" Ac qui représente ActiveCell dans la procédure.
>
> '----------------------------------------
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
>
> Dim Ac As Range
> Set Ac = ActiveCell
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> 'intNombreEnregistrements = InputBox("veuillez entrer le nombre
> 'd 'enregistrements à effectuer", "enregistrements")
> Ac = "Nom du produit"
> Ac.Offset(0, 1) = "quantité"
> Ac.Offset(0, 2) = "prix à l'unité"
>
> 'écriture des valeurs données par l'utilisateur
> 'directement dans les cellules sur X lignes
> intNombreEnregistrements = 2
> Set Ac = Ac.Offset(1)
> For intCompteur = 1 To intNombreEnregistrements
> 'nom du produit
> Ac.Select
> Ac = InputBox("nom du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'quantité
> Ac.Offset(, 1).Select
> Ac.Offset(, 1) = _
> InputBox("quantité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'prix unitaire
> Ac.Offset(, 2).Select
> Ac.Offset(, 2) = _
> InputBox("prix à l'unité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> Set Ac = Ac.Offset(intCompteur)
> Next
>
> 'retour à la ligne + écriture du total
> Set Ac = Ac.Offset(-1)
> Ac = "TOTAL"
> Ac.Offset(, 1).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
> Ac.Offset(, 2).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
> Ac.Resize(, 3).EntireColumn.AutoFit
> End Sub
> '----------------------------------------
>
>
>
> "Congelator" > discussion :
> Salut à tous,
> J'ai besoin de vos lumières, voilà mon blème :
> je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
> tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
> fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
> non le résultat pour le total et là, je ne sais pas comment récupérer ces
> infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
> pas de cell absolue... Si qqn a une idée, je suis preneur.
> Merci d'avance.
>
> (PS : comme certaines questions concernant le VBA sont traitées dans ce
> forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
> sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
> celui qui n'en a pas.)
>
> Voici mon code.
> Option Explicit
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> intNombreEnregistrements = InputBox("veuillez entrer le nombre
> d'enregistrements à effectuer", "enregistrements")
> ActiveCell.FormulaR1C1 = "Nom du produit"
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = "quantité"
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = "prix à l'unité"
>
> 'écriture des valeurs données par l'utilisateur directement dans les
> cellules sur X lignes
> For intCompteur = 1 To intNombreEnregistrements
> ActiveCell.Offset(1, -2).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'quantité
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
> Next
>
> 'retour à la ligne + écriture du total
> ActiveCell.Offset(1, -2).Range("A1").Select
> ActiveCell.FormulaR1C1 = "TOTAL"
> ActiveCell.Offset(0, 2).Range("A1").Select
>
> 'formule de calcul du total à modifier pour qu'elle soit dynamique et
> relative
> ActiveCell.FormulaR1C1 > > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"
>
> 'redimentionnage des colonnes automatique
> ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
> End Sub
>
> --
> Céd / Lausanne
>
>



MichDenis
Le #19397491
Essaie ceci : il y avait une légère erreur. Désolé.

Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 5
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1)
Next

'retour à la ligne + écriture du total
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub





"Congelator" discussion :
J'ai réussi à un détail près : je dois presser "Enter" pour que la formule
s'affiche au lieu de "##NOM?"... C'est déjà mieux. Est-ce que tu sais comment
contourner ce problème ?

Voici le code modifié.
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer
Dim strFormule As String
Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit" 'cellule active
Ac.Offset(0, 1) = "quantité" 'cellule active + 1 colonne à droite
Ac.Offset(0, 2) = "prix à l'unité" 'cellule active + 2 colonnes à droite

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes

Set Ac = Ac.Offset(1) ' cellule active + 1 ligne en dessous
For intCompteur = 1 To intNombreEnregistrements 'début de la boucle
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select 'cellule active + 1 colonne à droite
Ac.Offset(, 1) = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select 'cellule active + 2 colonnes à droite
Ac.Offset(, 2) = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1) 'cellule active + 1 ligne en dessous
Next 'fin de la boucle

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(1, 0) 'cellule active + 1 ligne en dessous
Ac = "TOTAL"
strFormule = 0
ActiveCell.Offset(2, 0).Range("A1").Select
'formule de calcul
strFormule = "=PRODUIT(" & Ac.Offset(-intNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"
For intCompteur = -intNombreEnregistrements + 1 To -1 'début de la
boucle en fonction du nombre d'enregistrements demandés
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur
- 1, 1).Resize(1, 2).Address(0, 0) & ")"
Next 'fin de la boucle
Ac.Offset(0, 2).Formula = strFormule 'inscription sous forme de "formule"
Ac.Resize(, 3).EntireColumn.AutoFit 'ajustement des colonnes
End Sub

Merci pour ton aide.
--
Céd / Lausanne


"MichDenis" a écrit :


| ton code s'arrête à 2 enregistrements

C'est assez simple à résoudre. Cela dépend de
la variable intNombreEnregistrements à laquelle
j'ai attribué la valeur 2. À toi de la définir selon
tes besoins.




"Congelator" discussion :
Bonjour MichDenis,

Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
pour supprimer la limitation.

Merci !
--
Céd / Lausanne

"MichDenis" a écrit :

> Bonjour Congelator,
>
> ça devrait ressembler à ce que tu cherches.
>
> J'ai remplacé les "ActiveCell" par une variable objet
> "Range" Ac qui représente ActiveCell dans la procédure.
>
> '----------------------------------------
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
>
> Dim Ac As Range
> Set Ac = ActiveCell
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> 'intNombreEnregistrements = InputBox("veuillez entrer le nombre
> 'd 'enregistrements à effectuer", "enregistrements")
> Ac = "Nom du produit"
> Ac.Offset(0, 1) = "quantité"
> Ac.Offset(0, 2) = "prix à l'unité"
>
> 'écriture des valeurs données par l'utilisateur
> 'directement dans les cellules sur X lignes
> intNombreEnregistrements = 2
> Set Ac = Ac.Offset(1)
> For intCompteur = 1 To intNombreEnregistrements
> 'nom du produit
> Ac.Select
> Ac = InputBox("nom du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'quantité
> Ac.Offset(, 1).Select
> Ac.Offset(, 1) = _
> InputBox("quantité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'prix unitaire
> Ac.Offset(, 2).Select
> Ac.Offset(, 2) = _
> InputBox("prix à l'unité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> Set Ac = Ac.Offset(intCompteur)
> Next
>
> 'retour à la ligne + écriture du total
> Set Ac = Ac.Offset(-1)
> Ac = "TOTAL"
> Ac.Offset(, 1).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
> Ac.Offset(, 2).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
> Ac.Resize(, 3).EntireColumn.AutoFit
> End Sub
> '----------------------------------------
>
>
>
> "Congelator" > discussion :
> Salut à tous,
> J'ai besoin de vos lumières, voilà mon blème :
> je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
> tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
> fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
> non le résultat pour le total et là, je ne sais pas comment récupérer ces
> infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
> pas de cell absolue... Si qqn a une idée, je suis preneur.
> Merci d'avance.
>
> (PS : comme certaines questions concernant le VBA sont traitées dans ce
> forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
> sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
> celui qui n'en a pas.)
>
> Voici mon code.
> Option Explicit
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> intNombreEnregistrements = InputBox("veuillez entrer le nombre
> d'enregistrements à effectuer", "enregistrements")
> ActiveCell.FormulaR1C1 = "Nom du produit"
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = "quantité"
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = "prix à l'unité"
>
> 'écriture des valeurs données par l'utilisateur directement dans les
> cellules sur X lignes
> For intCompteur = 1 To intNombreEnregistrements
> ActiveCell.Offset(1, -2).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'quantité
> ActiveCell.Offset(0, 1).Range("A1").Select
> ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
> Next
>
> 'retour à la ligne + écriture du total
> ActiveCell.Offset(1, -2).Range("A1").Select
> ActiveCell.FormulaR1C1 = "TOTAL"
> ActiveCell.Offset(0, 2).Range("A1").Select
>
> 'formule de calcul du total à modifier pour qu'elle soit dynamique et
> relative
> ActiveCell.FormulaR1C1 > > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"
>
> 'redimentionnage des colonnes automatique
> ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
> End Sub
>
> --
> Céd / Lausanne
>
>



Congelator
Le #19403021
Pas de problème, mes connaissances en VBA sont tellement basiques que je n'ai
rien vu... :-)
par contre, j'ai remarqué que le résultat du calcul est faux, il ne prend
pas les bonnes colonnes.
Est-ce que le fait que j'aie "#NOM?" au lieu de la formule peut provenir du
fait que j'utilise "=PRODUIT" au lieu de "=Sum" comme toi ? Dans tous les
cas, merci pour ton aide, le reste n'est que détail (si tu as une
explication, ça m'arrangerait de ne pas mourir idiot :-) ) mais sinon encore
merci.
Et pour ceux qui seraient intéressés, voici le code complet, il faut juste
cliquer dans la barre des formules et faire "Enter" pour afficher
correctement.

*********
Option Explicit
'----------------------------------------------------------------------------------------------------
'Cette fonction vérifie que la valeur passée en paramètre est bien un nombre
'Si c'est bien un nombre, elle retourne True sinon, elle retourne False
'----------------------------------------------------------------------------------------------------
Function isValidInt(strATester) As Boolean
If IsNumeric(strATester) Then
isValidInt = True
Else
isValidInt = False
End If
End Function
'----------------------------------------------------------------------------------------------------
'Cette fonction utilise la fonction isValidInt et interagit avec
l'utilisateur en fonction
'de la valeur retournée par isValidInt
'----------------------------------------------------------------------------------------------------
Function erreurSi(strValeur) As Boolean
If isValidInt(strValeur) = True Then
erreurSi = True
Else
MsgBox "désolé, la valeur entrée n'est pas conforme", , "erreurSi"
erreurSi = False
End If
End Function

Sub Macro2()
Dim strNombreEnregistrements As String 'nombre de produits à rentrer
dans le tableau
Dim intCompteur As Integer 'variable utilisée lors de la
boucle permettant d'écrire la formule
Dim strQuantite As String 'quantité du produit enregistré
Dim strPrix As String 'prix du produit enregistré
Dim strFormule As String 'formule contenant le calcul à
poser dans la tableau excel
Dim intNombreerreurSi As Integer 'contient le nombre d'erreurSis

'déclaration et initialisation de la variable contenant l'emplacement de
la cellule active
Dim Ac As Range
Set Ac = ActiveCell

Do 'boucle tant que la valeur entrée n'est pas un nombre
strNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Loop Until erreurSi(strNombreEnregistrements) = True
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

Set Ac = Ac.Offset(1)

'boucle permettant d'entrer toutes les données du tableau
For intCompteur = 1 To strNombreEnregistrements

'----------nom du produit--------------------
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur, "enregistrement n°
" & intCompteur)

'------------quantité------------------------
Ac.Offset(, 1).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strQuantite = InputBox("quantité du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
Loop Until erreurSi(strQuantite) = True

Ac.Offset(, 1) = strQuantite

'----------prix unitaire---------------------
Ac.Offset(, 2).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strPrix = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Loop Until erreurSi(strPrix) = True

Ac.Offset(, 2) = strPrix
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de
la cellule du prix en monétaire

'sélection de la cellule d'en dessous
Set Ac = Ac.Offset(1)
Next

Set Ac = Ac.Offset(1)
Ac = "TOTAL"

ActiveCell.Offset(2).Range("A1").Select

'définition du texte initial pour la formule
strFormule = "=PRODUIT(" & Ac.Offset(-strNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"

'définiton de la suite du texte pour la formule
For intCompteur = -strNombreEnregistrements + 1 To -1
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur - 1,
1).Resize(1, 2).Address(0, 0) & ")"
Next

Ac.Offset(, 2).Formula = strFormule 'écriture de la formule
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de la
cellule du total en monétaire
Ac.Resize(, 3).EntireColumn.AutoFit 'redimentionnement automatique des
colonnes
End Sub



--
Céd / Lausanne


"MichDenis" a écrit :

Essaie ceci : il y avait une légère erreur. Désolé.

Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 5
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1)
Next

'retour à la ligne + écriture du total
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub





"Congelator" discussion :
J'ai réussi à un détail près : je dois presser "Enter" pour que la formule
s'affiche au lieu de "##NOM?"... C'est déjà mieux. Est-ce que tu sais comment
contourner ce problème ?

Voici le code modifié.
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer
Dim strFormule As String
Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit" 'cellule active
Ac.Offset(0, 1) = "quantité" 'cellule active + 1 colonne à droite
Ac.Offset(0, 2) = "prix à l'unité" 'cellule active + 2 colonnes à droite

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes

Set Ac = Ac.Offset(1) ' cellule active + 1 ligne en dessous
For intCompteur = 1 To intNombreEnregistrements 'début de la boucle
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select 'cellule active + 1 colonne à droite
Ac.Offset(, 1) = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select 'cellule active + 2 colonnes à droite
Ac.Offset(, 2) = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1) 'cellule active + 1 ligne en dessous
Next 'fin de la boucle

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(1, 0) 'cellule active + 1 ligne en dessous
Ac = "TOTAL"
strFormule = 0
ActiveCell.Offset(2, 0).Range("A1").Select
'formule de calcul
strFormule = "=PRODUIT(" & Ac.Offset(-intNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"
For intCompteur = -intNombreEnregistrements + 1 To -1 'début de la
boucle en fonction du nombre d'enregistrements demandés
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur
- 1, 1).Resize(1, 2).Address(0, 0) & ")"
Next 'fin de la boucle
Ac.Offset(0, 2).Formula = strFormule 'inscription sous forme de "formule"
Ac.Resize(, 3).EntireColumn.AutoFit 'ajustement des colonnes
End Sub

Merci pour ton aide.
--
Céd / Lausanne


"MichDenis" a écrit :

>
> | ton code s'arrête à 2 enregistrements
>
> C'est assez simple à résoudre. Cela dépend de
> la variable intNombreEnregistrements à laquelle
> j'ai attribué la valeur 2. À toi de la définir selon
> tes besoins.
>
>
>
>
> "Congelator" > discussion :
> Bonjour MichDenis,
>
> Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
> ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
> d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
> pour supprimer la limitation.
>
> Merci !
> --
> Céd / Lausanne
>
> "MichDenis" a écrit :
>
> > Bonjour Congelator,
> >
> > ça devrait ressembler à ce que tu cherches.
> >
> > J'ai remplacé les "ActiveCell" par une variable objet
> > "Range" Ac qui représente ActiveCell dans la procédure.
> >
> > '----------------------------------------
> > Sub Macro2()
> > Dim intNombreEnregistrements As Integer
> > Dim intCompteurVertical As Integer
> > Dim intCompteurHorizontal As Integer
> > Dim intCompteur As Integer
> >
> > Dim Ac As Range
> > Set Ac = ActiveCell
> >
> > 'enregistrement du nombre de lignes + écriture des titres des colonnes
> > 'intNombreEnregistrements = InputBox("veuillez entrer le nombre
> > 'd 'enregistrements à effectuer", "enregistrements")
> > Ac = "Nom du produit"
> > Ac.Offset(0, 1) = "quantité"
> > Ac.Offset(0, 2) = "prix à l'unité"
> >
> > 'écriture des valeurs données par l'utilisateur
> > 'directement dans les cellules sur X lignes
> > intNombreEnregistrements = 2
> > Set Ac = Ac.Offset(1)
> > For intCompteur = 1 To intNombreEnregistrements
> > 'nom du produit
> > Ac.Select
> > Ac = InputBox("nom du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > 'quantité
> > Ac.Offset(, 1).Select
> > Ac.Offset(, 1) = _
> > InputBox("quantité du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > 'prix unitaire
> > Ac.Offset(, 2).Select
> > Ac.Offset(, 2) = _
> > InputBox("prix à l'unité du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > Set Ac = Ac.Offset(intCompteur)
> > Next
> >
> > 'retour à la ligne + écriture du total
> > Set Ac = Ac.Offset(-1)
> > Ac = "TOTAL"
> > Ac.Offset(, 1).Formula = _
> > "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> > 1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
> > Ac.Offset(, 2).Formula = _
> > "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> > 2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
> > Ac.Resize(, 3).EntireColumn.AutoFit
> > End Sub
> > '----------------------------------------
> >
> >
> >
> > "Congelator" > > discussion :
> > Salut à tous,
> > J'ai besoin de vos lumières, voilà mon blème :
> > je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
> > tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
> > fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
> > non le résultat pour le total et là, je ne sais pas comment récupérer ces
> > infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
> > pas de cell absolue... Si qqn a une idée, je suis preneur.
> > Merci d'avance.
> >
> > (PS : comme certaines questions concernant le VBA sont traitées dans ce
> > forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
> > sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
> > celui qui n'en a pas.)
> >
> > Voici mon code.
> > Option Explicit
> > Sub Macro2()
> > Dim intNombreEnregistrements As Integer
> > Dim intCompteurVertical As Integer
> > Dim intCompteurHorizontal As Integer
> > Dim intCompteur As Integer
> >
> > 'enregistrement du nombre de lignes + écriture des titres des colonnes
> > intNombreEnregistrements = InputBox("veuillez entrer le nombre
> > d'enregistrements à effectuer", "enregistrements")
> > ActiveCell.FormulaR1C1 = "Nom du produit"
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "quantité"
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "prix à l'unité"
> >
> > 'écriture des valeurs données par l'utilisateur directement dans les
> > cellules sur X lignes
> > For intCompteur = 1 To intNombreEnregistrements
> > ActiveCell.Offset(1, -2).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'quantité
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
> > Next
> >
> > 'retour à la ligne + écriture du total
> > ActiveCell.Offset(1, -2).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "TOTAL"
> > ActiveCell.Offset(0, 2).Range("A1").Select
> >
> > 'formule de calcul du total à modifier pour qu'elle soit dynamique et
> > relative
> > ActiveCell.FormulaR1C1 > > > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"
> >
> > 'redimentionnage des colonnes automatique
> > ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > End Sub
> >
> > --
> > Céd / Lausanne
> >
> >
>



MichDenis
Le #19403371
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"
Ac.Offset(0, 3) = "Total"
With Ac.Resize(, 4)
.Font.Bold = True
.Font.Size = 14
.Font.ColorIndex = 25
.HorizontalAlignment = xlCenter
.EntireColumn.AutoFit
End With
'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 5
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)

'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
With Ac.Offset(, 2)
.Select
.NumberFormat = "# ##0.00 $"
.Value = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
End With
With Ac.Offset(, 3)
.NumberFormat = "# ##0.00 $"
.Formula = _
"=Product(" & Ac.Offset(, 1).Address(0, 0) & ":" & _
Ac.Offset(, 2).Address(0, 0) & ")"
End With
Set Ac = Ac.Offset(1)
Next

'retour à la ligne + écriture du total
Ac = "GRAND TOTAL"
Ac.Offset(, 3).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
3).Resize(intNombreEnregistrements, 3).Address(0, 0) & ")"

Ac.Resize(, 4).EntireColumn.AutoFit
End Sub






"Congelator" discussion :
Pas de problème, mes connaissances en VBA sont tellement basiques que je n'ai
rien vu... :-)
par contre, j'ai remarqué que le résultat du calcul est faux, il ne prend
pas les bonnes colonnes.
Est-ce que le fait que j'aie "#NOM?" au lieu de la formule peut provenir du
fait que j'utilise "=PRODUIT" au lieu de "=Sum" comme toi ? Dans tous les
cas, merci pour ton aide, le reste n'est que détail (si tu as une
explication, ça m'arrangerait de ne pas mourir idiot :-) ) mais sinon encore
merci.
Et pour ceux qui seraient intéressés, voici le code complet, il faut juste
cliquer dans la barre des formules et faire "Enter" pour afficher
correctement.

*********
Option Explicit
'----------------------------------------------------------------------------------------------------
'Cette fonction vérifie que la valeur passée en paramètre est bien un nombre
'Si c'est bien un nombre, elle retourne True sinon, elle retourne False
'----------------------------------------------------------------------------------------------------
Function isValidInt(strATester) As Boolean
If IsNumeric(strATester) Then
isValidInt = True
Else
isValidInt = False
End If
End Function
'----------------------------------------------------------------------------------------------------
'Cette fonction utilise la fonction isValidInt et interagit avec
l'utilisateur en fonction
'de la valeur retournée par isValidInt
'----------------------------------------------------------------------------------------------------
Function erreurSi(strValeur) As Boolean
If isValidInt(strValeur) = True Then
erreurSi = True
Else
MsgBox "désolé, la valeur entrée n'est pas conforme", , "erreurSi"
erreurSi = False
End If
End Function

Sub Macro2()
Dim strNombreEnregistrements As String 'nombre de produits à rentrer
dans le tableau
Dim intCompteur As Integer 'variable utilisée lors de la
boucle permettant d'écrire la formule
Dim strQuantite As String 'quantité du produit enregistré
Dim strPrix As String 'prix du produit enregistré
Dim strFormule As String 'formule contenant le calcul à
poser dans la tableau excel
Dim intNombreerreurSi As Integer 'contient le nombre d'erreurSis

'déclaration et initialisation de la variable contenant l'emplacement de
la cellule active
Dim Ac As Range
Set Ac = ActiveCell

Do 'boucle tant que la valeur entrée n'est pas un nombre
strNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Loop Until erreurSi(strNombreEnregistrements) = True
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

Set Ac = Ac.Offset(1)

'boucle permettant d'entrer toutes les données du tableau
For intCompteur = 1 To strNombreEnregistrements

'----------nom du produit--------------------
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur, "enregistrement n°
" & intCompteur)

'------------quantité------------------------
Ac.Offset(, 1).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strQuantite = InputBox("quantité du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
Loop Until erreurSi(strQuantite) = True

Ac.Offset(, 1) = strQuantite

'----------prix unitaire---------------------
Ac.Offset(, 2).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strPrix = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Loop Until erreurSi(strPrix) = True

Ac.Offset(, 2) = strPrix
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de
la cellule du prix en monétaire

'sélection de la cellule d'en dessous
Set Ac = Ac.Offset(1)
Next

Set Ac = Ac.Offset(1)
Ac = "TOTAL"

ActiveCell.Offset(2).Range("A1").Select

'définition du texte initial pour la formule
strFormule = "=PRODUIT(" & Ac.Offset(-strNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"

'définiton de la suite du texte pour la formule
For intCompteur = -strNombreEnregistrements + 1 To -1
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur - 1,
1).Resize(1, 2).Address(0, 0) & ")"
Next

Ac.Offset(, 2).Formula = strFormule 'écriture de la formule
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de la
cellule du total en monétaire
Ac.Resize(, 3).EntireColumn.AutoFit 'redimentionnement automatique des
colonnes
End Sub



--
Céd / Lausanne


"MichDenis" a écrit :

Essaie ceci : il y avait une légère erreur. Désolé.

Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 5
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select
Ac.Offset(, 2) = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1)
Next

'retour à la ligne + écriture du total
Ac = "TOTAL"
Ac.Offset(, 1).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
Ac.Offset(, 2).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
Ac.Resize(, 3).EntireColumn.AutoFit
End Sub





"Congelator" discussion :
J'ai réussi à un détail près : je dois presser "Enter" pour que la formule
s'affiche au lieu de "##NOM?"... C'est déjà mieux. Est-ce que tu sais comment
contourner ce problème ?

Voici le code modifié.
Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer
Dim strFormule As String
Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
intNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit" 'cellule active
Ac.Offset(0, 1) = "quantité" 'cellule active + 1 colonne à droite
Ac.Offset(0, 2) = "prix à l'unité" 'cellule active + 2 colonnes à droite

'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes

Set Ac = Ac.Offset(1) ' cellule active + 1 ligne en dessous
For intCompteur = 1 To intNombreEnregistrements 'début de la boucle
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
'quantité
Ac.Offset(, 1).Select 'cellule active + 1 colonne à droite
Ac.Offset(, 1) = InputBox("quantité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
Ac.Offset(, 2).Select 'cellule active + 2 colonnes à droite
Ac.Offset(, 2) = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Set Ac = Ac.Offset(1) 'cellule active + 1 ligne en dessous
Next 'fin de la boucle

'retour à la ligne + écriture du total
Set Ac = Ac.Offset(1, 0) 'cellule active + 1 ligne en dessous
Ac = "TOTAL"
strFormule = 0
ActiveCell.Offset(2, 0).Range("A1").Select
'formule de calcul
strFormule = "=PRODUIT(" & Ac.Offset(-intNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"
For intCompteur = -intNombreEnregistrements + 1 To -1 'début de la
boucle en fonction du nombre d'enregistrements demandés
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur
- 1, 1).Resize(1, 2).Address(0, 0) & ")"
Next 'fin de la boucle
Ac.Offset(0, 2).Formula = strFormule 'inscription sous forme de "formule"
Ac.Resize(, 3).EntireColumn.AutoFit 'ajustement des colonnes
End Sub

Merci pour ton aide.
--
Céd / Lausanne


"MichDenis" a écrit :

>
> | ton code s'arrête à 2 enregistrements
>
> C'est assez simple à résoudre. Cela dépend de
> la variable intNombreEnregistrements à laquelle
> j'ai attribué la valeur 2. À toi de la définir selon
> tes besoins.
>
>
>
>
> "Congelator" > discussion :
> Bonjour MichDenis,
>
> Merci pour le coup de main. J'ai effectivement la formule qui s'inscrit mais
> ton code s'arrête à 2 enregistrements alors que l'utilisateur peut décider
> d'en mettre 3, 20 ou 50... Il faut que je trouve comment adapter ton code
> pour supprimer la limitation.
>
> Merci !
> --
> Céd / Lausanne
>
> "MichDenis" a écrit :
>
> > Bonjour Congelator,
> >
> > ça devrait ressembler à ce que tu cherches.
> >
> > J'ai remplacé les "ActiveCell" par une variable objet
> > "Range" Ac qui représente ActiveCell dans la procédure.
> >
> > '----------------------------------------
> > Sub Macro2()
> > Dim intNombreEnregistrements As Integer
> > Dim intCompteurVertical As Integer
> > Dim intCompteurHorizontal As Integer
> > Dim intCompteur As Integer
> >
> > Dim Ac As Range
> > Set Ac = ActiveCell
> >
> > 'enregistrement du nombre de lignes + écriture des titres des colonnes
> > 'intNombreEnregistrements = InputBox("veuillez entrer le nombre
> > 'd 'enregistrements à effectuer", "enregistrements")
> > Ac = "Nom du produit"
> > Ac.Offset(0, 1) = "quantité"
> > Ac.Offset(0, 2) = "prix à l'unité"
> >
> > 'écriture des valeurs données par l'utilisateur
> > 'directement dans les cellules sur X lignes
> > intNombreEnregistrements = 2
> > Set Ac = Ac.Offset(1)
> > For intCompteur = 1 To intNombreEnregistrements
> > 'nom du produit
> > Ac.Select
> > Ac = InputBox("nom du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > 'quantité
> > Ac.Offset(, 1).Select
> > Ac.Offset(, 1) = _
> > InputBox("quantité du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > 'prix unitaire
> > Ac.Offset(, 2).Select
> > Ac.Offset(, 2) = _
> > InputBox("prix à l'unité du produit n° " & _
> > intCompteur, "enregistrement n° " & intCompteur)
> > Set Ac = Ac.Offset(intCompteur)
> > Next
> >
> > 'retour à la ligne + écriture du total
> > Set Ac = Ac.Offset(-1)
> > Ac = "TOTAL"
> > Ac.Offset(, 1).Formula = _
> > "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> > 1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
> > Ac.Offset(, 2).Formula = _
> > "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> > 2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
> > Ac.Resize(, 3).EntireColumn.AutoFit
> > End Sub
> > '----------------------------------------
> >
> >
> >
> > "Congelator" > > de
> > discussion :
> > Salut à tous,
> > J'ai besoin de vos lumières, voilà mon blème :
> > je dois créer une macro en VBA. L'utilisateur choisi le nb de produits en
> > tout, la qté de A, le prix de A, la qté de B, le prix de B... et insérer à la
> > fin le total. Jusque là ça joue, par contre, je dois insérer la formule et
> > non le résultat pour le total et là, je ne sais pas comment récupérer ces
> > infos. Info supplémentaire, c'est l'utilisateur qui choisi la cellule, donc
> > pas de cell absolue... Si qqn a une idée, je suis preneur.
> > Merci d'avance.
> >
> > (PS : comme certaines questions concernant le VBA sont traitées dans ce
> > forum mais qu'il y en a un qui traite du VB, j'ai aussi mis cette question
> > sous "Développement - VB". Lorsque j'aurai la réponse, je la répercuterai sur
> > celui qui n'en a pas.)
> >
> > Voici mon code.
> > Option Explicit
> > Sub Macro2()
> > Dim intNombreEnregistrements As Integer
> > Dim intCompteurVertical As Integer
> > Dim intCompteurHorizontal As Integer
> > Dim intCompteur As Integer
> >
> > 'enregistrement du nombre de lignes + écriture des titres des colonnes
> > intNombreEnregistrements = InputBox("veuillez entrer le nombre
> > d'enregistrements à effectuer", "enregistrements")
> > ActiveCell.FormulaR1C1 = "Nom du produit"
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "quantité"
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "prix à l'unité"
> >
> > 'écriture des valeurs données par l'utilisateur directement dans les
> > cellules sur X lignes
> > For intCompteur = 1 To intNombreEnregistrements
> > ActiveCell.Offset(1, -2).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("nom du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'nom du produit
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("quantité du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'quantité
> > ActiveCell.Offset(0, 1).Range("A1").Select
> > ActiveCell.FormulaR1C1 = InputBox("prix à l'unité du produit n° " &
> > intCompteur, "enregistrement n° " & intCompteur) 'prix unitaire
> > Next
> >
> > 'retour à la ligne + écriture du total
> > ActiveCell.Offset(1, -2).Range("A1").Select
> > ActiveCell.FormulaR1C1 = "TOTAL"
> > ActiveCell.Offset(0, 2).Range("A1").Select
> >
> > 'formule de calcul du total à modifier pour qu'elle soit dynamique et
> > relative
> > ActiveCell.FormulaR1C1 > > > "=R[-3]C[-1]*R[-3]C+R[-2]C[-1]*R[-2]C+R[-1]C[-1]*R[-1]C"
> >
> > 'redimentionnage des colonnes automatique
> > ActiveCell.Offset(0, -2).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > ActiveCell.Offset(0, -1).Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit
> > End Sub
> >
> > --
> > Céd / Lausanne
> >
> >
>



Congelator
Le #19406411
Merci beaucoup pour tous tes efforts et ton temps passé à m'aider. J'ai
trouvé la raison de l'erreur "#NOM ?" c'est tellement c*n... !!! J'ai mis la
formule en français (PRODUIT) au lieu de la mettre en anglais (PRODUCT). En
changeant le i en C tout fonctionne à merveille ! C'est en regardant ton
code que j'ai remarqué que SOMME était écrit Sum et là, la lumière c'est
allumée au fond de mon petit cerveau... :-)
Encore merci.
--
Céd / Lausanne


"MichDenis" wrote:

Sub Macro2()
Dim intNombreEnregistrements As Integer
Dim intCompteurVertical As Integer
Dim intCompteurHorizontal As Integer
Dim intCompteur As Integer

Dim Ac As Range
Set Ac = ActiveCell

'enregistrement du nombre de lignes + écriture des titres des colonnes
'intNombreEnregistrements = InputBox("veuillez entrer le nombre
'd 'enregistrements à effectuer", "enregistrements")
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"
Ac.Offset(0, 3) = "Total"
With Ac.Resize(, 4)
.Font.Bold = True
.Font.Size = 14
.Font.ColorIndex = 25
.HorizontalAlignment = xlCenter
.EntireColumn.AutoFit
End With
'écriture des valeurs données par l'utilisateur
'directement dans les cellules sur X lignes
intNombreEnregistrements = 5
Set Ac = Ac.Offset(1)
For intCompteur = 1 To intNombreEnregistrements
'nom du produit
Ac.Select
Ac = InputBox("nom du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)

'quantité
Ac.Offset(, 1).Select
Ac.Offset(, 1) = _
InputBox("quantité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
'prix unitaire
With Ac.Offset(, 2)
.Select
.NumberFormat = "# ##0.00 $"
.Value = _
InputBox("prix à l'unité du produit n° " & _
intCompteur, "enregistrement n° " & intCompteur)
End With
With Ac.Offset(, 3)
.NumberFormat = "# ##0.00 $"
.Formula = _
"=Product(" & Ac.Offset(, 1).Address(0, 0) & ":" & _
Ac.Offset(, 2).Address(0, 0) & ")"
End With
Set Ac = Ac.Offset(1)
Next

'retour à la ligne + écriture du total
Ac = "GRAND TOTAL"
Ac.Offset(, 3).Formula = _
"=Sum(" & Ac.Offset(-intNombreEnregistrements, _
3).Resize(intNombreEnregistrements, 3).Address(0, 0) & ")"

Ac.Resize(, 4).EntireColumn.AutoFit
End Sub






"Congelator" discussion :
Pas de problème, mes connaissances en VBA sont tellement basiques que je n'ai
rien vu... :-)
par contre, j'ai remarqué que le résultat du calcul est faux, il ne prend
pas les bonnes colonnes.
Est-ce que le fait que j'aie "#NOM?" au lieu de la formule peut provenir du
fait que j'utilise "=PRODUIT" au lieu de "=Sum" comme toi ? Dans tous les
cas, merci pour ton aide, le reste n'est que détail (si tu as une
explication, ça m'arrangerait de ne pas mourir idiot :-) ) mais sinon encore
merci.
Et pour ceux qui seraient intéressés, voici le code complet, il faut juste
cliquer dans la barre des formules et faire "Enter" pour afficher
correctement.

*********
Option Explicit
'----------------------------------------------------------------------------------------------------
'Cette fonction vérifie que la valeur passée en paramètre est bien un nombre
'Si c'est bien un nombre, elle retourne True sinon, elle retourne False
'----------------------------------------------------------------------------------------------------
Function isValidInt(strATester) As Boolean
If IsNumeric(strATester) Then
isValidInt = True
Else
isValidInt = False
End If
End Function
'----------------------------------------------------------------------------------------------------
'Cette fonction utilise la fonction isValidInt et interagit avec
l'utilisateur en fonction
'de la valeur retournée par isValidInt
'----------------------------------------------------------------------------------------------------
Function erreurSi(strValeur) As Boolean
If isValidInt(strValeur) = True Then
erreurSi = True
Else
MsgBox "désolé, la valeur entrée n'est pas conforme", , "erreurSi"
erreurSi = False
End If
End Function

Sub Macro2()
Dim strNombreEnregistrements As String 'nombre de produits à rentrer
dans le tableau
Dim intCompteur As Integer 'variable utilisée lors de la
boucle permettant d'écrire la formule
Dim strQuantite As String 'quantité du produit enregistré
Dim strPrix As String 'prix du produit enregistré
Dim strFormule As String 'formule contenant le calcul à
poser dans la tableau excel
Dim intNombreerreurSi As Integer 'contient le nombre d'erreurSis

'déclaration et initialisation de la variable contenant l'emplacement de
la cellule active
Dim Ac As Range
Set Ac = ActiveCell

Do 'boucle tant que la valeur entrée n'est pas un nombre
strNombreEnregistrements = InputBox("veuillez entrer le nombre
d'enregistrements à effectuer", "enregistrements")
Loop Until erreurSi(strNombreEnregistrements) = True
Ac = "Nom du produit"
Ac.Offset(0, 1) = "quantité"
Ac.Offset(0, 2) = "prix à l'unité"

Set Ac = Ac.Offset(1)

'boucle permettant d'entrer toutes les données du tableau
For intCompteur = 1 To strNombreEnregistrements

'----------nom du produit--------------------
Ac.Select
Ac = InputBox("nom du produit n° " & intCompteur, "enregistrement n°
" & intCompteur)

'------------quantité------------------------
Ac.Offset(, 1).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strQuantite = InputBox("quantité du produit n° " & intCompteur,
"enregistrement n° " & intCompteur)
Loop Until erreurSi(strQuantite) = True

Ac.Offset(, 1) = strQuantite

'----------prix unitaire---------------------
Ac.Offset(, 2).Select

Do 'boucle tant que la valeur entrée n'est pas un nombre
strPrix = InputBox("prix à l'unité du produit n° " &
intCompteur, "enregistrement n° " & intCompteur)
Loop Until erreurSi(strPrix) = True

Ac.Offset(, 2) = strPrix
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de
la cellule du prix en monétaire

'sélection de la cellule d'en dessous
Set Ac = Ac.Offset(1)
Next

Set Ac = Ac.Offset(1)
Ac = "TOTAL"

ActiveCell.Offset(2).Range("A1").Select

'définition du texte initial pour la formule
strFormule = "=PRODUIT(" & Ac.Offset(-strNombreEnregistrements - 1,
1).Resize(1, 2).Address(0, 0) & ")"

'définiton de la suite du texte pour la formule
For intCompteur = -strNombreEnregistrements + 1 To -1
strFormule = strFormule & " + PRODUIT(" & Ac.Offset(intCompteur - 1,
1).Resize(1, 2).Address(0, 0) & ")"
Next

Ac.Offset(, 2).Formula = strFormule 'écriture de la formule
Ac.Offset(, 2).NumberFormat = "$ #,##0.00" 'définition du format de la
cellule du total en monétaire
Ac.Resize(, 3).EntireColumn.AutoFit 'redimentionnement automatique des
colonnes
End Sub



--
Céd / Lausanne


"MichDenis" a écrit :

> Essaie ceci : il y avait une légère erreur. Désolé.
>
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
>
> Dim Ac As Range
> Set Ac = ActiveCell
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> 'intNombreEnregistrements = InputBox("veuillez entrer le nombre
> 'd 'enregistrements à effectuer", "enregistrements")
> Ac = "Nom du produit"
> Ac.Offset(0, 1) = "quantité"
> Ac.Offset(0, 2) = "prix à l'unité"
>
> 'écriture des valeurs données par l'utilisateur
> 'directement dans les cellules sur X lignes
> intNombreEnregistrements = 5
> Set Ac = Ac.Offset(1)
> For intCompteur = 1 To intNombreEnregistrements
> 'nom du produit
> Ac.Select
> Ac = InputBox("nom du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'quantité
> Ac.Offset(, 1).Select
> Ac.Offset(, 1) = _
> InputBox("quantité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> 'prix unitaire
> Ac.Offset(, 2).Select
> Ac.Offset(, 2) = _
> InputBox("prix à l'unité du produit n° " & _
> intCompteur, "enregistrement n° " & intCompteur)
> Set Ac = Ac.Offset(1)
> Next
>
> 'retour à la ligne + écriture du total
> Ac = "TOTAL"
> Ac.Offset(, 1).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 1).Resize(intNombreEnregistrements, 1).Address(0, 0) & ")"
> Ac.Offset(, 2).Formula = _
> "=Sum(" & Ac.Offset(-intNombreEnregistrements, _
> 2).Resize(intNombreEnregistrements, 2).Address(0, 0) & ")"
> Ac.Resize(, 3).EntireColumn.AutoFit
> End Sub
>
>
>
>
>
> "Congelator" > discussion :
> J'ai réussi à un détail près : je dois presser "Enter" pour que la formule
> s'affiche au lieu de "##NOM?"... C'est déjà mieux. Est-ce que tu sais comment
> contourner ce problème ?
>
> Voici le code modifié.
> Sub Macro2()
> Dim intNombreEnregistrements As Integer
> Dim intCompteurVertical As Integer
> Dim intCompteurHorizontal As Integer
> Dim intCompteur As Integer
> Dim strFormule As String
> Dim Ac As Range
> Set Ac = ActiveCell
>
> 'enregistrement du nombre de lignes + écriture des titres des colonnes
> intNombreEnregistrements = InputBox("veuillez entrer le nombre
> d'enregistrements à effectuer", "enregistrements")
> Ac = "Nom du produit" 'cellule active
> Ac.Offset(0, 1) = "quantité" 'cellule active + 1 colonne à droite
> Ac.Offset(0, 2) = "prix à l'unité" 'cellule active + 2 colonnes à droite
>
> 'écriture des valeurs données par l'utilisateur
> 'directement dans les cellules sur X lignes
>
> Set Ac = Ac.Offset(1) ' cellule active + 1 ligne en dessous
> For intCompteur = 1 To intNombreEnregistrements 'début de la boucle
> 'nom du produit
> Ac.Select
> Ac = InputBox("nom du produit n° " & intCompteur,
> "enregistrement n° " & intCompteur)
> 'quantité
> Ac.Offset(, 1).Select 'cellule active + 1 colonne à droite
> Ac.Offset(, 1) = InputBox("quantité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur)
> 'prix unitaire
> Ac.Offset(, 2).Select 'cellule active + 2 colonnes à droite
> Ac.Offset(, 2) = InputBox("prix à l'unité du produit n° " &
> intCompteur, "enregistrement n° " & intCompteur)
> Set Ac = Ac.Offset(1) 'cellule active + 1 ligne en dessous
> Next 'fin de la boucle
>
> 'retour à la ligne + écriture du total


Publicité
Poster une réponse
Anonyme