conserver lignes et colonnes non vides d'un tableau

elido

XLDnaute Nouveau
Bonjour

Voici mon problème. J'ai un fichier avec un tableau récapitulatif avec + de 50 colonnes et 100 lignes. Dans ce tableau certaines colonnes et lignes non adjacentes peuvent être vides ou pas.

Je voudrais épurer ce tableau sur un nouvel onglet de façon à ne garder que les lignes non vides. Je crois qu'il faudrait utiliser une fonction genre INDEX, EQUIV, ou quelque chose comme ça mais je ne les maitrise pas du tout et tous les exemples vus par ailleurs ne me parlent pas !!

Quelqu'un peut-il m'aider ?? Merci pour votre aide

Elido
 

Pièces jointes

  • Aide panier.xlsx
    17.4 KB · Affichages: 51

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir elido,

Les formule sont sur les feuilles clients:

Il y a une formule pour chaque cellule B2:
Code:
=STXT(CELLULE("filename";A1);TROUVE("]";CELLULE("filename";A1))+1;99)

Une formule matricielle pour la cellule A3 à tirer vers le bas jusqu'à A40 (au choix en fonction du max de ligne possible pour un panier):
Code:
=SIERREUR(INDEX(récap!$A$1:$A$40;    PETITE.VALEUR(SI(ESTNUM(DECALER(récap!$A$1:$A$40;0;1)); SI( ESTNUM(DECALER(récap!$A$1:$A$40;0;EQUIV($B$2;récap!$A$2:$G$2;0)-1));LIGNE(DECALER(récap!$A$1:$A$40;0;1))));LIGNES($A$3:A3)));"")

Et une autre formule matricielle pour la cellule B3 à tirer vers le bas jusqu'à B40 (au choix en fonction du max de ligne possible pour un panier):
Code:
=SIERREUR(INDEX(DECALER(récap!$A$1:$A$40;0;EQUIV($B$2;récap!$A$2:$G$2;0)-1);    PETITE.VALEUR(SI(ESTNUM(DECALER(récap!$A$1:$A$40;0;1)); SI( ESTNUM(DECALER(récap!$A$1:$A$40;0;EQUIV($B$2;récap!$A$2:$G$2;0)-1));LIGNE(DECALER(récap!$A$1:$A$40;0;1))));LIGNES($A$3:A3)));"")

Une mise en forme conditionnelle sur chaque zone A3:B40 complète le dispositif pour les encadrements et la couleur des cellules.



Formule matricielle: Elle doit être validée par la combinaison des touches Ctrl+Maj+Entrée au lieu de la seule touche Entrée comme une formule classique.
Si la validation matricielle est correcte, alors Excel entoure la formule d'accolades {=.......}.
Chaque fois que cette formule sera modifiée, la validation devra se faire par Ctrl+Maj+Entrée. Les accolades apparaissent à la validation et ne doivent pas être saisies au clavier.
 

Pièces jointes

  • elido-Aide panier-v1.xlsx
    30 KB · Affichages: 64
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Re,

Une version améliorée qui s'adapte aux dimensions du tableau Recap et qui supprime une anomalie quand une ligne du tableau est vide.

Deux noms dynamiques ont été créés:
Articles :
Code:
=DECALER(récap!$A$1;0;0;EQUIV("zzz";récap!$A:$A;1);1)
Clients :
Code:
=DECALER(récap!$A$2;0;0;1;EQUIV("zzz";récap!$2:$2;1))

les formules matricielles deviennent:
Code:
=SIERREUR(INDEX(Articles;PETITE.VALEUR(SI(ESTNUM(DECALER(Articles;0;1)); SI(ESTNUM(DECALER(Articles;0;EQUIV($B$2;Clients;0)-1));LIGNE(DECALER(Articles;0;1))));LIGNES($A$3:A3)));"")
Code:
=SIERREUR(INDEX(DECALER(Articles;0;EQUIV($B$2;Clients;0)-1);PETITE.VALEUR(SI(ESTNUM(DECALER(Articles;0;1)); SI(ESTNUM(DECALER(Articles;0;EQUIV($B$2;Clients;0)-1));LIGNE(DECALER(Articles;0;1))));LIGNES($A$3:A3)));"")

La formule du total de ligne a été légèrement modifiée.
 

Pièces jointes

  • elido-Aide panier-v2.xlsx
    31 KB · Affichages: 66

