Collage a la suite

Lucie61

XLDnaute Nouveau
Bonjour tout le monde

Je me permets de poster un sujet qui a déjà dû être traité sur une autre discussion mais que je n'ai pas trouvé par rapport à mon problème.

Je n'arrive juste pas à comprendre où se trouve mon erreur sur la macro ci-dessous :
VB:
Sub variables()
Dim i As Integer

derlig = Worksheets("Feuil2").Range("A65000").End(xlUp).Row + 1
For i = 3 To derlig
        If Worksheets("Feuil1").Cells(i, 3).Value = "oh" Then
        Sheets("Feuil2").Cells(derlig, 1).Value = Sheets("Feuil1").Cells(i, 1).Value
        Sheets("Feuil2").Cells(derlig, 3).Value = Sheets("Feuil1").Cells(i, 2).Value
        derlig = derlig + 1
        Else
        End If
Next i

End Sub

Quand je clique sur mon bouton, la macro fonctionne elle respecte ma condition mais je dois cliquer plusieurs fois sur le bouton pour que cela se fasse à la suite et qui plu est il me colle plusieurs fois le même résultat alors que je dois tomber sur 2 lignes l'une en dessous de l'autre. Et parfois, la macro ne cesse de fonctionner alors que je n'ai rien changé.

Je ne reçois aucun message m'indiquant sur quelle ligne de code il ne marche pas.

merci par avance

Lucie
 

Pièces jointes

  • remplissage a la suite.xlsm
    21.4 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Lucie,
Si vous faites du pas à pas, vous verrez que derlig à une valeur fausse.
D'autre part, vous ne pouvez pas utiliser le même pointeur en feuil1 et en feuil2, car l'index en feuil2 va dépendre de ce qui a déjà été écrit sans prévaloir de la feuil1.
Ensuite, il y a une erreur de structure. Vous faites :
VB:
For i = 3 To derlig
        derlig = derlig + 1
Next i
En lecture derlig est figé une fois pour toute et dépend que de la liste en feuil1.

En PJ un essai. J'ai créé deux pointeurs, un en lecture sur feuil1, un en écriture sur feuil2 :
Code:
Sub variables()
Dim i As Integer
derlig1 = 1 + Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
derlig2 = 1 + Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row
For i = 3 To derlig1
        If Sheets("Feuil1").Cells(i, 3).Value = "oh" Then
            Sheets("Feuil2").Cells(derlig2, 1).Value = Sheets("Feuil1").Cells(i, 1).Value
            Sheets("Feuil2").Cells(derlig2, 3).Value = Sheets("Feuil1").Cells(i, 2).Value
            derlig2 = derlig2 + 1
        End If
Next i
End Sub
A tester.
 

Pièces jointes

  • remplissage a la suite.xlsm
    23.4 KB · Affichages: 4

Lucie61

XLDnaute Nouveau
Bonsoir Lucie,
Si vous faites du pas à pas, vous verrez que derlig à une valeur fausse.
D'autre part, vous ne pouvez pas utiliser le même pointeur en feuil1 et en feuil2, car l'index en feuil2 va dépendre de ce qui a déjà été écrit sans prévaloir de la feuil1.
Ensuite, il y a une erreur de structure. Vous faites :
VB:
For i = 3 To derlig
        derlig = derlig + 1
Next i
En lecture derlig est figé une fois pour toute et dépend que de la liste en feuil1.

En PJ un essai. J'ai créé deux pointeurs, un en lecture sur feuil1, un en écriture sur feuil2 :
Code:
Sub variables()
Dim i As Integer
derlig1 = 1 + Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
derlig2 = 1 + Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row
For i = 3 To derlig1
        If Sheets("Feuil1").Cells(i, 3).Value = "oh" Then
            Sheets("Feuil2").Cells(derlig2, 1).Value = Sheets("Feuil1").Cells(i, 1).Value
            Sheets("Feuil2").Cells(derlig2, 3).Value = Sheets("Feuil1").Cells(i, 2).Value
            derlig2 = derlig2 + 1
        End If
Next i
End Sub
A tester.

Bonsoir sylvanu

Je ne suis pas forte non plus en vba mais j'essaye de comprendre la logique ^^. Merci pour vos explications.
Savez vous comment fait-on pour voir de pas à pas ? il y a un bouton clique pour le faire ?

Cela va surement vous semblez banale mais un pointeur c'est ce qui va permettre de définir une cellule, colonne ou feuille précise ?

Je viens de tester cela fonctionne très bien, mais si j'appuie plusieurs fois le bouton, il me fait apparaître plusieurs fois le résultat. Je sais que je peux utiliser un clearcontents pour effacer les données mais sans effacer les données déjà collées sur cet onglet Feuil2.
Pensez-vous qu'il soit possible en vba de ne pas coller à nouveau les données si les données sont identiques à celles déjà collées en Feuil2 mais si la donnée est déjà présente en Feuil2 mais que je modifie une donnée de cette ligne sur la Feuil1, il remplace juste les données modifiées en Feuil2 ? Peut-être en ajoutant une donnée unique sur une colonne pour identifier chaque ligne. Est-ce faisable ?

En tout cas, oui cela me convient. C'est ce que je souhaitais faire.

Merci pour votre aide sylvanu

Lucie
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Dans l'ordre :
Un pointeur est tout simplement le N° qui "pointe" sur une liste. En d'autres terme cela représente l'endroit où vous voulez lire ou écrire dans une liste. C'est un nombre qui est compris généralement entre 1 et N, N étant le nombre d'éléments dans la liste. ( ou X et X+N si la table ne commence pas en 1)

Pour le pas à pas :
Vous ouvrez votre éditeur VBA, vous cliquez sur votre nom de macro, et le plus simple est de faire appui sur touche de fonction F8. ( ou Menu Deboggage/Pas à pas détaillé )
A chaque appui vous progressez d'une instruction.
Si vous avez ouvert la fenêtre Variables locales, à chaque pas vous avez les variables qui changent de valeur :
20200625_202119.gif

( Je n'ai pas utilisé F8 dans ce Gif car F8 est préempté par le logiciel de capture vidéo )

Autre outil . Vous pouvez mettre un point d'arrêt. Ensuite en lançant la macro, celle ci va s'executer jusqu'au point d'arrêt. C'est bien pratique.
Le point d'arrêt se met en cliquant à gauche de la ligne concernée. Celle ci devient Marron.
Puis vous lancer l’exécution par F5. Après l'arrêt vous avez vos variables. Et vous pouvez continuer en continu par F5 ou en pas à pas par F8. Vous pouvez mettre autant de points d'arrêt que désiré :

20200625_202732.gif


Quant au dernier point. Il faut être plus précise.
Dans le fichier final, n'y aura t-il que deux colonnes à copier ?
Dès qu'un ligne à les mêmes valeurs on ne l'enregistre pas ?
Vous parlez d'un ClearContents, est ce à dire qu'à chaque fois on réinitialise la table ou non ?
Bref, quelques précisions seraient bienvenues.
 

Lucie61

XLDnaute Nouveau
Bonsoir,
Dans l'ordre :
Un pointeur est tout simplement le N° qui "pointe" sur une liste. En d'autres terme cela représente l'endroit où vous voulez lire ou écrire dans une liste. C'est un nombre qui est compris généralement entre 1 et N, N étant le nombre d'éléments dans la liste. ( ou X et X+N si la table ne commence pas en 1)

Pour le pas à pas :
Vous ouvrez votre éditeur VBA, vous cliquez sur votre nom de macro, et le plus simple est de faire appui sur touche de fonction F8. ( ou Menu Deboggage/Pas à pas détaillé )
A chaque appui vous progressez d'une instruction.
Si vous avez ouvert la fenêtre Variables locales, à chaque pas vous avez les variables qui changent de valeur :
Regarde la pièce jointe 1071346
( Je n'ai pas utilisé F8 dans ce Gif car F8 est préempté par le logiciel de capture vidéo )

Autre outil . Vous pouvez mettre un point d'arrêt. Ensuite en lançant la macro, celle ci va s'executer jusqu'au point d'arrêt. C'est bien pratique.
Le point d'arrêt se met en cliquant à gauche de la ligne concernée. Celle ci devient Marron.
Puis vous lancer l’exécution par F5. Après l'arrêt vous avez vos variables. Et vous pouvez continuer en continu par F5 ou en pas à pas par F8. Vous pouvez mettre autant de points d'arrêt que désiré :

Regarde la pièce jointe 1071347

Quant au dernier point. Il faut être plus précise.
Dans le fichier final, n'y aura t-il que deux colonnes à copier ?
Dès qu'un ligne à les mêmes valeurs on ne l'enregistre pas ?
Vous parlez d'un ClearContents, est ce à dire qu'à chaque fois on réinitialise la table ou non ?
Bref, quelques précisions seraient bienvenues.

Bonsoir sylvanu

Je vous remercie pour ces explications ainsi les illustrations qui vont avec. Je ne savais pas que l'on pouvais faire tout ça. Je vais dormir moins stupide ce soir ^^.

Dans le fichier final, n'y aura t-il que deux colonnes à copier ?
Non il y aura 7 colonnes a copier. Mais les copier coller seront de la même structure que cela:
VB:
Sheets("Feuil2").Cells(derlig2, 1).Value = Sheets("Feuil1").Cells(i, 1).Value

Dès qu'une ligne à les mêmes valeurs on ne l'enregistre pas ?
Oui c'est exactement cela.
Pour faire simple, je vais ajouter une colonne disons sur la colonne B, une numérotation unique, si sur l'onglet où les données sont collées (soit l'onglet Feuil2) il y a la même numérotation présente sur l'onglet Feuil1, il vérifie si les données avec la même numérotation n'ont pas été modifiées, si tout est identique alors il ne l''enregistre pas s'il y a une différence alors il écrase juste les données de cette ligne de la même numérotation.

Vous parlez d'un ClearContents, est ce à dire qu'à chaque fois on réinitialise la table ou non ?
Oui si on réinitialise la table. Mais il n'est pas nécessaire de supprimer les données si on écrase simplement les données présentes.

Je vous met en PJ le fichier avec l'ajout de données. Voyez si cela vous convient ?

Si cela est trop complexe ou cela vous demande beaucoup d'effort, ne le faite pas.

merci pour tout ^^

Lucie
 

Pièces jointes

  • remplissage a la suite.xlsm
    21.4 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Lucie,
Je pense que la PJ répond à vos besoins.
Vous remarquerez que si la ligne existe déjà, je ne vérifie pas que toutes les colonnes sont identiques, je réécrit la ligne systématiquement. En fait c'est plus rapide, et on obtient le même résultat.

Dernier point important : Ce genre de macro est viable si vous avez que quelques dizaines de lignes à traiter. Si votre base fait plusieurs milliers de lignes alors ça va être fort long. Il faut passer par un autre système avec des arrays pour accélérer le processus. Donc combien de lignes à traiter votre vrai base contiendra ?
 

Pièces jointes

  • remplissage a la suite (2).xlsm
    25.3 KB · Affichages: 3
Dernière édition:

Lucie61

XLDnaute Nouveau
Bonjour Lucie,
Je pense que la PJ répond à vos besoins.
Vous remarquerez que si la ligne existe déjà, je ne vérifie pas que toutes les colonnes sont identiques, je réécrit la ligne systématiquement. En fait c'est plus rapide, et on obtient le même résultat.

Dernier point important : Ce genre de macro est viable si vous avez que quelques dizaines de lignes à traiter. Si votre base fait plusieurs milliers de lignes alors ça va être fort long. Il faut passer par un autre système avec des arrays pour accélérer le processus. Donc combien de lignes à traiter votre vrai base contiendra ?

Bonjour Sylvanu

Je vous remercie pour votre réponse rapide.
J'ai vu aussi que vous avez pris la peine de décrire votre code, je trouve cela très judicieux de votre part ^^ et très instructif pour moi. Je suis aussi surprise que ce code soit aussi court ^^ mais cela doit être normal quand on comprend les choses ^^.

En ce qui concerne le nombre de lignes, cela variera dans le temps, il peut y en avoir 15 comme 100 sur le mois. Ce sont les données qui vont se rajouter au fur et à mesure. Je ne saurai vous le dire exactement. Si cela devait se déboucher sur plus de lignes que prévu, je ferai en sorte de créer une autre copie vierge et redémarrer à 0 ligne. Je garderai une copie de la précédente et remplira la nouvelle. Il faut juste que vous sachiez que les données seront en quelques sorte traitées pour une durée n'excédent pas 1 semaine, au delà de ce délai cela sera de l'archive. Donc aucune inquiétude, c'est parfait ^^.

Good Job !!

Merci beaucoup pour votre aide, c'est fantastique.

Bonne journée à vous et bonne fin de semaine !!

Lucie
 

Lucie61

XLDnaute Nouveau
Re

Vous avez raison, il est inutile de complexifier la macro. Je pense que le fichier précédent me convenait déjà, je testerai votre nouveau fichier dans la journée.

En tout cas, merci d'avoir pris la peine de répondre très clairement à mon problème. C'est excellent !!!

Lucie