Incrémenter jusqu'à une cellule adjacente vide - Résolu!

Aishina

XLDnaute Nouveau
Bonjour!

Je débute en vba, mais j'ai découvert que c'est un outil bien utile (voire parfois presque magique) pour qui sait le manier. Je me suis donc lancée dans un petit bout de code dont le but est simple : insérer une colonne nommée "seconde" (à gauche d'une colonne sélectionnée) dans laquelle j'incrémente une série de chiffres à partir de zéro. Jusque là tout va bien, et même un peu trop bien, car quand je lance ma macro excel entreprend de numéroter absolument TOUTES les lignes de ma feuille.
Autant dire que c'est long, et pas spécialement utile ;)
Je cherche donc à préciser au programme qu'il ne doit incrémenter que tant que la cellule adjacente n'est pas vide, seulement je ne sais pas comment faire ça de façon à ce qu'il comprenne, et il continue à remplir ma feuille.
Voici le code que j'ai actuellement :

Code:
Sub Insertion()
'
' Insert une colonne seconde
'

Dim Lg&, cL%, i&
cL = ActiveCell.Column
 
  Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  Selection.NumberFormat = "0"
  ActiveCell.Offset(0, 0).FormulaR1C1 = "Seconde"
  ActiveCell.Offset(1, 0).Select
  ActiveCell.FormulaR1C1 = "0"
  Do Until ActiveCell(0, 1) = ""
  ActiveCell.Offset(1, 0).Select
  ActiveCell.Value = ActiveCell.Offset(-1, 0) + 1
  Loop
 
End Sub

J'ai conscience qu'il n'est probablement pas optimisé et que ce n'est peut-être pas très beau, mais je souhaiterais le garder tel quel autant que possible (pour les parties qui marchent), afin de pouvoir le modifier par moi-même si besoin.
Je suppose que le soucis vient de la condition posée après "Do until" que ma macro ne doit pas comprendre. Je voudrais qu'avant de faire "case précédente +1" elle vérifie que la case à gauche de celle à remplir ne soit pas vide (dans le tableau final elle contient une heure type "09:33:52").

En bonus j'aimerais aussi assigner cette macro à une touche (F2 par exemple), mais c'est secondaire ^^

Si quelqu'un a une idée?
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Aishina, bonjour le forum,

Peut-être comme ça :

VB:
Sub Insertion()
'
' Insert une colonne seconde
'
Dim cL As Integer
Dim DL As Long
Dim x As Long

cL = ActiveCell.Column
DL = Cells(Application.Rows.Count, cL).End(xlUp).Row
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.NumberFormat = "0"
ActiveCell.FormulaR1C1 = "Seconde"
For i = 2 To DL
    Cells(i, cL).Value = x
    x = x + 1
Next i
End Sub
 

Yurperqod

XLDnaute Occasionnel
Bonjour le forum

Avec ce que j'ai compris, ma proposition
VB:
Sub Insertion()
' Insert une colonne seconde
Dim Lg&, cL&, i&
Lg = ActiveSheet.UsedRange.Rows.Count
cL = ActiveCell.Column
Columns(cL).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(1, cL) = "Seconde"
Cells(2, cL) = 1
Cells(3, cL) = 2
Range(Cells(2, cL), Cells(Lg, cL)).DataSeries Rowcol:=xlColumns, Type:=xlAutoFill, Date:=xlDay
End Sub
 

Modeste

XLDnaute Barbatruc
Bonjour Aishina,

Je comprends bien que la proposition qui suit puisse être un peu frustrante, mais en même temps, si tu lances ta macro sans que la plage soit sélectionnée, ça te prendra plus de temps encore de corriger ensuite ... Pourquoi ne pas simplement indiquer 0 dans la première cellule concernée et tirer vers le bas avec la poignée de recopie en maintenant la touche Ctrl enfoncée :)

Salut Robert :)
Bonjour Yurperqod
 

Aishina

XLDnaute Nouveau
Merci beaucoup pour vos réponses rapides! J'ai essayé avec le code proposé par Robert qui fonctionne parfaitement, ça me déprime d'y avoir passé autant de temps pour un code "pas si compliqué" finalement (je dis ça mais je n'y aurais jamais pensé toute seule, j'étais persuadée qu'il me faudrait une boucle!)

Et Modeste, je peux effectivement simplement remplir et glisser, c'est ce que je faisais à la base, seulement j'ai des feuilles comprenant d'une dizaine à une trentaine de tableaux dans lesquels je dois ajouter cette fameuse colonne et pas tous de la même longueur (parfois 50 lignes, parfois 200...). Donc si je peux simplement sélectionner la colonne à déplacer et remplir automatiquement à la bonne taille d'un simple clic, ça me facilite grandement la vie :)
(J'avoue c'est pure feignantise, mais avec autant de données, tout ce qui accélère le traitement est bon à prendre!)
 

Yurperqod

XLDnaute Occasionnel
Aishina
La macro du message N°3 fonctionne sur mon ordinateur.
Et sur le tien, non ?
finalement (je dis ça mais je n'y aurais jamais pensé toute seule, j'étais persuadée qu'il me faudrait une boucle!)

Les macros du message 1 et message 2 utilisent une boucle

La macro que j'ai postée ne boucle pas.

Elle utilise la fonction Remplissage d'Excel.

Je mets une version modifiée de ma première macro (toujours avec Remplissage)
VB:
Sub Insertion()
' Insert une colonne seconde
Dim Lg&, cL&, i&
cL = ActiveCell.Column
Lg = Cells(ActiveCell.Row, cL).End(xlDown).Row
Columns(cL).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(1, cL) = "Seconde"
Cells(2, cL) = 1
Cells(3, cL) = 2
Range(Cells(2, cL), Cells(Lg, cL)).DataSeries Rowcol:=xlColumns, Type:=xlAutoFill, Date:=xlDay
End Sub
 
Dernière édition:

Aishina

XLDnaute Nouveau
Ah oui, je pensais à une boucle "while" pardon, j'ai pas pensé qu'un "for" en étant une aussi ^^"
Elle fonctionne également mais elle numérote les lignes jusqu'à la dernière lignes non vide de ma feuille, et comme j'aligne plusieurs "tableaux" sur une seule feuille (je trouve ça plus pratique que d'avoir autant de feuilles que de tableaux) j'ai parfois trop de lignes numérotées. Ce n'est pas très grave, mais c'est un peu moins propre simplement.
Je joins un exemple :
 

Pièces jointes

  • Exemple.xlsm
    29 KB · Affichages: 32

Yurperqod

XLDnaute Occasionnel
Je remets une dernière version modifiée
Est-ce que le résultat est correct cette fois?
J'ai aussi ajouté des commentaires pour une meilleure compréhension.
VB:
Sub Insertion()
' Insert une colonne seconde
Dim Lg As Long, cL As Long
'numéro de la colonne active
cL = ActiveCell.Column
' numéro de la dernière ligne non vide de la colonne cL
Lg = Cells(Rows.Count, cL).End(xlUp).Row
Columns(cL).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'remplit les cellules 1, 2 et 3 de la nouvelle colonne
'avec les valeurs Seconde, 1 et 2 pour permettre l'utilisation de Remplissage
Range(Cells(1, cL), Cells(3, cL)) = Application.Transpose(Split("Seconde 1 2"))
'Mise en oeuvre de la fonction Remplissage du menu Acceuil/Remplissage
Range(Cells(2, cL), Cells(Lg, cL)).DataSeries Rowcol:=xlColumns, Type:=xlAutoFill, Date:=xlDay
End Sub
 

Yurperqod

XLDnaute Occasionnel
Je n'ai pas réussi à avoir le même phénomène que toi mais j'ai testé une autre macro
Est-ce que cette version fonctionne bien sur ton ordinateur ?
VB:
Sub Insertion_AutreVersion()
Dim Lg As Long, cL As Long
cL = ActiveCell.Column
Lg = Cells(Rows.Count, cL).End(xlUp).Row
ActiveCell.EntireColumn.Insert
Cells(1, cL) = "Seconde"
With Range(Cells(2, cL), Cells(Lg, cL))
    .Formula = "=ROW()-1"
    .Value = .Value
End With
End Sub
 

Yurperqod

XLDnaute Occasionnel
Avec l'ajout de NumberFormat alors
VB:
Sub Insertion_AutreVersion()
Dim Lg As Long, cL As Long
cL = ActiveCell.Column
Lg = Cells(Rows.Count, cL).End(xlUp).Row
ActiveCell.EntireColumn.Insert
Cells(1, cL) = "Seconde"
With Range(Cells(2, cL), Cells(Lg, cL))
    .Formula = "=ROW()-1"
    .Value = .Value
    .NumberFormat = "0"
End With
End Sub
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa