Forum Clubic

Copier toutes les cellules non-vides d'un tableau dans une autre feuille vba

Bonjour à tous,
j’ai utiliser une macro, malgré que je sois débutante, je voulais que dans mon tableau de suivi d’offre un récapitulatif soit fait dans une autre feuille (avec d’autres infos …) et pour cela j’ai fais une macro qui copie les cases pleines dans cette nouvelle feuille, cela fonctionne très bien mais quand il colle j’ai l’impression qu’il colle une multitude de ligne qui fait que je ne peux rien mettre en dessous de mon tableau récapitulatif et ça me pose problème.

voici la macro utilisé:

Sub rapporter()
'Dans la feuille Feuil1
Sheets(“Suivi offres”).Activate
'Ne pas afficher les cellules vides
ActiveSheet.Range("$B$6:$I$15").AutoFilter Field:=1, Criteria1:="<>"
'Selectionner toutes les cellules pleines
Dim MaPlage As Range
Set MaPlage = Range(“B6:I” & Range(“B6”).End(xlDown).Row)
MaPlage.Select
'Copier la selection
Selection.Copy
'Activer la feuille Pilote
Sheets(“Rapport hebdo”).Activate
'Selectionner la première ligne vide
Range(“B15”).End(xlUp).Offset(1).Select
'Copier les valeurs dans la ligne selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Retirer les filtres
Sheets(“Suivi offres”).Activate
ActiveSheet.Range("$B$6:$I$15").AutoFilter Field:=1
End Sub

merci d’avance.

Le code a l’air d’être correct.
C’est une impression ou un constat ?
Il met quoi dans ces lignes supplémentaires ? des cellules vides ? et ça écrase l’existant ?
Si c’est le cas, il faut remplir artificiellement le bas de la feuille pour voir combien il en efface exactement, ça donnera peut être une idée

Bonjour, désolé pour le retard, en effet il copiait des cellules vides et écrasait l’existant.
J’ai pu entre temps trouver une solution mais, j’ai un autre problème, il me copie bien ce qu’il me rapporte bien les donner de ma feuille 2 dans ma feuille 3 par exemple je lui demande de me copier les donnée a partir de la case vide B5 il le fait bien, néanmoins si je remet des données dans ma feuille 2 et que je retourne dans ma feuille 3 pour reporter les données et donc mettre à jour il me recopie a partir de B4 qui n’est pas une case vide…

Sub rapporter()
'Dans la feuille Feuil1
Sheets("Suivi offres").Activate
'Ne pas afficher les cellules vides
ActiveSheet.Range("$B$6:$I$15").AutoFilter Field:=1, Criteria1:="<>"
'Selectionner toutes les cellules pleines
Dim MaPlage As Range
Range("B6:I15").Select
'Copier la selection
Selection.Copy
'Activer la feuille Pilote
Sheets("Rapport hebdo").Activate
'Selectionner la première ligne vide
Range("B2").End(xlUp).Offset(1).Select
'Copier les valeurs dans la ligne selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Retirer les filtres
Sheets("Suivi offres").Activate
ActiveSheet.Range("$B$6:$I$15").AutoFilter Field:=1
End Sub

De plus j’ai mis une autre macro pour qu’il me copie pareil des case non vide pour me les reporter sur ma feuille 3.(ex: je lui demande de prendre les cases non vides a partir de D5 et de les copier sur la feuille 3 a partir de B25 ) ça fonctionne très bien sauf que il est possible selon mon utilisé que sur la feuille 1 la case non vide soit après D5 et la tout est déréglé…

Sub Bouton2_Cliquer()
'Dans la feuille Feuil1
Sheets("Note de Frais").Activate
'Ne pas afficher les cellules vides
ActiveSheet.Range("$F$4:$F$52").AutoFilter Field:=1, Criteria1:="<>"
'Selectionner toutes les cellules pleines
Dim MaPlage As Range
Set MaPlage = Range("F4:F" & Range("F4").End(xlDown).Row)
MaPlage.Select
'Copier la selection
Selection.Copy
'Activer la feuille Pilote
Sheets("Rapport hebdo").Activate
'Selectionner la première ligne vide
Range("B22").End(xlUp).Offset(1).Select
'Copier les valeurs dans la ligne selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Retirer les filtres
Sheets("Note de Frais").Activate
ActiveSheet.Range("$F$4:$F$52").AutoFilter Field:=1
End Sub

