Autofill par VBA

Bonjour au forum,

Je tente d'incrémenter des formules situées dans chaque cellule de 2 plages différentes par macro au fur et à mesure que l'utilisateur remplisse une autre cellule.

Par exemple, lorsque l'utilisateur rempli la cellule B2, il faudrait que les formules en H1, I1, K1 et L1 soient incrémentées en H2, I2, K2 et L2.

Je bloque toujours malgré plusieurs essais...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False
Dim ws As Worksheet
Dim dl As Long
Dim c As Range

Set ws = Sheets("Codage")                                 
    dl = ws.Range("B" & Rows.Count).End(xlUp).Row         

With ws
    For Each c In Range("B3:B" & dl + 100)
        If c.Value <> "" And c.Value <> 0 Then
            '.Range("H" & dl & ":I" & dl).AutoFill Destination:=Range("H" & dl + 1 & ":I" & dl + 1), Type:=xlFillDefault
            .Range("B" & dl & ":M" & dl).Borders.Value = 1
            .Range("B" & dl & ":M" & dl).Borders(xlEdgeLeft).Weight = xlThick
            .Range("B" & dl & ":M" & dl).Borders(xlEdgeRight).Weight = xlThick
            .Range("B" & dl & ":M" & dl).Borders(xlEdgeTop).Weight = xlThin
            .Range("B" & dl & ":M" & dl).Borders(xlEdgeBottom).Weight = xlThick
            .Range("B" & dl & ":M" & dl).HorizontalAlignment = xlHAlignCenter
            .Range("B" & dl & ":M" & dl).VerticalAlignment = xlHAlignCenter
            .Range("B" & dl & ":M" & dl).Locked = True
        Else
            .Range("B" & dl + 1 & ":M" & dl + 100).ClearContents
            .Range("B" & dl + 1 & ":M" & dl + 100).Borders.LineStyle = xlLineStyleNone
        End If
    Next c
End With
Application.ScreenUpdating = True
End Sub

Pour ce test, c'est la ligne en commentaire qui me génère une erreur.

Quelqu'un aurait une idée ?

Bonjour

Cordialement

Oups désolé

6fof.xlsm (19.13 Ko)

Re,

Il y a plus simple et sans macro. Faites comme ceci

- Mettez votre formule à jour en K4
- Sélectionnez B2 à M4
- Dans le menu Accueil, cliquez sur l'icone "Mettre sous forme tableau"
- Choisissez un modèle puis OK

Dès que vous ajouterez une ligne, les formules seront incrémentées automatiquement

Cordialement

edit : Double post

Re,

Merci pour votre réponse Dan.

J'ai malheureusement besoin de faire ceci via une macro, uniquement.

Re

Ok. 3 petites questions

- Pourquoi vous exécutez le code du le changement de sélection
- Pourquoi vous bouclez jusque 100 alors qu'il n'y a pas de données au delà de la ligne DL
- Pourquoi vous rebouclez sur toutes les données et pas agir uniquement sur la ligne où vous ajoutez une donnée

Edit : Remplacez votre code complet par celui-ci puis faites quelques test d'ajout, modification et suppression.

Option Explicit
Dim stopevt As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim dl As Long

Application.ScreenUpdating = False

If stopevt = True Or Target.Count > 1 Then Exit Sub

dl = Target.Row 'définition la ligne

