Difficulté pour insérer nouvelle ligne en VBA

Bonjour à tous,

Je suis en train de bosser sur une macro qui ajoute une nouvelle ligne SOUS la précédente dans un plage définie...

La macro fonctionne très bien, seulement la ligne ajoutée n'est pas là ou elle devrait être...

Si quelqu'un pouvez m'aider slvp...

Le fichier pour tester:

77classeur1.xlsm (55.46 Ko)

Le code pour jeter un coup d'oeil rapide... :

Sub AjouterRef()
'
'
'
derniereLigne = Range("A" & Rows.Count).End(xlUp).Row

Set maPlage1 = Range("A" & derniereLigne & ":H" & derniereLigne)
Set maPlage2 = Range("A" & derniereLigne)
Set maPlage3 = Range("B" & derniereLigne)
Set maPlage4 = Range("C" & derniereLigne & ":G" & derniereLigne)
Set maPlage5 = Range("H" & derniereLigne)

Range("A" & derniereLigne & ":H" & derniereLigne).Insert

maPlage1.Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection
            .Borders(xlEdgeLeft).LineStyle = xlDouble
            .Borders(xlEdgeLeft).Weight = xlThick

            .Borders(xlEdgeTop).LineStyle = xlDouble
            .Borders(xlEdgeTop).Weight = xlThick

            .Borders(xlEdgeBottom).LineStyle = xlDouble
            .Borders(xlEdgeBottom).Weight = xlThick

            .Borders(xlEdgeRight).LineStyle = xlDouble
            .Borders(xlEdgeRight).Weight = xlThick

            .Borders(xlInsideVertical).LineStyle = xlDouble
            .Borders(xlInsideVertical).Weight = xlThick

            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlBottom

            maPlage2.Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlBottom
                        .Font.Bold = True
                        .Font.Size = 10
                        .MergeCells = False
                    End With

            maPlage3.Select
                    With Selection
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlBottom
                        .Font.Bold = True
                        .Font.Size = 10
                        .MergeCells = False
                    End With

            maPlage4.Select
                    With Selection
                        .HorizontalAlignment = xlLeft
                        .VerticalAlignment = xlBottom
                        .Font.Size = 9
                        .MergeCells = True
                    End With

            maPlage5.Select
                    With Selection
                        .HorizontalAlignment = xlRight
                        .VerticalAlignment = xlBottom
                        .NumberFormat = "#,##0.00 $"
                        .Font.Size = 10
                        .Font.Color = RGB(79, 129, 189)
                    End With
        End With
        Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

Range("A" & Rows.Count).End(xlUp).Select

Set maPlage1 = Nothing
Set maPlage2 = Nothing
Set maPlage3 = Nothing
Set maPlage4 = Nothing
Set maPlage5 = Nothing

End Sub

Bonsoir,

Ton code me décourage...

Mais tu insères une ligne avant derniereLigne.

Si ce n'est pas là qu'elle doit être insérée, c'est où ?

Cordialement.

Bonjour MFerrand,

Le but est insérer une ligne avec ses propriétées sur la ligne 6…

Dans ce cas, il faut écrire :

Rows(6).Insert

et tu obtiendras une nouvelle ligne 6, dont les formats seront (par défaut) ceux de la ligne 5 (et l'ancienne ligne 6 sera devenue 7...)

ou mieux : Worksheets(...?).Rows(6).Insert

car l'absence de qualificateur d'objet laisse toujours planer une certaine incertitude sur le code (dépendant alors de la feuille active du classeur actif...)

Cordialement.

Je pense que je me suis mal fait comprendre...

Ce tableau est amené dans le futur a recevoir de nouvelles lignes de références...

Actuellement, ce tableau comprend 2 lignes et 8 colonnes :

1°) Ligne : En-têtes du tableau.

2°) Ligne : Réf1.

Je voudrais, que quand je clique sur le bouton, une 3°) ligne s'ajoute en DESSOUS de la 2°) ligne...

Si je fais :

derniereLigne = Range("A" & Rows.Count).End(xlUp).Row

Range("A" & derniereLigne & ":H" & derniereLigne).Insert

Le tableau devient :

1°) Ligne : En-têtes du tableau.

2°) Ligne : Nouvelle ligne (Propriétées de la ligne 1°) SANS le fusionnage des cellules de "C:G")

3°) Ligne : Réf1.

Alors que moi je voudrais :

1°) Ligne : En-têtes du tableau.

2°) Ligne : Réf1

3°) Ligne : Nouvelle ligne (Propriétées de la ligne 2°) AVEC le fusionnage des cellules de "C:G")