comment je peux vous envoyer mon fichier pour que cela soit plus clair?

Merci d’avance
Message edité le 28/02/2017 à 02:44

Bonjour,

Dans ton premier code, il me semble bizarre que tu partes de la cellule B15 de ta feuille “Rapport hebdo” et que tu fasses un End(xlUp). Ne serait-ce pas plutôt un End(xldown) qu’il faudrait ?

Dans ton deuxième code, il me semble bizarre que tu déclares une variable que tu n’utilises pas (la variable MaPlage), et il est encore plus étrange que tu aies effectué un filtrage mais que tu sélectionnes toujours la même plage (la plage B6:I15).

'Selectionner toutes les cellules pleines
 Dim MaPlage As Range
 Range("B6:I15").Select
 'Copier la selection
 Selection.Copy

En suite, toujours dans ton deuxième code, je ferais la même remarque que pour le premier code : bizarre que tu partes de la cellule B2 de ta feuille “Rapport hebdo” et que tu fasses un End(xlUp).

Enfin, dans ton troisème code, je constate une troisième fois le même problème : bizarre que tu partes de la cellule B22 de ta feuille “Rapport hebdo” et que tu fasses un End(xlUp).

Pour envoyer le fichier, tu peux l’héberger par exemple sur Cjoint.com (en limitant la durée de rétention sur leur site à 21 jours :wink: ).
Edité le 25/02/2017 à 03:22

Bonjour,

Merci de votre retour,

Pour le premier code je les remplacés par le deuxième.

Pour la variable MaPlage, je ne sais pas, je suis novice et j’ai essayé comme j’ai pu en regardant sur internet.
Pour le filtrage, je prends toujours la même plage car c’est un tableau mais il se peut parfois que la première et troisième lignes du tableau soient rempli mais que la deuxieme soit vide donc ca me filtre les cases non vide pour les copier.
En effet ce n’est pas B2 mais bien B5 désolé pour l’erreur, car la ligne 4 c’est les intitulés et avant ça les titres. en ce qui concerne le End(xlUp) je suis novice donc je ne sais pas vraiment ce que c’est j’ai repris sur le net.

Pour mon troisième code je pars de B22 car avant ça j’ai mon tableau de mon premier code, un titre ect… donc je commence le report des informations a partir de la cellule B22 de ma feuille" Rapport hebdo".

Voici mon fichier
www.cjoint.com…

Merci d’avance.
Message edité le 27/02/2017 à 17:39

Le premier me semble pourtant infiniment mieux.

C’est sans aucune incidence de déclarer des variables et de ne pas les utiliser dans le code, donc ce n’est pas grave du tout. :wink:

En effet, tu as raison, j’avais lu trop vite : je croyais que tu sélectionnais toujours la plage B6:I6.

B2 ou B5, je ne pouvais pas vraiment savoir si c’était bon ou pas, mais en partant de la ligne n° 2 d’une feuille Excel et en se déplaçant vers le haut, on risque de ne pas aller bien loin… (au dessus de la ligne n° 2, il n’y a que la ligne n° 1)

Tentative d’explication de End(xl…) :
Imaginons que tu aies une feuille Excel avec un tableau rempli de données. Tu sélectionnes une cellule dudit tableau.
Maintenant, tu appuies sur la touche du clavier, puis tu appuies sur une des quatre touches de direction (flèches) du clavier.
Tu constates que la cellule active (la cellule sélectionnée) n’est plus la même : c’est maintenant la dernière cellule non vide que tu aurais rencontrée en partant de la cellule que tu avais sélectionnée et en te déplaçant dans le sens de la flèche que tu as utilisée.

Attention :

  • Si la cellule de laquelle tu pars est vide, alors tu vas jusqu’à la première cellule non vide.
  • Si tu pars d’une cellule non vide et que la cellule juste à côté (dans le sens désiré) est vide, alors tu vas jusqu’à la première cellule non vide.

Bref ! Tout ça pour dire que End(xlDown), End(xlUp), End(xlRight), End(xlLeft), font exactement la même chose, mais dans une macro, respectivement vers le bas, le haut, la droite et la gauche.

Si tu as compris ce que je viens de tenter d’expliquer, alors tu comprends maintenant qu’en partant de la ligne n° 2 (ou n° 5) il faut aller vers le bas pour trouver la dernière cellule non vide de ta colonne.