elido

XLDnaute Nouveau
Re : conserver lignes et colonnes non vides d'un tableau

Merci mapomme pour le boulot c'est exactement ce que je cherche !

Maintenant est-ce trop te demander de m'expliquer pas à pas le détail des formules.

Le tout cuit c'est bien mais je voudrais aussi comprendre le sens car je n'ai jamais utiliser ERREUR, INDEX, EQUIV...
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir Elido,

Merci mapomme pour le boulot c'est exactement ce que je cherche !

Maintenant est-ce trop te demander de m'expliquer pas à pas le détail des formules.

Le tout cuit c'est bien mais je voudrais aussi comprendre le sens car je n'ai jamais utiliser ERREUR, INDEX, EQUIV...

Non, ce n'est pas trop me demander mais pas avant demain dans la soirée car ce soir c'est libation :p.
 

elido

XLDnaute Nouveau
Re : conserver lignes et colonnes non vides d'un tableau

Ma pomme
Pourrais-tu à nouveau m'aider stp.

Avec le fichier de ta version améliorée, "filename" fait référence au nom de l'onglet dans cette formule : =STXT(CELLULE("filename";A1);TROUVE("]";CELLULE("filename";A1))+1;99)
Peut-on faire référence à une autre cellule dans l'onglet "récap" ? En fait après réflexion je voudrais regrouper dans le même onglet le panier sous forme ticket (donc sans les lignes vides) et pour plusieurs clients.

Merci de ton aide
Elido
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir elido,

Ma pomme
Pourrais-tu à nouveau m'aider stp.

Avec le fichier de ta version améliorée, "filename" fait référence au nom de l'onglet dans cette formule : =STXT(CELLULE("filename";A1);TROUVE("]";CELLULE("filename";A1))+1;99)
Peut-on faire référence à une autre cellule dans l'onglet "récap" ? En fait après réflexion je voudrais regrouper dans le même onglet le panier sous forme ticket (donc sans les lignes vides) et pour plusieurs clients.

Merci de ton aide
Elido

Excuse moi :eek: car j'avais mis ton message de côté et j'ai oublié d'y revenir. Peux-tu fournir un exemple de présentation de la feuille "récap" avec plusieurs clients pour avoir une idée de ce que tu désires ? J’essaierai de joindre également les explications des formules.
 

elido

XLDnaute Nouveau
Re : conserver lignes et colonnes non vides d'un tableau

Merci à nouveau de ton aide.

Je remet mon fichier avec la présentation attendue et bien entendu je suis toujours d'accord pour l'explication des formules.
 

Pièces jointes

  • elido-Aide panier-v3.xlsx
    33.4 KB · Affichages: 50

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir,
(...) Je remet mon fichier avec la présentation attendue et bien entendu je suis toujours d'accord pour l'explication des formules.

Une p'tite question : voulez-vous imprimer un client par feuille ou bien tous les clients à la suite (avec possibilité dans ce cas cas d'avoir plusieurs clients sur la même feuille) ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir elido,

Une autre version avec un peu de VBA. La feuille Data comprend la base de données des produits (avec un type et une famille) et la base des clients. les boutons en ligne 1 servent à faire des tris. J'ai fait cette base pour préserver l'avenir car ton projet semble évolutif. Cette base sert à alimenter la feuille de saisie des produits et quantités des client sur la deuxième feuille. Les feuilles 3 et 4 font un bilan par client et par produit des commandes.

rem : sur la feuille de saisie des commandes, un double-clique sur une cellule recopie la valeur de la cellule juste au dessus pour faciliter la saisie.
 

Pièces jointes

  • elido-Aide panier-v3a.xlsm
    87.5 KB · Affichages: 54
Dernière édition:

elido

XLDnaute Nouveau
Re : conserver lignes et colonnes non vides d'un tableau

Bonjour Mapomme

Merci pour le travail que tu as fait mais hélas il ne correspond pas à mes besoins, peut-être dans un second temps...

Je reviens un peu sur l'histoire de mon fichier et je t'explique le fonctionnement.
Tu as compris qu'il s'agit de faire un panier de produits (locaux). Toutes les semaines j’envoie au groupe de personnes (50 noms actuellement) ce fichier avec un lien internet sur ExcelOnline. Chaque personne enregistre directement sa commande sur sa feuille personnelle et celle-ci est comptabilisée dans le tableau "récap commandes".
Dans un premier temps j'avais fait un fichier avec macro vba mais avec Online ça ne marche pas d'où ma demande de ne pas utiliser le VBA.

