VBA recopier tableau sans lignes vides

Fermé
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007 - 13 févr. 2007 à 14:14
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007 - 16 févr. 2007 à 16:24
Bonjour,

voila mon problème :

j'ai un tableau excel contenant des palges de cellules vides sur une feuille, ces plages étant soumises à une formule conditionelles suivant les entrées d'une feuille précédente.
Ce que j'aimerais obtenir, a laide d'une macro, c'est de recopier les plages remplies sur une autre feuille sans qu'il n'y ai de ligne vides intercalées. (feuille récapitulative).

autre donnée importante c'est que selon l'entrée les plages vides peuvent se remplir.

la macro devrai pouvoir, a chaque fois qu'elle est activée, inserer les les plages vides au bon endroit.

voila un petit schéma de ce que j'aimerais obtenir :

feuille 1
1 ___________
2- - - - - - - - - -
3 ___________
4___________
5 -- - - - - - - -
6 ___________

clic sur macro =>

feuille récapitulative

1 ___________
3__________
3 ___________
4___________
6 ___________

et si plus tard la feuille 1 change, l'activation de la macro devrait faire que :

1 ___________
2___________
3__________
4___________
5 -- - - - - - - -
6 ___________

clic sur macro =>

1 ___________
2___________
3__________
4___________

6 ___________

donc je tiens a remercier d'avance quiconque pourrait m'aider a obtenir ce résultat.
Merci,

10 réponses

ruzakruzak Messages postés 459 Date d'inscription vendredi 9 février 2007 Statut Membre Dernière intervention 31 mai 2007 246
13 févr. 2007 à 16:43
On dirait que tu veux juste faire un tri ! dans ce cas, trie suivant le critère que tu veux avant de te préoccuper du calcul, t'auras déjà un bout de fait...
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
13 févr. 2007 à 16:55
la tableau que je veut recopier se rempli ou pas selon des conditions de remplissage de plusieurs autres feuilles; en fait ce que je veut faire c'est un récapitulatif sans les plages vides de ce tableau qui evolue souvent....pour avoir un "résumé"
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
13 févr. 2007 à 19:27
Bonsoir,

en formule matricielle dans ta feuille RECAP :
A1=SI(ESTERREUR(INDEX(Feuil1!$A$1:$A$10000;PETITE.VALEUR(SI(Feuil1!$A$1:$A$10000<>"";LIGNE(Feuil1!$A$1:$A$10000));LIGNE())));"";INDEX(Feuil1!$A$1:$A$10000;PETITE.VALEUR(SI(Feuil1!$A$1:$A$10000<>"";LIGNE(Feuil1!$A$1:$A$10000));LIGNE())))
à recopier vers le bas aussi loin que nécessaire.

cordialement
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
14 févr. 2007 à 09:23
Merci pour l'aide, mais la formule ne recopie que la première ligne du tableau, quand je la fait glisser vers le bas les plages remplis ne sont pas recopiées...

si quelqu'un aurait une solution pour mon problème soit par formule excel soit sous forme de macro ca serait bien sympatique de m'éclairer...
^^,

cordialement
jefe.k
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
14 févr. 2007 à 11:23
Bonjour,

cette formule fonctionne très bien et pas seulement sur la première ligne.

as-tu intégré que c'est une formule matricielle?

A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
14 févr. 2007 à 11:44
bonjour,

non je n'ai pas intégré cet état de fait j'ai recopier la formule dans la première cellule de m'a feuille récap puis j'ai fait glisser ma formule...

que change le fait qu'il s'agisse d'une formulle matricielle ?
que dois je faire pour que cela marche ?

merci,

@+ ^^
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
14 févr. 2007 à 12:00
Re,

en fait j'ai trouvé pour intégrer le fait qu'il s'agisse d'une formule matricielle...

maintenant cela marche effectivement, mais les cellules vides affiche la valeur O comment faire pour les cacher ?
et cette formulle peut elles s'étendre sur plusieurs colonnes ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
14 févr. 2007 à 12:47
Bonjour,