If Target.Value <> "" And Target.Value <> 0 Then
    stopevt = True

    'Complete les cellules des formules
    Range("H" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("I" & dl) = Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl) & Range("G" & dl)
    Range("K" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("L" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("B" & dl & ":M" & dl).Locked = True

    'Mise en forme
    With Range("B" & dl & ":M" & dl)
        .HorizontalAlignment = xlHAlignCenter
        .VerticalAlignment = xlHAlignCenter
        .BorderAround xlContinuous, xlThin
    End With
    With Range("B2:M" & dl)
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
        .BorderAround xlContinuous, xlThick
    End With
End If

Application.ScreenUpdating = True
stopevt = False
End Sub

Cordialement

Bonjour à tous,

en retard, mais comme c'est fait je poste.

Je ne m'occupe que des formules, à toi d'adapter si tu veux copier aussi tout ou partie des formats :

Private Sub Worksheet_Change(ByVal Target As Range)
    Static b_noEvent As Boolean
    Dim c As Range, pl As Range
    If Not b_noEvent Then
        b_noEvent = True
        Set pl = Intersect(Target, Columns(2))
        If Not pl Is Nothing Then
            For Each c In pl
                If Target.Row > 3 And Target <> "" Then
                    [H3:I3].Copy: Target.Offset(, 6).Resize(, 2).PasteSpecial xlPasteFormulas
                    [K3:L3].Copy: Target.Offset(, 9).Resize(, 2).PasteSpecial xlPasteFormulas
                End If
            Next c
            Target.Offset(, 1).Select
        End If
        b_noEvent = False
    End If
End Sub

S'il s'agit d'un collé de plusieurs lignes elles seront toutes traitées.
eric

Edit : Dan, j'ai dans l'idée que ses formules étaient bidons. Alors les mettre en dur.. ;-)

Re,

Je m'excuse pour le temps de réponse, je n'étais pas disponible pour reprendre ce travail.

@Dan : Merci beaucoup pour votre réponse

- Pourquoi vous exécutez le code du le changement de sélection

Car j'aimerais que l'incrémentation des formules ne se fassent que lorsque la cellule de la même ligne en colonne B soit renseignée.

- Pourquoi vous bouclez jusque 100 alors qu'il n'y a pas de données au delà de la ligne DL

C'est probablement très maladroit, mais c'est uniquement pour supprimer le contenu de toutes les cellules de C à M, y compris la mise en forme (bordures), dans le cas où l'utilisateur supprime le contenu de la cellule B.

- Pourquoi vous rebouclez sur toutes les données et pas agir uniquement sur la ligne où vous ajoutez une donnée

Tout simplement car je ne sais pas faire autrement...

Edit : Remplacez votre code complet par celui-ci puis faites quelques test d'ajout, modification et suppression.

Merci beaucoup, je vais tester cela dans la soirée et/ou demain soir

@Eriiic :

Merci beaucoup pour ta réponse également

Je ne m'occupe que des formules, à toi d'adapter si tu veux copier aussi tout ou partie des formats :

Merci également, comme pour la proposition de Dan, je vais tester cela dans les prochaines soirées

Edit : Dan, j'ai dans l'idée que ses formules étaient bidons. Alors les mettre en dur.. ;-)

C'est tout à fait vrai, en réalité, les formules à incrémenter me servent à générer un QR code selon les informations renseignées dans les cellules de B à G.

En H, une formule concatène ces données puis les "chiffrent" selon une fonction.

En I, une formule génère un QR code à partir de la valeur de H qui s'affichera en J (donc chiffré)

En K, une formule déchiffre les données en H selon une autre fonction (uniquement informatif pour moi).

En L, une formule génère un QR code à partir de la valeur de K qui s'affichera en M (donc non chiffré).

Bonjour,

peut-être seras-tu intéressé par ce fil : https://forum.excel-pratique.com/excel/qr-factures-pour-la-suisse-105696
eric

Bonjour

Eriic : Edit : Dan, j'ai dans l'idée que ses formules étaient bidons. Alors les mettre en dur.. ;-)

Nrev : C'est tout à fait vrai, en réalité, les formules à incrémenter me servent à générer un QR code selon les informations renseignées dans les cellules de B à G.

Alors dans mon code proposé vous pouvez remplacer :

    Range("H" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("I" & dl) = Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl) & Range("G" & dl)
    Range("K" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("L" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)

par la partie du code proposée par Eriic (on aurait peut aussi faire un autofill, mais plus simple comme il propose) :

    Range("H3:I3").Copy: Target.Offset(, 6).Resize(, 2).PasteSpecial xlPasteFormulas
    Range("K3:L3").Copy: Target.Offset(, 6).Resize(, 2).PasteSpecial xlPasteFormulas

Je vous avais mis en dur, car cela évitait la formule et cela donnait la même chose au final. Cette deuxième solution vous impose d'avoir une formule en ligne 3 pour que cela fonctionne.

Bonjour,

peut-être seras-tu intéressé par ce fil : https://forum.excel-pratique.com/excel/qr-factures-pour-la-suisse-105696
eric

Re,

Merci pour ce fil, très intéressant effectivement ! +++

Bonjour

Eriic : Edit : Dan, j'ai dans l'idée que ses formules étaient bidons. Alors les mettre en dur.. ;-)