Aujourd'hui je voudrais donc comme précisé dans ma demande de départ avoir un récapitulatif du panier sur une nouvelle feuille seulement pour les gens qui ont passé commande.

Je joint mon fichier actuel allégé (j'ai laissé 1 dizaine de personnes).

Merci encore de ton aide

Elido
 

Pièces jointes

  • Panier Local v.23 mars.xlsx
    230.1 KB · Affichages: 51

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonjoue elido,

Je comprends mieux le pourquoi. Je vais réfléchir pour pour voir comment faire. Je serai peut-être amené à utiliser une feuille ou des colonnes auxiliaires. Je ne pense pas que ça puisse gêner ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir Elido,

Voici un fichier sans aucune macro. Il faudra vérifier les résultats. Je l'ai fait mais il vaut mieux revérifier.

Dans la liste des prix, j'ai rajouté à gauche des tableaux une colonne "Indic" avec une formule qui renvoie un "x" si la ligne comporte à la fois un nom de produit et une unité de produit. La formule retourne "" sinon.
Cet indicateur est utilisé dans les formules de la feuille "récap panier". Elle sert à distinguer au sein de la feuille "récap commandes" les 'vraies' lignes produits des autres lignes (notamment les lignes comportant des totaux et totaux partiels que vous avez saisis).

La liste des clients est saisie manuellement dans les cellules F1 à BC1 sur la feuille "récap commandes". Il existe une méthode pour lister les onglets avec un nom défini à l'aide d'une macro Excel 4 (mais on y a pas droit :(). Les noms doivent être identiques strictement au nos de chaque onglet client.

La feuille "récap commandes" a été un tout petit peu remaniée afin de rajouter aux tableaux une colonne à gauche qui est la recopie des colonnes "indic" des tableaux de prix. Les formules de ce tableau utilisent la fonction INDIRECT pour aller rechercher dans le bon onglet les quantités de chaque client.

C'est ensuite, à partir de la feuille "récap commandes" qu'on va élaborer les tableaux récapitulatifs de chaque client sur la feuille "récap panier". il y a trois principales formules :

Une formule pour récupérer les noms des clients en B3:
VB:
[SIZE=1]=DECALER('récap commandes'!$F$1;0;(COLONNE()-2)/3)[/SIZE]

Une formule matricielle pour récupérer les produits à quantité >0 pour le client (à valider par Ctrl+Maj+Entrée) en A4 :
VB:
[SIZE=1]=SI(B$3=0;"";SIERREUR(INDEX(cmde_produit;-6+PETITE.VALEUR(SIERREUR(1/(1/(N((SIERREUR((cmde_indic="x")*(DECALER(cmde_indic;0;4+EQUIV(B$3;cmde_client;0)));0)>0))*LIGNE($A$7:$A$200)));"");LIGNES($1:1)));""))[/SIZE]

Une formule matricielle pour récupérer les quantités >0 pour le client (à valider par Ctrl+Maj+Entrée) en B4 :
VB:
[SIZE=1]=SI(A4=0;"";SIERREUR(INDEX(DECALER(cmde_indic;0;4+EQUIV(B$3;cmde_client;0));-6+PETITE.VALEUR(SIERREUR(1/(1/(N((SIERREUR((cmde_indic="x")*(DECALER(cmde_indic;0;4+EQUIV(B$3;cmde_client;0)));0)>0))*LIGNE($A$7:$A$200)));"");LIGNES($1:1)));""))[/SIZE]

Une Mise en Forme Conditionnelle est ensuite appliquée sur la cellule A4, une deuxième sur la cellule B4.

Les deux formules matricielles (A4 et B4) sont ensuite tirées/copiées vers le bas jusqu'à la ligne 50.

On recopie ensuite les colonnes A à C sur les colonnes D à ET pour arriver aux 50 clients potentiels.

Une MFC sur les cellules A4 à ES50 vient compléter la mise en forme.

NB: Des noms ont été définis:
cmde_client='récap commandes'!$F$1:$BC$1liste des clients
cmde_indic='récap commandes'!$A$7:$A$200colonne des "Indic"
cmde_produit=DECALER(cmde_indic;0;1)colonne des produits
cmde_qte=DECALER(cmde_indic;0;4)colonne des quantités






Limitations :
la dernière ligne des produits est la ligne 200 sur la feuille "récap commandes".
On considère un max de 50 clients.

Rem :
Pour ajouter un client, il suffit de dupliquer une feuille client existante, de la renommer avec le nom du nouveau client puis d'aller saisir ce nom à l'identique dans la première cellule vide de la plage F1:BC1 sur la feuille "récap commandes".
 

Pièces jointes

  • Panier Local v.25 mars.xlsx
    391.4 KB · Affichages: 44
Dernière édition:

klin89

XLDnaute Accro
Re : conserver lignes et colonnes non vides d'un tableau

Bonsoir elido, mapomme, le forum :)

Avec le fichier joint du post #8 :
Résultat dans la feuille "paniers"
VB:
Option Explicit

Sub Paniers()
Dim myAreas As Areas, w(), n As Long, y, x As Byte, w2 As Long
Dim i As Long, j As Long, k As Long
    Application.ScreenUpdating = True
    With Sheets("récap")
        On Error Resume Next
        Set myAreas = .Columns("A").SpecialCells(2).Areas
        On Error GoTo 0
    End With
    If Not myAreas Is Nothing Then
        With CreateObject("Scripting.Dictionary")
            .CompareMode = 1
            For i = 1 To myAreas.Count
                If myAreas(i).Rows.Count > 1 Then
                    For j = 3 To myAreas(i).CurrentRegion.Columns.Count
                        If Not .exists(myAreas(i)(1, j).Value) Then
                            ReDim w(1 To 2, 1 To Application.CountA(myAreas(i).Columns(j)))
                            w(1, 1) = "Panier du client"
                            w(2, 1) = myAreas(i)(1, j).Value
                            If Application.CountA(myAreas(i).Columns(j)) > 1 Then
                                For k = 2 To myAreas(i).Rows.Count
                                    If myAreas(i)(k, j).Value <> "" Then
                                        x = x + 1
                                        w(1, x + 1) = myAreas(i)(k, 1).Value
                                        w(2, x + 1) = myAreas(i)(k, j).Value
                                    End If
                                Next
                            End If
                            .Item(myAreas(i)(1, j).Value) = w
                            x = 0
                        Else
                            w = .Item(myAreas(i)(1, j).Value)
                            w2 = UBound(w, 2)
                            If Application.CountA(myAreas(i).Columns(j)) > 1 Then
                                ReDim Preserve w(1 To 2, 1 To UBound(w, 2) + Application.CountA(myAreas(i).Columns(j)) - 1)
                                For k = 2 To myAreas(i).Rows.Count
                                    If myAreas(i)(k, j).Value <> "" Then
                                        x = x + 1
                                        w(1, w2 + x) = myAreas(i)(k, 1).Value
                                        w(2, w2 + x) = myAreas(i)(k, j).Value
                                    End If
                                Next
                                .Item(myAreas(i)(1, j).Value) = w
                                x = 0
                            End If
                            w2 = 0
                        End If
                    Next
                End If
            Next
            y = .items
        End With
        With Sheets("paniers")
            .Cells.Clear
            For i = 0 To UBound(y)
                If UBound(y(i), 2) > 1 Then
                    With .Cells(n + 1, 1)
                        .Resize(UBound(y(i), 2), UBound(y(i), 1)).Value = Application.Transpose(y(i))
                        With .CurrentRegion
                            With .Rows(1)
                                .Font.Bold = True
                                .Interior.ColorIndex = 36
                                .BorderAround Weight:=xlThin
                            End With
                            .Borders(xlInsideVertical).Weight = xlThin
                            .BorderAround Weight:=xlThin
                        End With
                    End With
                    n = n + UBound(y(i), 2) + 1
                End If
            Next
            With .Columns(1).Resize(, 2)
                .Font.Name = "calibri"
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .AutoFit
            End With
            .Activate
        End With
        If n = 0 Then MsgBox "Pas de paniers en commande"
    End If
    Application.ScreenUpdating = True
End Sub
klin89
 

Pièces jointes

  • Paniers.xls
    66.5 KB · Affichages: 40
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 097
Messages
2 085 256
Membres
102 839
dernier inscrit
Tougtoug