curieux ces zéros. pas de zéros chez moi!!!
d'autant plus que j'ai surchargé la formule afin qu'elle affiche "" si plus de données.

pour afficher la colonne B (si en A il y a une donnée ):
=SI(ESTERREUR(INDEX(Feuil1!$A$1:$A$10000;PETITE.VALEUR(SI(Feuil1!$A$1:$A$10000<>"";LIGNE(Feuil1!$A$1:$A$10000));LIGNE())));"";INDEX(Feuil1!$B$1:$B$10000;PETITE.VALEUR(SI(Feuil1!$A$1:$A$10000<>"";LIGNE(Feuil1!$A$1:$A$10000));LIGNE())))
si les zéros ne partent pas, envoie le fichier (sur cjoint.com par exemple)

A+

PS : attention au fait que les formules matricielles sont lourdes et coûteuse en temps de calcul.
si tu as beaucoup de cellules dans ta feuille, il faudra sans doute envisager d'autres solutions
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
14 févr. 2007 à 14:48
ce qu'il y a c'est que j'aimerais pouvoir effectuer cette action sur un nombre important de lignes et de colonnes.

peut on rentrer une plage de ligne et de colonnes a la place des

$a$1:$a$100000

cela est il possible ?

merci,
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
14 févr. 2007 à 17:06
Re,

tu sélectionnes A1:Q1 par exemple et tu saisis

=SI(ESTERREUR(INDEX('Phase 1'!$A$1:$A$10000;PETITE.VALEUR(SI('Phase 1'!$A$1:$A$10000<>"";LIGNE('Phase 1'!$A$1:$A$10000));LIGNE())));"";INDEX('Phase 1'!$A$1:$Q$10000;PETITE.VALEUR(SI('Phase 1'!$A$1:$A$10000<>"";LIGNE('Phase 1'!$A$1:$A$10000));LIGNE());COLONNE())&"")

en matriciel (on pourrait dire double matricielle puisque à la fois le calcul et la restitution sont en matriciel)
j'ai mis en gras ce que j'ai modifié

A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
15 févr. 2007 à 08:44
bonjour,

cette formule a l'air de marcher mais est vraiment trait lourde en temps vu la plage de donnée que je veux recopier,

de plus serait il possible de n'entamer cette recopie qu'a partir de la ligne 6, par exemple ?

une programmation en visual basic ne serai elle pas plus adaptée à ce que je voudrai faire ?

cordialement,
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
15 févr. 2007 à 09:10
Bonjour,

la formule marche-t-elle ou a-t-elle l'air de marcher?

combien de lignes/colonnes veux-tu traiter?

quels temps de réponse as-tu? (en secondes par ex)

il est possible de commencer à la ligne 6 en changeant les $A$1 à l'intérieur des PETITE.VALEUR( ) par $A$6

il est possible(probable) que du code VBA soit plus performant, il faudrait essayer.

d'après ton 1er post, tu n'as pas besoin de mettre à jour la feuille archive en temps réel.
Dans ce cas, tu passes en mode recalcul manuel et tu ne lances une mise à jour de la feuille archive qu'avec un recalcul (via la touche F9)
tu limites ainsi la lourdeur des formules matricielles aux recalculs que tu lances.

A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
15 févr. 2007 à 09:29
bonjour,

je veux traiter genre une centaines de lignes et de colonnes,

rien que pour 6 colonnes et 90 lignes le temps de réponses est de l'ordre de 3/4 min.

je pense qu'avec un code vba ce que je veux faire demandrai moin de calcul ce qu'il y a c'est que j'ai très peu de notion visual basic et que je ne sais pas comment me diriger....

@+
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
15 févr. 2007 à 13:23
Bonjour,

bizarre, chez moi ça prend 1 seconde, ce qui est quand même gênant et modérément acceptable.