Nrev : C'est tout à fait vrai, en réalité, les formules à incrémenter me servent à générer un QR code selon les informations renseignées dans les cellules de B à G.

Alors dans mon code proposé vous pouvez remplacer :

    Range("H" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("I" & dl) = Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl) & Range("G" & dl)
    Range("K" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)
    Range("L" & dl) = Range("B" & dl) & Range("C" & dl) & Range("D" & dl) & Range("E" & dl) & Range("F" & dl)

par la partie du code proposée par Eriic (on aurait peut aussi faire un autofill, mais plus simple comme il propose) :

    Range("H3:I3").Copy: Target.Offset(, 6).Resize(, 2).PasteSpecial xlPasteFormulas
    Range("K3:L3").Copy: Target.Offset(, 6).Resize(, 2).PasteSpecial xlPasteFormulas

Je vous avais mis en dur, car cela évitait la formule et cela donnait la même chose au final. Cette deuxième solution vous impose d'avoir une formule en ligne 3 pour que cela fonctionne.

Merci pour cette proposition, qui fonctionne très bien.

J'ai cependant un problème : serait-il possible que l'incrémentation des formules ne se fasse QUE lorsque toutes les cellules de la ligne sont renseignées (donc les cellules de B à G) ? Car pour le moment, à chaque fois qu'une de ces cellules est renseignée, un code barre se génère avec les informations incomplètes.

Second point, dans le cas où une de ces cellules (B à G) est supprimée, est-il possible d'effacer TOUT le contenu (idéalement avec le QR code généré) des cellules de H à M, y compris les bordures ?

Sinon MERCI à vous deux pour votre aide, vous êtes au top dans ce forum

Bonjour

Ok pour la question 1. Il vous suffit de changer ces lignes dans le code

If Target.Row > 3 And WorksheetFunction.CountA(Range("B" & dl & ":G" & dl)) = 6 Then

    stopevt = True

    'Complete les cellules des formules
    Range("H3:I3").Copy: Range("H" & dl).Resize(, 2).PasteSpecial xlPasteFormulas
    Range("K3:L3").Copy: Range("K" & dl).Resize(, 2).PasteSpecial xlPasteFormulas

Question 2

Second point, dans le cas où une de ces cellules (B à G) est supprimée, est-il possible d'effacer TOUT le contenu (idéalement avec le QR code généré) des cellules de H à M, y compris les bordures ?

Avant de vous poster le code, la suppression des bordures n'a de sens que si vous supprimez la dernière ligne et toutes les données entre B & G. Donc si une des cellules entre B&G est supprimée dans le tableau, le code ne supprimera que les données de H & M et pas les bordures. Par contre si vous supprimez toutes les données entre B&G c'est la ligne entière qui est à supprimer.

Je pense qu'il serait plus simple de ne supprimer les données de H à M que si les données ne sont pas complètes entre B&G et de laisser les bordures en place.

Crdlt

Re,

Ok pour la question 1. Il vous suffit de changer ces lignes dans le code

If Target.Row > 3 And WorksheetFunction.CountA(Range("B" & dl & ":G" & dl)) = 6 Then

stopevt = True

'Complete les cellules des formules

Range("H3:I3").Copy: Range("H" & dl).Resize(, 2).PasteSpecial xlPasteFormulas

Range("K3:L3").Copy: Range("K" & dl).Resize(, 2).PasteSpecial xlPasteFormulas

C'est parfait merci beaucoup

Avant de vous poster le code, la suppression des bordures n'a de sens que si vous supprimez la dernière ligne et toutes les données entre B & G. Donc si une des cellules entre B&G est supprimée dans le tableau, le code ne supprimera que les données de H & M et pas les bordures. Par contre si vous supprimez toutes les données entre B&G c'est la ligne entière qui est à supprimer.

Je pense qu'il serait plus simple de ne supprimer les données de H à M que si les données ne sont pas complètes entre B&G et de laisser les bordures en place.

