Macro incrémentation

kabeha

Membre expert
Club iGen
13 Mai 2002
1 323
54
62
Bourg en Bresse
Bonjour,

J'ai une macro qui ajoute une ligne à la fin d'un tableau, avec une cellule que je voudrais incrémenter de 1 à chaque fois.

J'ai la macro pour la ligne mais je ne sais pas comment ajouter l'incrémentation. Est-ce possible directement dans ma macro ?
 
Qu'elle est l'application concernée ? À priori, il ne doit pas être bien compliqué de rajouter dans ta macro une instruction pour que la valeur contenue dans la cellule soit égale à la valeur de celle du dessus plus un.
 
Dans Excel, le mieux, j'imagine, serait d'insérer une ligne de type :

Worksheets("Feuil1").Range("A" & n).Value = Worksheets("Feuil1").Range("A" & n - 1).Value + 1
 
Merci, ça ne marche pas, ça me renvoie une erreur et j'ai toujours 1 dans la cellule.
Voici la macro qui me sert à ajouter une ligne :

Sheets("feuille1").Range("A65536").End(xlUp).EntireRow.Copy Sheets("feuille1").Range("A65536").End(xlUp).Offset(1, 0)
Sheets("feuille1").Range("A65536").End(xlUp).EntireRow.SpecialCells(xlConstants).ClearContents
 
Oui, ben évidemment, vu comme ça, il te faudrait plutôt remplacer ça par ceci, par exemple :

Bloc de code:
With Sheets("Feuil1")
    n = .Range("A65536").End(xlUp).Row
    .Range(n & ":" & n).Copy .Range(n + 1 & ":" & n + 1)
    .Range(n + 1 & ":" & n + 1).SpecialCells(xlConstants).ClearContents
    .Range("A" & n + 1).Value = .Range("A" & n).Value + 1
End With
 
Je voudrais ajouter à mon classeur une boite de dialogue qui s'ouvre à l'ouverture du fichier pour demander à l'utilisateur de renseigner plusieurs valeurs qui rempliraient des cellules sous forme de formulaire :

Titre : Entrer les noms
Nom 1 = texte 1 (>A1)
Nom 2 = texte 2 (>A2)
Bouton OK pour valider et fermer la boîte

J'ai lu plusieurs sujets, mais je ne vois pas trop comment faire ouvrir la boite et afficher les champs

Est-ce trop demander ? :rose:
 
Il y a plusieurs façons de procéder. La plus "simple" me semble-t-il serait de passer par une boucle de ce type :
Bloc de code:
Texte1 = Application.InputBox(Prompt:="Quel est le nom 1 ?", Title:="Paramétrage", Type:=2)
If Texte1 = False Then Exit Sub ' pas de réponse, on sort (mais on pourrait faire autre chose)
Texte2 = Application.InputBox(Prompt:="Quel est le nom 2 ?", Title:="Paramétrage", Type:=2)
If Texte2 = False Then Exit Sub ' pas de réponse, on sort

With Worksheets("Feuil1")
   .Range("A1").Value = Texte1
   .Range("A2").Value = Texte2
End With

Pour lancer une macro automatiquement à l'ouverture d'un classeur, il faut créer dans la feuille de code "ThisWorkbook" une procédure nommée "Workbook_Open" :
Bloc de code:
Private Sub Workbook_Open()
    '--- ton code ici ---
End Sub
 
  • J’aime
Réactions: kabeha
Bonjour,
J'ose encore une autre question. J'essaie de donner une position à l'inputbox de la façon suivante dans le code que tu m'as donné, mais j'ai 'erreur de compilation'
Bloc de code:
Texte1 = Application.InputBox(Prompt:="Quel est le nom 1 ?", Title:="Paramétrage", , 5000, 5000, Type:=2)
De même, pour positionner une msgbox, on ne peut pas donner de valeur x, y apparemment
 
J'essaie de donner une position à l'inputbox de la façon suivante dans le code que tu m'as donné, mais j'ai 'erreur de compilation'
Je ne suis pas en mesure de contrôler pour le moment mais dans ton exemple, il y a un mélange de syntaxe qui ne peut pas fonctionner. Si tu précise certains arguments nommés, alors il faut indiquer précisément le nom de chacun des argument (et peu importe l'ordre). Sinon, tu mets uniquement les valeurs des arguments, mais alors il faut les mettre tous, dans l'ordre, séparés par des virgules. Tu ne peux pas panacher les deux syntaxes (enfin, si, on peut mais pas n'importe comment vaut mieux faire l'un ou l'autre).

Par ailleurs, dans ton exemple tu mets des valeurs qui me semblent trop élevées (à moins d'avoir un très, très, très grand écran) : ta boîte risque d'être en dehors de l'écran donc invisible (et difficile à renseigner).

Pour ma part, sous réserve de vérification, je mettrais plutôt quelque chose comme ça :
Bloc de code:
Texte1 = Application.InputBox("Quel est le nom 1 ?", "Paramétrage", "Mon Classeur 1", 500, 200, , , 2)

Ou comme ça :
Bloc de code:
Texte2 = Application.InputBox(Prompt:="Quel est le nom 2 ?", Type:=2, _
    Left:=500, Title:="Paramétrage", Top:=200, Default:="Mon Classeur 2")



pour positionner une msgbox, on ne peut pas donner de valeur x, y apparemment
En effet, MsgBox n'admet pas d'arguments nommés pour ça...
 
Dernière édition:
D'accord, je comprends mon erreur :rose::siffle::rateau:
Pour positionner une msgbox, j'ai vu des solutions sur des forums, mais apparemment, super compliquées.
En tout cas, aucune aussi claire et pédogo que les tiennes :up::zen::up:
Par ailleurs, la macro dont je me sers dans ce cas, me permet d'entrer une valeur dans une cellule quand on sélectionne cette cellule, soit I6.
Comment faire pour que quand j'ajoute une nouvelle ligne, la macro se duplique pour I7, et ainsi de suite.
Bloc de code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Address(0, 0) = "I6" Then

Texte1 = Application.InputBox(Prompt:="Entrer une valeur", Title:="Valeurs", Left:=700, Top:=400, Type:=2)
If Texte1 = False Then Exit Sub ' pas de réponse, on sort (mais on pourrait faire autre chose)

With Worksheets("feuille1")
   .Range("I6").Value = Texte1
   
End With

End If

End Sub
 
Je ne suis pas sûr que tu choisisses l'outil le mieux adapté mais, comme je ne sais pas trop ce que tu cherches à faire, ce n'est pas évident.

Est-ce que tu n'aurais pas intérêt à rajouter plutôt ta commande à la fin de la boucle qui insère une ligne, en positionnant directement le curseur sur la cellule voulue, forçant ainsi la saisie du texte dès l'insertion de la ligne supplémentaire ?

Est-ce que tu ne pourrais pas te "contenter" d'utiliser une "validation" (menu "Données" > "Validation…" et mettre dans les paramètres ce qui te semble adapté, en particulier un "message de saisie") ?

Plutôt que de dupliquer les macros contextuelles, est-ce que tu ne pourrais pas (si l'appel à une macro contextuelle est nécessaire) simplement généraliser ta macro à toutes les cellules de la colonne "I" ou, au besoin, en restreignant ça à une plage particulière, comme par exemple ceci :

Bloc de code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Set MonInterserction = Application.Intersect(Target, Range("I2:I25"))
If MonInterserction Is Nothing Then
    Exit Sub
Else

MaLigne = Target.Row
MaColonne = Target.Column

If MaColonne = 9 Then
    Texte1 = Application.InputBox(Prompt:="Entrer une valeur", Title:="Valeurs", Left:=700, Top:=400, Type:=2)
    If Texte1 = False Then Exit Sub ' pas de réponse, on sort (mais on pourrait faire autre chose)
    With Worksheets("Feuil1")
        .Cells(MaLigne, MaColonne).Value = Texte1
    End With
End If
End If
End Sub

Bref, faut voir...
 
Ça marche comme ça.

J'ai ajouté 2 lignes à la première macro, et malgré que cela fonctionne, j'ai un message de bogue sur la deuxième ligne.

Bloc de code:
Sub NouvelleLigne()

' NouvelleDonne Macro
' Ajoute une ligne feuille 1

With Sheets("feuille1")
    n = .Range("A65536").End(xlUp).Row
    .Range(n & ":" & n).Copy .Range(n + 1 & ":" & n + 1)
    .Range(n + 1 & ":" & n + 1).SpecialCells(xlConstants).ClearContents
    .Range("A" & n + 1).Value = .Range("A" & n).Value + 1
End With

'Ajoute une ligne feuille 2
Sheets("feuille2").Range("A65536").End(xlUp).EntireRow.Copy Sheets("feuille2").Range("A65536").End(xlUp).Offset(1, 0)
'=>bogue' Sheets("feuille2").Range("A65536").End(xlUp).EntireRow.SpecialCells(xlConstants).ClearContents

End Sub