VBA - Programmer la composition d'une ligne

Résolu/Fermé
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 - 22 mars 2010 à 14:40
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 - 2 avril 2010 à 13:51
Bonjour,

Voila, j'ai sur VBA une macro (merci Polux31^^) qui sert, lorqu'on rentre une valeur dans une cellule, de créer en dessous le même nombre de lignes. Une boite de dialogue demande un nom pour chaque ligne, placé en tête de celui-ci.

J'aimerais améliorer encore cela. Est-il possible, dans cette macro, de définir la composition de ces lignes créées? Par exemple dire que la 2eme cellule de chaque ligne sera verte, que la 4eme contiendra telle formule, que la 5eme contiendra une liste déroulante etc...

J'ai fait plusieurs essais de modifications mais rien ne se passe d'interessant. Si quelqu'un a une idée, je suis preneur^^ (je pense de plus que la solution à ce problème peut en interesser plus d'un)

Voici la macro :

Sub Test()

Dim nbLig As Variant
Dim lig As Long
Dim i As Long
Dim rep As Variant

nbLig = ActiveCell.Value
ActiveCell.Font.Bold = True
If nbLig = Null Or Not IsNumeric(nbLig) Then Exit Sub

lig = ActiveCell.Row + 2

Rows(lig & ":" & lig + (CLng(nbLig) - 1)).Select
Selection.Insert Shift:=xlDown
Selection.Interior.ColorIndex = 27
Selection.Borders.ColorIndex = 25

For i = 1 To nbLig
rep = InputBox("Entrer le nom :", "Saisie")
Range("A" & lig).Value = rep
Range("A" & lig).Font.Italic = True
Range("A" & lig).Font.Bold = True
lig = lig + 1
Next

End Sub


Merci d'avance pour vos réponses et vos suggestions!
A voir également:

7 réponses

RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
22 mars 2010 à 15:03
J'ai déjà trouver comment définir des cellules de couleurs, il suffit de rajouter une ligne du type Range("C" & lig).Interior.ColorIndex = 24 dans la boucle.

Pour rajouter une formule par contre, quelques problèmes ; je rajoute une ligne type Range("D" & lig).FormulaR1C1 = dans la boucle, mais je n'arrive pas à trouver une syntaxe correcte pour une formule qui utiliserait des valeurs rentrées précedemment dans la ligne (exemple, pour chaque ligne, on rentre une valeur dans la 1ere cellule, une 2eme dans la 2eme cellule, et la 3eme cellule multiplie directement les 2 et affiche le résultat).

J'essaye aussi de rentrer une liste déroulante dans les lignes qui apparaissent, pour le moment sans succès.

Si vous avez quelques conseils n'hésitez surtout pas ;) !
0
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
22 mars 2010 à 15:51
Je rajoute encore un petit commentaire.
Pour multiplier les 2 premières cellules dans la 3eme, je tape :

multiplication = Cells(A, lig) * Cells(B, lig)
Range("C" & lig).Value = multiplication

Mais la syntaxe pour multiplier les cellules n'a pas l'air bonne... Quelqu'un sait comment multiplier deux cellules en VBA?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
22 mars 2010 à 17:22
Bonjour

Pour la multiplication:

Range("C" & lig)=cells(lig,1)*cells(lig,2)


cad
cells(n° ligne, n° colonne)
.value est la propriété par défaut de l'objet "cellule": dans ce cas, on peut se dispenser de marquer .value

Evite les select selection très lents

With Rows(lig & ":" & lig + (CLng(nbLig) - 1))
   .Insert Shift:=xlDown
   .Interior.ColorIndex = 27
  .Borders.ColorIndex = 25 
end with


pour éviter le scintillement de l'écran et gagner du temps d'exécution, on fige l'écran par

Application.screenupdating=false
suivi de:
With Rows(lig & ":" & lig + (CLng(....
0
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
1 avril 2010 à 17:12
Bonjour, merci pour cette réponse Michel

je me permet de reprendre le sujet pour une autre question, concernant la multiplication. Je met la formule
Range("C" & lig)=cells(lig,1)*cells(lig,2)
dans ma boucle For. Problème : une fois la boucle exécutée et les lignes créées, la cellule C ne se "souvient" plus de la formule, et j'ai beau rentrer des valeurs dans les 1eres et 2emes cellules, rien ne se passe.
J'ai essayé de mettre la formule de multiplication juste apres la boucle, rien ne se passe...
Quelqu'un aurait-il une idée?

Je comptais faire un bout de code comme cela
If Not Cells(lig, 1) And Cells(lig, 2) Is Nothing Then
    Range("C" & lig).Value = Cells(lig, 1) * Cells(lig, 2)
    End If

qui, lorsque les cases 1 et 2 sont remplies (ne sont plus vides), exécute la multiplication, mais cela ne marche pas...

Merci par avance pour vos réponses !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
1 avril 2010 à 18:08
BOnjour,

cells(lig,1)*cells(lig,2) est effectuée lorsque tu exécutes la macro: VBA renvoie la valeur de la multiplication et non la formule
ainsi, si tu changes les valeurs le if n'est pas vérifié te range("C" & lig) ne bouge pas: il faut que tu relances la macro...
Elle peut être déclenchée automatiquement lors d'un changement de valeur dans activecell mais je me pose des questions sur l'emplacement dans la feuille de cette activecell: actuellement on peut déclencher la macro de n'importe où (attention si on déclenche activecell en colonne A ou B)
nota:Je ne connais pas ta demande de départ à laquelle t'a répondu Polux(bonjour)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
2 avril 2010 à 13:14
Bonjour,

la demande de départ, c'était une macro qui crée des lignes en fonction d'un nombre entré dans une cellule. Si on entre 3, 3 lignes sont créées, dans lesquels l'utilisateur entre ensuite des données. Mon but était que l'utilisateur entre une valeur dans la 1ere cellule, puis dans la 2eme, et qu'à ce moment le produit des deux se fasse et s'affiche dans la 3eme cellule. Et ce pour toutes les lignes créées.
Comme si on avait mis sous Excel dans la cellule C1 "=A1*B1"

Je vais essayer avec activcell comme tu me la suggéré, je te tiens au courant si j'arrive à un résultat satisfaisant.
0
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
2 avril 2010 à 13:42
J'ai une autre piste qui pourrait fonctionner, avec la formule :
Range("C" & lig).Formula = 

Je la mettrai dans ma boucle, comme ça pour chaque itération la formule est affectée à la 3eme cellule de la ligne.
Problème : il faudrait qqch comme Range("C" & lig).Formula = "=Alig*Blig"
A et B sont toujours les mêmes, mais la ligne (définie par lig) est incrémentée de 1 à chaque boucle...
Comment définir ces deux cellules proprement en prenant compte de cette incrémentation?

J'ai essayé Range("C" & lig).Formula = "=Range("A" & lig) * Range("B" & lig)" mais ca ne marche pas, il me surligne le A en disant "attendu : fin d'instruction"...

J'espère avoir été clair... et que quelqu'un pourra me venir en aide ;-)
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
2 avril 2010 à 13:44
Ok,je comprend mieux

remplace
Range("C" & lig).Value = Cells(lig, 1) * Cells(lig, 2)


par ce que tu cherchais à faire au départ
Range("C" & lig).FormulaR1C1 = "=RC[-2]*RC[-1]"


a
0
RussellD Messages postés 57 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 septembre 2010 7
2 avril 2010 à 13:51
Génial !
Merci beaucoup pour cette réponse rapide et juste, c'est totalement ce que je cherchais. Il fallait donc passer par la formulation R1C1.

Merci encore du joli coup de main, à bientot !
0