Est-ce plus clair ???

Le tableau pour pouvoir tester :

76classeur1.xlsm (55.46 Ko)

bonsoir MFerrand, idev4s et le forum

code pas très chatolique mais essaie en remplaçant ton code par ceci dans un nouveau module

Sub test()
Dim lig As Integer

With Sheets("Feuil1")

   lig = .Range("A65536").End(xlUp)(2).Row
    If lig < 6 Then lig = 6

    'insertion d'une ligne

    .Range("A" & lig - 1 & ":H" & lig - 1).Copy
    .Range("A" & lig).Insert xlShiftDown
    .Range("A" & lig & ":H" & lig).ClearContents

End With
End Sub

Bonsoir grisan29,

grisan29 a écrit :

code pas très chatolique mais essaie en remplaçant ta ligne par celle-ci

derniereLigne = Range("A65536").End(xlUp)(2).Row

Ne fonctionne pas...

croisement

je t'ai mis un nouveau code mais je sais pas pour MAC

Il faut savoir ce que tu veux, et l'exprimer intelligiblement.

Si tu calcules :

dl = Range("A" & Rows.Count).End(xlUp).Row

et que tu veux insérer à la ligne en-dessous, tu fais :

Rows(dl + 1).Insert

la fusion n'étant pas un format, elle ne s'hérite pas, tu ajoutes donc :

Range("C" & dl +1 & ":G" & dl +1).Merge

C'est pas sorcier, il suffit d'écrire ce que tu dis !

bonsoir MFerrand

d'accord avec toi , d'ailleurs quel est le but final du projet car tout peut être de travers si pas de but

Aucune idée !

@grisan29:

Ton nouveau code a l'air de fonctionner...

Cependant, il manquerai 2, 3 modifs pour que se soit vraiment parfait !!!

Modifs :

1°) Centrer le texte dans cellule "B". (dans nouvelle ligne ajoutée)

2°) Format "Comptabilité" dans cellule "H". (dans nouvelle ligne ajoutée)

3°) Terminer en sélectionnant la cellule "A". (dans nouvelle ligne ajoutée)

4°) Démasquer les nouvelles lignes ajoutées (Car les cellules ne faisant pas parties du tableau sont masqués à la base).

Le code de grisan29:

Sub test()
Dim lig As Integer

With Sheets("Feuil1")

   lig = .Range("A65536").End(xlUp)(2).Row
    If lig < 6 Then lig = 6

    'insertion d'une ligne

    .Range("A" & lig - 1 & ":H" & lig - 1).Copy
    .Range("A" & lig).Insert xlShiftDown
    .Range("A" & lig & ":H" & lig).ClearContents

End With
End Sub

Et là ce serai vraiment top !


@ MFerrand:

J'ai essayé d'intégrer tes nouvelles lignes de code mais sans résultat...

Je me plante sûrement !!!

Pourrais-tu les intégrer dans mon code sltp ???

Se serai plus clair pour moi n'étant pas un pro...


Le but est d'automatiser l'insertion de nouvelles Réfs dans le tableau... ni plus... ni moins...

bonsoir

pour centrer le text en colonne "B" tu rajoutes

.Range ("B" & lig).HorizontalAlignment = xlCenter

pour le reste a suivre mais pour les 2 dernier points je laisse la main

pour le format comptabilité la ligne 5 est recopier en entier avec ses formats donc celui de la col H reste "monétaire"

comment veux tu insérer des données dans ta feuille, donnes nous des détails croustillants pour te répondre

dans ton classeur tu demandes

que la nouvelle ligne soit la 6 (avec propriétées de la 5)…

c'est ce que fait mon code

il copie la ligne 5 pour la transférer dans les lignes suivantes

pour revenir a la cellule A a chaque ajout, il faut déja que la dernière cellule soit remplie pour le faire

.Range("A" & lig).Select

ou sont tes références que tu doit ajouter

bonsoir

donne nous un exemple concret de ce que tu attends comme si tu l'avais déja réaliser mais avec des données bidons

car tu as dit

(Car les cellules ne faisant pas parties du tableau sont masqués à la base).

Re,

Je ne comprends pas vraiment ce que tu fais, cela a l'air de changer en permanence...

A force tu arriveras bien au but...

Cordialement.

C'est bon, c'est trouvé !!!

Le code final :

Sub AjouterRef()
'
Dim lig As Integer