Parfaitement judicieux comme remarque, vous avez entièrement raison ! J'imagine que la difficulté sera de supprimé uniquement les QR codes de la ligne lors du changement d'une des cellules de B à G...

Bonjour

J'imagine que la difficulté sera de supprimé uniquement les QR codes de la ligne lors du changement d'une des cellules de B à G...

Non du tout.

C'est plus facile que je vous replace le code entier. Merci de tester.
Si vous supprimez une donnée entre B et G, cela supprimera les données en H et M. Comme suggéré, les bordures restent en place.

Seule amélioration que je verrais éventuellement c'est que si vous supprimez toutes les données entre B&G à l'intérieur du tableau, le code supprime la ligne, mais est-ce vraiment nécessaire sachant que vous pourrez compléter cette ligne avec de nouvelles données. A voir donc..

Option Explicit
Dim stopevt As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim dl As Long

Application.ScreenUpdating = False

If stopevt = True Or Target.Count > 1 Then Exit Sub

dl = Target.Row 'définition la ligne
If Target.Row > 3 And WorksheetFunction.CountA(Range("B" & dl & ":G" & dl)) = 6 Then

    stopevt = True

    'Complete les cellules des formules

    Range("H3:I3").Copy: Range("H" & dl).Resize(, 2).PasteSpecial xlPasteFormulas
    Range("K3:L3").Copy: Range("K" & dl).Resize(, 2).PasteSpecial xlPasteFormulas

    'Mise en forme

    With Range("B" & dl & ":M" & dl)
        .HorizontalAlignment = xlHAlignCenter
        .VerticalAlignment = xlHAlignCenter
        .BorderAround xlContinuous, xlThin
    End With
    With Range("B2:M" & dl)
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
        .BorderAround xlContinuous, xlThick
    End With

ElseIf Target.Row > 3 And WorksheetFunction.CountA(Range("B" & dl & ":G" & dl)) < 6 Then
    Union(Range("H" & dl & ":I" & dl), Range("K" & dl & ":L" & dl)).ClearContents

End If

Application.ScreenUpdating = True
stopevt = False
End Sub

Bonjour Dan,

Merci pour votre réponse.

Votre code fonctionne parfaitement, merci.

Cependant, lors de la suppression d'une des valeurs de B à G, les deux QR code générés précédemment en cellule J et M ne se suppriment pas (ce sont des shapes).

Second point, concernant les bordures, lors de la suppression de toutes les données de B à G, le contenu des cellules de H à M se suppriment bien (hormis les 2 shapes en J et M comme expliqué précédemment), mais j'aimerais que les bordures se suppriment également, car toutes les cellules de la ligne seraient vides.

Merci pour votre patience

Bonsoir

Cependant, lors de la suppression d'une des valeurs de B à G, les deux QR code générés précédemment en cellule J et M ne se suppriment pas (ce sont des shapes).

??? vous n'aviez pas dit qu'il y avait des Shapes mais les valeurs dans les cellules J et M sont supprimées. Dans votre fichier on ne voit pas de Shape... il y a un shape par ligne ?

Pour les bordures, dans votre fichier mettons que vous avez trois lignes (4 lignes avec les titres) et que vous supprimez les valeurs entre B&G de la ligne 2, vous voulez supprimez quoi comme bordures ?

??? vous n'aviez pas dit qu'il y avait des Shapes mais les valeurs dans les cellules J et M sont supprimées. Dans votre fichier on ne voit pas de Shape... il y a un shape par ligne ?

Effectivement, et je m'en excuse. Comme votre aide a dépassé ma question initiale, je n'ai pas pensé à vous donner plus d'éléments...

Je vous joins un fichier anonymisé réel pour plus de facilité.

Pour les bordures, dans votre fichier mettons que vous avez trois lignes (4 lignes avec les titres) et que vous supprimez les valeurs entre B&G de la ligne 2, vous voulez supprimez quoi comme bordures ?

Encore une hypothèse à laquelle je n'avais pas pensé

Probablement qu'une suppression complète de la ligne serait plus judicieuse dans ce cas... ?

4fof.xlsm (45.08 Ko)

Bonjour

Votre fichier en retour à tester

Cordialement

5fof-2.xlsm (46.10 Ko)
Rechercher des sujets similaires à "autofill vba"