Là aussi, si tu as compris ma prose, il doit maintenant t’être évident qu’il faut utiliser End(xlDown) et non End(xlUp). :wink:

Au fait : Je n’ai pas encore eu le temps de regarder ton fichier, mais je l’ai téléchargé et je regarderais ça cette nuit probablement. :wink:
Edité le 27/02/2017 à 18:31

J’ai modifié ta macro “rapporter” qui devrait donc maintenant fonctionner correctement.
Le fichier : www.cjoint.com…

Remarques :

1- Il faudrait faire du tri dans tes Mises en Forme Conditionnelles !

2- T’es au courant que tu as des données dans les colonnes masquées L, M et N de la feuille “Rapport hebdo” ???
Si ces données sont inutiles, il serait préférable de supprimer ces colonnes car ça bouffe pas mal de place pour rien. :wink:


Pour ton autre macro, on doit arriver à la modifier pour qu'elle fasse ce que tu expliques qu'elle devrait faire, mais ça risque de donner un résultat totalement incompréhensible dans la feuille "Rapport hebdo" puisque tu ne sauras pas à quelles données (matin ou après-midi, de quel jour) correspondent les valeurs affichées... Edité le 28/02/2017 à 03:07

Bonjour,
Tout d’abord merci, je répond d’abord à ton avant dernier poste:

Si j’ai changé le code c’est parce que le code:

Dim MaPlage As Range
Set MaPlage = Range("B6:I" & Range("B6").End(xlDown).Row)
MaPlage.Select

me copiait toutes les lignes et me les collait toutes du coup ça me retirait ce que j’avais en dessous de mon tableau dans
la feuille “Rapport hebdo” c’est pour ça que j’ai écraser par le code 2.

J’ai bien compris les explications de End(xl…) :
si j’ai bien compris ca me fait mettre ce code :

Range("B3").End(xlDown).Offset(1).Select

il sélectionne du coup une case vide ensuite il y a une case non vide (B4) et va a la prochaine case vide.
Merci ! seul problème c’est que si je rajoute une ligne dans ma feuille 2 “suivi offres” et que je relance ma macro
il va directement à la case non vide et remet la première ligne et je ne veux pas.
sinon pour mon deuxième code j’ai mis

Range("B17").End(xlDown).Offset(1).Select

mais toujours le problème que si F4 est vide ça ne copie pas toutes les cases non vides de ma plage “F4:F”

Merci beaucoup, j’ai regarder la macro elle est plus propre en effet par contre toujours le même problème si les commerciaux active la macro et souhaite finalement rajouter des choses sur la feuille “suivi offres” et du coup reporter dans “rapport hebdo” si il relance la macro ça va recopier de nouveau des données. j’aimerai vraiment trouver une solution car malgré mon message pop up je sais que ça arrivera. et toujours ce problème sur mon autre macro (problème cité sur mon dernier message) je vais essayer tout de même de la reprendre grâce à la nouvelle macro que tu m’a envoyé vu qu’elle se ressemble.