pour ce qui est de VBA, essaye ce code :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row > 5 And Target.Row < 106 Then
    j = 1
    For i = 6 To 105
        If Range("A" & i).Value <> "" Then
            Range("A" & i & ":CV" & i).Copy Destination:=Worksheets("archive").Range("a" & j)
            j = j + 1
        End If
    Next
    Application.CutCopyMode = False
End If
End Sub
c'est une macro évènementielle à mettre donc derrière la "feuil1" (celle de la saisie).
pour accéder à VBA directement derrière la "feuil1", fais un "clic droit/visualiser le code" sur l'onglet de la "feuil1".
ensuite, tu colles le code ci-dessus

je l'ai limité aux lignes 6 à 105 et aux colonnes Aà CV pour correspondre à tes 100 lignes x 100 colonnes

A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
15 févr. 2007 à 14:53
j'ai essayé mais ma feuille récap reste vide...

quand j'ai rentré la selection à copier :

Range("A" & i & ":CV" & i).Copy

visual basic me renvoi un message d'erreur, j'ai donc remplacé la formule par celle ci :

Range("A" & i & ,"CV" & i).Copy

ai je bien fait ? ou est ce la cause de ma page blanche,

merci pour toute cette aide, c'est fort sympatique

A+
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
15 févr. 2007 à 15:17
Re,

il faut laisser le ":" dans le range.

ta feuille "récap", je l'ai appelée "archive" dans la macro. modifie le nom

il serait bon de rajouter la ligne :

Worksheets("archive").Rows("" & j & ":" & Worksheets("archive").Range("A65536").End(xlUp).Row & "").ClearContents

juste après le NEXT pour gérer l'effacement des lignes devenues inutiles dans archive/récap

A+

PS : as-tu fais un copier/coller du code ? ou l'as-tu recopié?
la largeur de l'écran introduit des retours à la ligne qui n'ont pas lieu d'être et qu'un copier/coller remet dans l'ordre
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
15 févr. 2007 à 15:54
j'avais retaper la source et j'avai bien changé le nom..

je vais essayé voir si cela marche, merci

a+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
15 févr. 2007 à 16:38
tjs aucun effet sur ma deuxième feuille...
et tjs l'erreur au niveau du range "a" ":cv"

message d'erreur : problème sur le sépartaeur de liste...


c bien sur ma première feuille que je dois taper la source ?
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
15 févr. 2007 à 16:48
fais un copier/coller du code que tu as saisis en réponse.

sinon on va tourner en rond.

j'espère seulement que tu n'as pas retapé le texte mais que tu as bien fait un copier/coller du code du message (je ne sais plus trop lequel d'ailleurs) mais je te le remet ci dessous :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row > 5 And Target.Row < 106 Then
    j = 1
    For i = 6 To 105
        If Range("A" & i).Value <> "" Then
            Range("A" & i & ":CV" & i).Copy Destination:=Worksheets("archive").Range("a" & j)
            j = j + 1
        End If
    Next
    Worksheets("archive").Rows("" & j & ":" & Worksheets("archive").Range("A65536").End(xlUp).Row & "").ClearContents
    Application.CutCopyMode = False
End If
End Sub
A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007 > JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020
16 févr. 2007 à 08:58
quand je fait un copier coller de ce code sur ma première feuille
il ne se passe rien sur ma feuille archive...

il suffit pourtant de le coller avec l'action visualiser le code ? et de le coller tout simplement dans la fenêtre qui s'ouvre. non ?

a+
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
16 févr. 2007 à 09:28
bonjour,

oui, c'est ce qu'il faut faire.

envoie ton fichier sur cjoint.com que je regarde.

ça doit être un truc tout bête.

A+
0
jefe.k Messages postés 14 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 16 février 2007
16 févr. 2007 à 16:24
merci pour tout,

j'ai trouvé de l'aide sur un autre forum et le résultat qui en est sortit marche bien aussi...

pour plus d'information https://www.developpez.net/forums/d280312/logiciels/microsoft-office/excel/macros-vba-excel/vba-e-recopier-tableau-supprimant-plages-vides/

merci encore pour toute cette réflexion et cette attention apportée à mon problème.
a bientot
0