derniereLigne = Range("A65536").End(xlUp)(2).Row

        With Sheets("Feuil1")
            lig = .Range("A65536").End(xlUp)(2).Row

            .Range("A" & lig - 1 & ":H" & lig - 1).Copy
            .Range("A" & lig).Insert xlShiftDown
            .Range("A" & lig & ":H" & lig).ClearContents
            .Range("A" & lig & ":H" & lig).HorizontalAlignment = xlLeft
            .Range("B" & lig).HorizontalAlignment = xlCenter
            .Rows(lig).EntireRow.Hidden = False
        End With

Range("A" & Rows.Count).End(xlUp)(2).Select

End Sub

Pourrais-tu expliquer cette ligne sltp :

lig = .Range("A65536").End(xlUp)(2).Row

Je ne la comprend pas...

Un grand merci à toi grisan29 pour ton code beaucoup plus simple que le mien !!! et à toi aussi MFerrand !!!

bonsoir

.Rows(lig).EntireRow.Hidden = False

que viens faire cette ligne, avec un essai elle ne cache rien du tout

car lig tout seul ne fonctionne pas

pour ce qui est

derniereLigne = Range("A65536").End(xlUp)(2).Row

        With Sheets("Feuil1")
            lig = .Range("A65536").End(xlUp)(2).Row

il n'ya aucun besoin de 2 instruction pour faire le même travail

 lig = .Range("A65536").End(xlUp)(2).Row

[/code] on prends la dernière ligne a partir du bas Lig représente la ligne

plus besoin de dernièreligne

mais comme dernièreligne n'est pas déclaréeelle ne fonctionne pas

Sub AjouterRef()
Dim lig As Integer

'derniereLigne = Range("A65536").End(xlUp)(2).Row

        With Sheets("Feuil1")
            lig = .Range("A65536").End(xlUp)(2).Row

            .Range("A" & lig - 1 & ":H" & lig - 1).Copy
            .Range("A" & lig).Insert xlShiftDown
            .Range("A" & lig & ":H" & lig).ClearContents
            .Range("A" & lig & ":H" & lig).HorizontalAlignment = xlLeft
            .Range("B" & lig).HorizontalAlignment = xlCenter
            .Range("A" & lig).Select
        End With

'Range("A" & Rows.Count).End(xlUp)(2).Select

End Sub
Sub AjouterRef()
    Dim lig As Integer
    With Sheets("Feuil1")
        lig = .Range("A" & .Rows.Count).End(xlUp)(2).Row
        .Range("A" & lig - 1 & ":H" & lig - 1).Copy
        .Range("A" & lig).Insert xlShiftDown
        .Range("A" & lig & ":H" & lig).ClearContents
        .Range("A" & lig & ":H" & lig).HorizontalAlignment = xlLeft
        .Range("B" & lig).HorizontalAlignment = xlCenter
    End With
End Sub

...Après avoir ôté les éléments en trop qui pourraient te poser problème...

Le A65536 qui t'inquiétait tout à l'heure est la même chose que Rows.Count, on l'utilisait jusqu'en 2003 parce que les feuilles avaient 65536 lignes, pour désigner la dernière. Aujourd'hui, elles en ont 1048576, alors plutôt que de prendre ce nouveau nombre pour la dernière ligne, on lui préfère Rows.Count qui le renvoie.

Ton derniereLigne antérieur a été remplacé par lig. L'un des deux était à supprimer. Et tu n'allais pas calculer 3 fois la dernière ligne...

Et le démasquage de la ligne que tu viens d'insérer n'a pas de raison d'être. Elle n'a pu être masquée !

Mais je signale quand même que .Rows(lig).EntireRow est un pléonasme : .Rows(lig) indique déjà la ligne entière, pas la peine de faire bégayer VBA en le répétant.

Bref, je ne retouve tout de même pas ce que tu annonçais au départ, mais il y a eu divers changements en cours de route. En tout cas, il n'y a pas de fusion...

Cordialement.

bonsoir MFerrant

la tu m'apprends une chose

Rows.Count, on l'utilisait jusqu'en 2003 parce que les feuilles avaient 65536 lignes, pour désigner la dernière. Aujourd'hui, elles en ont 1048576, alors plutôt que de prendre ce nouveau nombre pour la dernière ligne, on lui préfère Rows.Count qui le renvoie.

je suis sous 2013 et mon classeur d'ou est issu le code fonctionne quand même mais je vais prendre en compte ta remarque et l'appliquer

Re Grisan,

Dans le cas général on a quand même peu de fichiers qui dépassent 60000 lignes, on peut se contenter de beaucoup moins.

C'est juste une question esthétique, et aussi parce que Rows.Count va marcher sur toutes les versions...

Rechercher des sujets similaires à "difficulte inserer nouvelle ligne vba"