pour tes remarques 1. les mises en forme conditionnelles j’ai laissé tomber j’en avait au départ 7 (4 différente pour “état des offres” et 3 différentes pour “chance de transformation” mais a chaque fois ça m’en apparaît des nouvelles j’ai lâché prise. une fois mon fichier prêt je referais le point.

Pour les colonnes L,M,N oui je sais :wink: c’est une fonction RECHERCHE V pour les colonnes J ET K a partir de la ligne 19. pour que les données qui sont dans la feuille"note de frais" s’affiche automatiquement. Je les ai mis sur la même feuille pour pas perturbé les commerciaux avec une feuille de donnée et je les ai masqué car la feuille "Rapport hebdo est amenée à être imprimée.

Encore Merci Jacky 67.

Voici ma macro client tout est bon j’ai résolu le problème en me basant sur ta macro ! MERCI

Sub CLIENT()
'Dans la feuille Feuil1
Sheets("Note de Frais").Activate


' Ne pas afficher les lignes dont la colonne B est vide
Range("A3:H52").AutoFilter Field:=6, Criteria1:="<>"


'Selectionner toutes les cellules pleines
Set MaPlage = Range("F4:F" & Range("F52").End(xlDown).Row)

 ' Copier la plage définie
MaPlage.Copy


'Activer la feuille Pilote
Sheets("Rapport hebdo").Activate


 ' Sélectionner la première ligne vide
With Range("B18")                        ' On se base sur la cellule B18.
    If .Offset(1, 0) = "" Then          ' Si la cellule B5 est vide,
        .Offset(1, 0).Select            ' alors on sélectionne la cellule B19,
    Else                                ' sinon,
        .End(xlDown).Offset(1).Select   ' on sélectionne la première ligne sous la dernière ligne non vide.
        End If
        End With


' Copier le contenu du presse-papier, à partir de la cellule selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

' Sortir du mode "Copie"
Application.CutCopyMode = False

'Selectionner la première ligne vide
Range("B22").End(xlUp).Offset(1).Select

' Retirer les filtres dans la feuille "Note de frais"
Sheets("Note de Frais").AutoFilterMode = False
End Sub

Le seul problème pour les deux reste le fait que si je veux actualiser les reports ça me remet à la suite les données existantes.Je voudrais faire en sorte que si la donnée existe déjà il ne la recopie pas, ou mieux il l’a remplace. c’est plus complexe.

Merci en tout cas ça m’enlève une grosse épine du pied :slight_smile:

Ben oui, c’est le principe même de fonctionnement de la macro : recopier toutes les lignes non vides.
C’est d’ailleurs toi qui a demandé de partir de la première ligne non vide du tableau de la feuille “Rapport hebdo” plutôt que de partir systématiquement de la première ligne. :wink:

OK, je comprends, mais en partant du haut de la page, plutôt qu’au-delà de la ligne 100, tu devrais obtenir un fichier un petit peu moins gros.

Est-ce le fichier réel que tu utilises (ou compte utiliser), ou n’est-ce qu’un extrait ?
Edité le 28/02/2017 à 15:05

En effet, c’est le principe mais j’aurai voulu trouver une solution alors pour qu’il puisse cliquez qu’une seul fois car si il clique et qu’il le modifie (et ça peut arriver de modifier le statut d’une offre…) ils ne pourront pas revenir en arrière car la suppression du tableau est bloqué par un code pour qu’il ne puisse pas modifier depuis la feuille 3 mais bien depuis la feuille 2.C’est complexe…
Mais je pense que je vais le garder comme ceci. ou leur laissez accès à la suppression si ils fond une erreur.

Pour mon tableau masqué je vais le mettre plus haut merci.

Oui c’est un fichier qui sera utilisé dès qu’il sera prêt. pourquoi ?

Merci beaucoup pour ton aide ! :wink:

Je ne saisi pas complètement ce que tu veux obtenir au final, ni comment tu veux que tes collègues saisissent leurs données.
En plus tu dis que tu veux leur interdire les modifications, mais tu dis qu’ils peuvent se tromper.

Tu ne comptes pas garder de traces de leurs saisies ?

Bonjour,

Plus d’explications en privé, pour ceux qui liraient et qui auraient besoin d’aide comme moi :
mon fichier est utilisé par les commerciaux et mon directeur commercial pour le suivi des offres, et des rapports de visites.
Pour éviter la double saisie j’ai créer un fichier avec 3 feuilles : note de frais, suivie des offres avec leur état puis un récap de suivi des offres avec aussi un compte rendu visite où je reprend les infos clients(nom adresse département) de la note de frais.

Seul problème c’est que mes macros déclenchent le report des informations et que si les informations de la feuille 1 et 2 sont mises à jour elles le seront pas sur la feuille 3… et si ils cliquent de nouveau sur les macros ça ne se mettra pas à jour mais copiera à la suite des précédentes informations … je pense du coup faire une macro “réactualisation” qui supprimerai les précédente infos et je remet à la suite ma précédente macro.

J’espère avoir été clair.

Jacky67, les fichiers seront consultés et imprimés par les utilisateurs cités plus haut et moi je garde pour chaque semaine les fichiers.

Merci Jacky67 pour ton aide précieuse !:wink:

Voilà j’ai terminé mon fichier j’ai pas eu besoin de recrée une macro j’ai juste ajouté la suppression du tableau existant avant ma macro.

Merci encore Jacky 67 ! voici mes deux macros

Sub rapporter()
Dim MaPlage As Range

 If MsgBox("Avez-vous terminé de remplir le suivi des offres de la semaine avant de valider ?", vbQuestion + vbYesNo, "Opération irréversible. Souhaitez-vous continuez ?") = vbYes Then
        ' TON CODE SI LA REPONSE EST "OUI"
        
         ' SUPPRIMER LES DONNEES PRECEDENTES
        Range("B5:I13").Select
    Selection.ClearContents
        
        
         ' Activer la feuille "Suivi offres"
        Sheets("Suivi offres").Activate
        
        ' Ne pas afficher les lignes dont la colonne B est vide
        Range("A5:I15").AutoFilter Field:=2, Criteria1:="<>"

        ' Définir la plage désirée, c'est-à-dire toutes les lignes affichées
        Set MaPlage = Range("B6:I" & Range("B5").End(xlDown).Row)

        ' Copier la plage définie
        MaPlage.Copy

        ' Activer la feuille "Rapport hebdo"
        Sheets("Rapport hebdo").Activate

        ' Sélectionner la première ligne vide
        With Range("B4")                        ' On se base sur la cellule B4.
            If .Offset(1, 0) = "" Then          ' Si la cellule B5 est vide,
                .Offset(1, 0).Select            ' alors on sélectionne la cellule B5,
            Else                                ' sinon,
                .End(xlDown).Offset(1).Select   ' on sélectionne la première ligne sous la dernière ligne non vide.
            End If
        End With

        ' Copier le contenu du presse-papier, à partir de la cellule selectionnée
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        ' Sortir du mode "Copie"
        Application.CutCopyMode = False

        ' Retirer les filtres dans la feuille "Suivi offres"
        Sheets("Suivi offres").AutoFilterMode = False

End If

End Sub
Sub CLIENT()

     If MsgBox("Avez-vous terminé de remplir les notes de frais de la semaine avant de valider ?", vbQuestion + vbYesNo, "Opération irréversible. Souhaitez-vous continuez ?") = vbYes Then
        ' TON CODE SI LA REPONSE EST "OUI"
        
        
        ' SUPPRIMER LES DONNEES PRECEDENTES
        Range("B19:B40").Select
    Selection.ClearContents
    

'Dans la feuille Feuil1
Sheets("Note de Frais").Activate


' Ne pas afficher les lignes dont la colonne B est vide
Range("A3:H52").AutoFilter Field:=6, Criteria1:="<>"


'Selectionner toutes les cellules pleines
Set MaPlage = Range("F4:F" & Range("F52").End(xlDown).Row)

 ' Copier la plage définie
MaPlage.Copy


'Activer la feuille Pilote
Sheets("Rapport hebdo").Activate


 ' Sélectionner la première ligne vide
With Range("B18")                        ' On se base sur la cellule B18.
    If .Offset(1, 0) = "" Then          ' Si la cellule B5 est vide,
        .Offset(1, 0).Select            ' alors on sélectionne la cellule B19,
    Else                                ' sinon,
        .End(xlDown).Offset(1).Select   ' on sélectionne la première ligne sous la dernière ligne non vide.
        End If
        End With


' Copier le contenu du presse-papier, à partir de la cellule selectionnée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

' Sortir du mode "Copie"
Application.CutCopyMode = False

'Selectionner la première ligne vide
Range("B22").End(xlUp).Offset(1).Select

' Retirer les filtres dans la feuille "Note de frais"
Sheets("Note de Frais").AutoFilterMode = False

End If

End Sub

Bonne journée, et encore merci !:wink:

Désolé, pour moi ce n’est toujours pas très clair quant à l’utilisation, et comme je l’ai dit plus haut c’est toi qui a demandé que le tableau se remplisse à partir de la première ligne vide et non à partir de la première ligne.


[quote="Mathou10"] Voilà j'ai terminé mon fichier j'ai pas eu besoin de recrée une macro j'ai juste ajouté la suppression du tableau existant avant ma macro. [/quote] Ben voilà, ça correspond à ce que je disais : ne pas partir de la première ligne vide, mais partir de la première ligne du tableau.

En revanche, vu que tu parts de la première ligne du tableau, tu n’as plus besoin de rechercher et sélectionner la première ligne vide, il te suffit de toujours coller à partir de la cellule B19. :wink:

Oui pardon c’est compliqué à expliquer et se faire comprendre parfois, :slight_smile: en tout cas je te remercie car ça m’a permis de développer mes connaissances et j’ai pu me pencher sur un fichier que je n’arrivais pas à faire en VGA il y a quelques mois ! merci beaucoup !:slight_smile: