Insérer des lignes après actualisation

Bonjour,

J'ai un soucis avec le code que j'ai essayé d'écrire car je ne suis pas très à l'aise avec le langage VBA.

J'aimerais que le code exécute plusieurs actions :

- Actualiser la feuille "AP" du classeur "ASS-BDO-TBD..." qui est alimentée par la feuille "Actu_données du classeur " Sylviane_V3"

- Après actualisation si des lignes se sont ajoutées, je voudrais insérer 3 lignesdans la feuille "Data" du classeur "ASS-BDO-TBD..." pour chaque nouvelle ligne qui se sont ajoutés sinon ne rien ajouter.

En sachant que la colonne "D" de "Data" = "B" de "AP" dupliqués sur 3 lignes

Voici mon code :

Private Sub Worksheet_Insert()

Dim i As Long

Application.ScreenUpdating = False
ActiveWorkbook.RefreshAll

    For i = Range(B65536).End(xlUp).Row To 1 Step -1
    If Cells(i, " B") <> Cells("Data").Range("D:D") Then
    Sheets("Data").Select
    Rows(i & ":" & (i + 3)).Select
    Selection.Insert Shift:=xlDown

        End If

    Next i

End Sub

Merci d'avance pour votre aide

Sam

Bonjour,

Quelques éléments pour analyser ton bout de code :

Cells(i, " B") => Pourquoi B précédé d'une espace ?

Si c'est pour indiquer la colonne B, pourquoi pas 2 plus simple et plus logique dans cette syntaxe.

Cells sans qualificateur d'objet réfère à la feuille active (de même que le Range de la ligne précédente).

Cells("Data") => Data n'étant pas un nom de plage, mais un nom de feuille, il y a apparemment confusion d'objets.

Si cela était une plage, Range était plus approprié.

Si feuille, Worksheets("Data") est la bonne expression.

.Range("D:D") => désigne une colonne entière. Mais il s'agit d'un élément du 2e membre d'une expression comparative, séparée du premier par l'opérateur <> : l'ensemble définit une condition qui doit renvoyer vrai ou faux selon que les 2 éléments comparés sont différents ou pas. Seulement, on compare la valeur d'une cellule à celle d'un colonne entière, ce qui n'est pas très approprié comme comparaison.

Pour les 3 lignes qui suivent la commande est correcte, mais aurait pu être écrite en une ligne (sans les Select qui ne font que fractionner en plusieurs étapes une action qui n'a pas à l'être).

Cordialement

Ferrand

Bonjour Ferrand,

Tout d'abord merci pour tes indications.

J'ai corrigé mon code en fonction de ce que tu m'as dit et voilà ce que ça donne :

Private Sub Worksheet_Insert()

    Dim i As Long

    Application.ScreenUpdating = False
    ActiveWorkbook.RefreshAll

        For i = Worksheets("AP")("B:B").End(xlUp).Row To 1 Step -1
        If Worksheets("AP")(i, 2) <> Worksheets("Data")(i, 4) Then
        Worksheets ("Data")
        Rows (i & ":" & (i + 3))
        Selection.Insert Shift:=xlDown

            End If

        Next i

    End Sub

Sauf que j'ai un message d'erreur qui s'affiche et qui me dit " Erreur de compilation, utilisation incorrecte de la propriété"

Qu'est ce que cela signifie ? Si tu pouvais m'aider à nouveau.

Sam

A vue de nez :

Worksheets ("Data").Rows (i & ":" & (i + 3)).Insert Shift:=xlDown

ceci constituerait une meilleure ligne de commande.

Merci, alors j'ai effectué tes modifications. Mais maintenant j'ai un autre problème.

Un message d'erreur me dit : "propriété ou méthode non gérée par cet objet"

Et il me surligne cette ligne de code à débogguer :

For i = Worksheets("AP")("B:B").End(xlUp).Row To 1 Step -1
For i = Worksheets("AP").Range("B" & Rows.Count).End(xlUp).Row To 1 Step -1

Si tu continues d'escamoter les objets, ça va pas s'arrêter !

Ah désolé j'ai vraiment du mal avec ce langage...

Mais dois-je ajouter également "Range" dans la ligne du dessous ? Car mon problème demeure si je ne le fait pas.

Et lorsque j'ajoute "Range" j'ai un autre message qui me dit : "Erreur définie par l'application ou l'objet"

If Worksheets("Atterrissage Planificator").Range(i, "2") <> Worksheets("Data").Range(i, "4") Then

Et peux-tu me dire ce que signifie exactement ceci :

End(xlUp).Row To 1 Step -1

Car je l'ai écrit dans mon code mais parfois j'ai du mal à comprendre exactement ce que j'écris...je fais beaucoup de copier-coller quand je vois que cela m'est utile..

Bien sûr qu'il faut indiquer les plages (ou cellules) ! La feuille ne suffit pas.

Et tu enlèves les guillemets autour des nombres. Les guillemets c'est pour le texte, les nombres pas de guillemets.

End(xlUp).Row => Tout seul, rien ! Mais tout à l'heure la propriété était qualifiée par la dernière cellule de la colonne B sur la feuille. Dans ce contexte, l'expression recherche la dernière cellule occupée dans la colonne B en remontant, et avec .Row renvoie son numéro de ligne. L'expression globale étant incluse dans une boucle For...Next tu vas boucler avec la variable i comme compteur de cette ligne jusqu'à 1 en décrémentant de 1 (Step -1) à chaque tour (on doit indiquer le pas quand il est différent de 1).

Aaaah d'accord je comprend mieux

J'ai un autre message d'erreur....

"Erreur définie par l'application ou l'objet"

Ce que j'ai compris de l'aide c'est que c'est moi-même qui ait définie une erreur par mon objet ou par l'application hôte "Excel".

Il signale cette erreur à ce niveau là du code :

If Worksheets("Atterrissage Planificator").Range(i, 2) <> Worksheets("Data").Range(i, 4) Then

Une erreur 1004 ?

Cela veut dire que c'est Excel qui renvoie l'erreur.

Les causes ne sont pas toujours évidentes et dans ce cas il n'est pas rare que la ligne soulignée induise en erreur...

Ce qu'il faut voir en priorité c'est si la comparaison que tu fais ne provoquerait une erreur en raison du type de données.

Autre chose importante, la valeur de i au moment de l'erreur (quand tu fait débogage tu te retrouves sur le module, en passant le curseur sur i, une info bulle affichera sa valeur), qui permet de savoir si la boucle a été entamée ou non.

Alors oui c'est une erreur 1004.

D'accord, mais si ce sont mes données qui sont la source de l'erreur comment exprimer mon besoin autrement ?

Dans mon code, i=60 donc je pense que la boucle a été entamée puisque ma colonne B comporte 60 lignes.

N'est-ce pas non plus un problème avec le fait que mes deux tableaux ne comportes pas le meme nombre de lignes ? Car dans la colonne D de "Data" il y a plus de 60 lignes.

Juste à la fin !

Que se passe-t-il lorsque la condition est satisfaite ?

Et qu'est-ce qui suit la boucle ?

Lorsque la condition est satisfaite, il doit m'insérer 3 lignes dans la feuille "Data" pour chaque nouvelle ligne qui est apparue dans la feuille "AP".

Et qu'est-ce qui suit la boucle ?

Je ne comprends pas ta question... la boucle doit être suivie ?

N'est-ce pas non plus un problème avec le fait que mes deux tableaux ne comportes pas le meme nombre de lignes ? Car dans la colonne D de "Data" il y a plus de 60 lignes.

La boucle était calculée sur la feuille "AP", ta comparaison sur "Atterrissage Planificator" : deux feuilles différentes ?

