Copier/coller des vers une autre feuille, et revenir à la précédente

  • Auteur de la discussion julolo83
  • Date de début

julolo83

Nouveau membre
Bonjour,
J'ai un classeur contenant X onglets (1 onglet supplémentaire par semaine).
Dans chaque onglet se trouve des lignes que je veux récupérer sur une feuille vierge.
Je souhaite copier des cellules d'une feuille1 vers la première ligne d'une feuille2 (vierge), sur ce point-là tout fonctionne.
Ensuite, je souhaiterais que cela se fasse pour chaque feuille de mon classeur (les X onglets) automatiquement.
Pour le moment mon problème est que je suis obligé de "coder" le nom de la feuille à sélectionner, car je ne sais pas faire revenir le programme automatiquement sur cette feuille après avoir effectué le collage.

Voici mon code:

Code:
Private Sub CommandButton1_Click()

Dim Cell As Range
Dim WS_Count As Integer
Dim I As Integer

WS_Count = ActiveWorkbook.Worksheets.Count 'Compte le nombre de feuilles

    For I = 1 To WS_Count 'Début de la boucle de parcours des feuilles

            For Each Cell In Range("G2:G3000") 'Début de la boucle de recherche du mot
                If WorksheetFunction.CountIf(Cell, "*" & "note de justification" & "*") Then
                    Cell.EntireRow.Copy 'Sélectionne la cellule quand la condition est respectée et copie la ligne comportant cette cellule
                    Sheets("Feuil2").Select 'Sélectionner une autre feuille (vierge celle-là)
                        
                        With Worksheets(1)
                            .Range("A" & I).Select 'Dans la feuille vierge, sélectionner la première ligne vide
                        ActiveSheet.Paste 'Coller la sélection
                        I = I + 1 'Passer à la ligne suivante
                        Sheets("WK 05_2013").Select 'Revenir à la page active
                        End With
                        
                ElseIf WorksheetFunction.CountIf(Cell, "*" & "dossier constructeur" & "*") Then 'Même boucle que précédemment
                    Cell.EntireRow.Copy
                    Sheets("Feuil2").Select
                        
                        With Worksheets(1)
                            .Range("A" & I).Select
                        ActiveSheet.Paste
                        I = I + 1
                        Sheets("WK 05_2013").Select
                        End With
                        
                ElseIf WorksheetFunction.CountIf(Cell, "*" & "Analyse de risque" & "*") Then 'Même boucle que précédemment
                    Cell.EntireRow.Copy
                    Sheets("Feuil2").Select
                        
                        With Worksheets(1)
                            .Range("A" & I).Select
                        ActiveSheet.Paste
                        I = I + 1
                        Sheets("WK 05_2013").Select
                        End With
                        
                End If
            Next Cell
   Next I
            
End Sub
Pouvez-vous m'aider s'il vous plait ?
Merci d'avance :)
 

drul

Obscur pro du hardware
Staff
Aie, tes oreilles vont chauffer ...

Premièrement, stp utilise aussi la balise de fin, afin que ton code sois présenté convenablement, ensuite, de quel droit utilises tu une zone mémoire systeme et publique comme le presse papier ? tu risque d'écraser des données importantes, ou au contraire que quelqu'un d'autre vienne polluer ton application en écrivant dans le presse papier au mauvais moment.

Ensuite I est un indice de boucle représantant un feuille de calcul, que tu utilises par la suite pour définir une ligne dans un range, si ça marche ça tient du miracle ...

Pour ton probleme de revenir sur la page source, je définirais une variable de type worksheet qui "pointe" sur ta cible et que tu réaffecte à chaque fois.
Exemple:

Code:
Sub func()
Dim WS As Worksheet
For Each feuille In ActiveWorkbook.Sheets
    Set WS = feuille
    MsgBox WS.Name
Next
End Sub
 

julolo83

Nouveau membre
Aie oui elles ont chauffé !! :)

Je te remercie de tes conseils, j'essaierai donc dès demain (au boulot) cette partie de programme.

Ensuite je ne connais pas ce que l'on doit mettre en "balise de fin" pour que le code s'affiche correctement ?

Et pour te répondre, ca marche nikel pour la copie d'une feuille sur l'autre, ca passe en revue toute ma feuille de calcul et ca renvoie les lignes (sous condition) correctement, pour tout dire ca me trie environ 70 lignes sur les 1500 de cette feuille.

Car pour l'indice I, je l'avais mis au début en tant qu'indice de boucle, mais ma boucle FOR ne fonctionne pas comme je le voudrais, mais si je la supprime du code par contre plus rien ne vas.

Peux-t-on poster des fichiers sur le site ? car je voudrais t'envoyer une copie partielle de mon fichier, pour que tu puisse voir.

Merci encore :)
 

drul

Obscur pro du hardware
Staff
Tu mets juste [/code] en fin.
Virus oblige, tout échange de fichier est banni du forum, dsl.

Améliore ton code, selon mes conseils et reposte, et on essayera d'arriver à qqch (et si le diablotin sautillant s'en mêle, on y arrivera que mieux ;) :hello: Zeb)
 

julolo83

Nouveau membre
Bonjour,

Alors j'essaye petit à petit de modifier ce code, pour l'histoire de l'indice de boucle, je l'ai modifié dans mon Range, voila ce que j'ai codé :
Code:
Sub func()
Dim Cell As Range
Dim WS_Count As Integer
Dim I As Integer
Dim J As Integer
For I = 1 To WS_Count 'Début de la boucle de parcours des feuilles
            For Each Cell In Range("G2:G3000") 'Début de la boucle de recherche du mot
                If WorksheetFunction.CountIf(Cell, "*" & "note de justification" & "*") Then
                    Cell.EntireRow.Copy 'Sélectionne la cellule quand la condition est respectée et copie la ligne comportant cette cellule
                    Sheets("Feuil2").Select 'Sélectionner une autre feuille (vierge celle-là)
                         With Worksheets(1)
                            .Range("A" & J).Select 'Dans la feuille vierge, sélectionner la première ligne vide
                        ActiveSheet.Paste 'Coller la sélection
                        J = J + 1 'Passer à la ligne suivante
                        Sheets("WK 05_2013").Select 'Revenir à la page active
                        End With
                End If
            Next Cell
Next I
End Sub

Le problème est que, maintenant, ca ne compile plus.

Merci encore
 

drul

Obscur pro du hardware
Staff
Hum, faudrait peut-être initialiser J avant de l'utiliser ...

PS: arrête de passer par le presse papier, arrête de faire des selects, et définit toujours entièrement l'objet que tu utilises (en gros précise toujors sur la feuille lorsque tu utilises cells ou range) !
 

julolo83

Nouveau membre
Alors c'est à dire qu'il faut que j'intègre la feuille à sélectionner dans mon Range ?
Car actuellement mes "Select" servent à sélectionner la destination puis il y a le collage puis encore la destination pour continuer la recherche et donc pouvoir copier, et ainsi de suite.

Et pour le problème du Presse-Papier je ne vois pas ce qui gène car je fais un copier/coller simple.
 

drul

Obscur pro du hardware
Staff
Imagine que l'utilisateurs ait copié des info importantes dans le presse papier, et bien ton simple copier coller, vient de les détruire !
Imagine maintenant qu'un autre programme fasse la même chose que toi ... tu copie, l'autre programme copie avant que le tien n'ait coller, Tu colles ... Résultat: patatra, tu te retrouve avec les données de l'autre programme !

Le presse papier appartient à l'utilisateur, pas au programme, il est important de respecter ça.

Un exemple pour toi:
Code:
Sub func()
'le code :
Sheets(1).Select
Range("A1").EntireRow.Select
Selection.Copy
Sheets(2).Select
Range("A1").Select
Selection.Paste

' se remplace avantageusement par:

Sheets(1).Range("a1").EntireRow.Copy Sheets(2).Range("a1")
' et en plus, ça n'écrase pas le press papier \o/

End Sub

 

julolo83

Nouveau membre
Merci, mais je ne vois pas de fonction "coller" dans ton exemple et je ne cmprends pas comment adapter ca à mon programme, qui est :

Code:
            For Each Cell In Range("G2:G3000") 'Début de la boucle de recherche du mot
                If WorksheetFunction.CountIf(Cell, "*" & "note de justification" & "*") Then
                    Cell.EntireRow.Copy 'Sélectionne la cellule quand la condition est respectée et copie la ligne comportant cette cellule
                    Sheets("Feuil2").Select 'Sélectionner une autre feuille (vierge celle-là)
                        
                        With Worksheets(1)
                            .Range("A" & J).Select 'Dans la feuille vierge, sélectionner la première ligne vide
                        ActiveSheet.Paste 'Coller la sélection
                        J = J + 1 'Passer à la ligne suivante
                        End With
                End If
            Next Cell

J'ai un autre problème, c'est que mon programme ne recherche que les données présentes sur une feuille (worksheets(1)) mais je n'arrive pas à trouver la syntaxe afin que ca recherche sur toutes (car en inscrivant worksheets(2) ca ne tourne plus).

Merci
 

drul

Obscur pro du hardware
Staff
Code:
source.copy dest
Copie la source dans dest, sans avoir besoin d'appeler paste (et sans utiliser le presse papier).

Pour passer dans toutes tes feuilles, remplace worksheets(1) par worksheet(I) !

En gros qqch comme ça:
Code:
Sub func()

Dim Cell As Range

Dim WS_Count As Integer

Dim I As Integer

Dim J As Integer

WS_Count = ActiveWorkbook.Worksheets.Count 'Compte le nombre de feuilles
J = 1

For I = 1 To WS_Count 'Début de la boucle de parcours des feuilles
    
    If Sheets(I).Name <> "Feuil2" Then
            
            For Each Cell In Sheets(I).Range("G2:G3000") 'Début de la boucle de recherche du mot

                If InStr(1, Cell, "note de justification") Then

                    Cell.EntireRow.Copy Sheets("Feuil2").Range("A" & J)   'Sélectionne la cellule quand la condition est respectée et copie la ligne comportant cette cellule

                        J = J + 1 'Passer à la ligne suivante

                End If

            Next
    End If
Next

End Sub
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 152
Messages
6 718 433
Membres
1 586 427
Dernier membre
Huxley88
Partager cette page
Haut