Si Data a plus de lignes que la boucle n'en parcourt cela ne déclenchera pas d'erreur.

La procédure s'arrête en fin de boucle ou il y a d'autres commandes après ?

Et tu n'as pas dit ce qui se passait lorsque la condition était vérifiée ?

La boucle était calculée sur la feuille "AP", ta comparaison sur "Atterrissage Planificator" : deux feuilles différentes ?

Non, la feuille "AP" est une feuille test donc après j'applique mon code sur la feuille dont j'ai besoin "Atterrissage Planificator"

La procédure s'arrête en fin de boucle ou il y a d'autres commandes après ?

Pour l'instant la procédure s'arrête en fin de boucle mais j'aimerais ajouter d'autres commandes si c'est possible.

Et tu n'as pas dit ce qui se passait lorsque la condition était vérifiée ?

Si je t'ai répondu, quand la condition est vérifiée, je veux que le code insère 3 lignes dans la feuille "Data" pour chaque nouvelle ligne qui se seront ajoutées dans la colonne B de la feuille "AP".

Question : est-ce que ma condition signifie bien que "si la colonne B de la feuille "AP" est différente de la colonne D de la feuille "Data" alors il faut insérer 3 lignes dans la feuille "Data" " ?

J'essaye d'être plus claire lorsque la procédure compare la colonne D de la feuille "Data" avec la colonne B de la feuille "AP" si elle repère une ou plusieurs données dans la feuille "AP" qui n'apparraissent pas dans la feuille "Data" alors elle doit insérer trois lignes pour chaque nouvelle données dans la feuille Data.

C'est un peu hâché ! Il me semble qu'il y avait insertion de 4 lignes.

Désolé si je n'arrive pas à bien exprimé mon besoin

Non j'ai toujours voulu 3 lignes mais dans ma procédure j'ai sans doute mal écrit ce que je voulais...

Dois-je changer ce code ? :

Worksheets("Data").Rows(i & ":" & (i + 3)).Insert Shift:=xlDown

Et mettre à la place :

Worksheets("Data").Rows(i & ":" & (i + 2)).Insert Shift:=xlDown

Pour avoir mon insertion de 3 lignes ?

Oui, pour 3 c'est le second.

D'accord, merci pour ton aide.

Je vais essayer de débloquer ma situation. Une fois que ce sera fait je signifierais que mon problème est résolu.

Merci encore

Avis à ceux qui ont une solution également, n'hésitez pas

Sam

Bonjour MFerrand,

Ca y est j'ai obtenu une aide extérieure pour mon problème et voici ce que l'on m'a proposé :

Sub insere_ligne()

'Déclaration es variables
 Dim c As Range
 Dim ligne As Integer

    'Dans la feuille atterrissage, une formule rechercheV a été ajoutée dans la colonne C
    'Sélection des cellules de cette colonne C
    Sheets("Atterrissage Planificator").Select
    ActiveSheet.Cells(1, 3).Select
    Range(ActiveCell, Selection.End(xlDown)).Select

    For Each c In Selection.Cells   'Pour chaque cellule dans les cellules sélectionnées
        If IsError(c.Value) Then    'si la cellule est en error (#N/A du rechercheV)
            ligne = Sheets("data").Cells(1, 1).CurrentRegion.Rows.Count + 1 'la variable ligne prend la valeur de la dernière ligne de data + 1
            For i = ligne To ligne + 2  'boucle compteur qui tourne 3 fois
                With Sheets("data") 'Affectation des valeurs dans la fauille data
                    .Cells(i, 1).Value = "Change"
                    .Cells(i, 2).Value = "PJ"
                    .Cells(i, 3).Value = c.Offset(0, -2).Value
                    .Cells(i, 4).Value = c.Offset(0, -1).Value
                End With
            Next i
        End If
    Next c
End Sub

Et il fonctionne à merveille

Merci pour ton aide de départ.

Sam

Rechercher des sujets similaires à "inserer lignes actualisation"