Problème de tableau, indice n'appartient pas à la sélection

Calvus

XLDnaute Barbatruc
Bonsoir le Forum,

Des heures que je me prends la tête avec un @#{#::^@ de tableau !
Mais quelque chose m'échappe.

Dans le fichier joint, ce que je souhaite obtenir, c'est la valeur Max d'un tableau après avoir calculé un CA avec Sumif :
Code:
ca = Format(Application.SumIfs([P:P], [B:B], nom, [N:N], ">=" & date1), "# ##0.00")     'CA année N

C'est après que les problèmes commencent, lorsque je veux créer un tableau pour comparer ces valeurs.
Sachant que je n'ai pas eu plus de succès avec un dictionnaire...

Et après, je voudrais extraire les seconde, troisième et quatrième valeurs.

Merci de votre aide.
 

Pièces jointes

  • Macro Max.xlsm
    17.6 KB · Affichages: 39

Si...

XLDnaute Barbatruc
Bonjour

Calvus, toujours à la peine avec tous tes tableaux :oops: ?

Pour le Tableau de la feuille, comme il peut être déplacé, il vaut mieux utiliser les titres des colonnes (ou les index de ses colonnes).

Pour te donner le change, je t’ai mis 2 types de tableaux (array) dans la macro.

Bon week-end à tous
 

Pièces jointes

  • Somme.Si.Ens_ Tableau.xlsm
    20.5 KB · Affichages: 34

Calvus

XLDnaute Barbatruc
Bonsoir Dranreb, Si, le Forum,

Tout d'abord, merci de vos réponses.

J'ai pris connaissance de vos messages hier soir, puis ai passé une très grande partie de la nuit à comprendre ce qui n'allait pas.
Donc, plusieurs remarques, avant la conclusion finalement heureuse !

@Dranreb, je n'ai pas trop avancé avec ton fichier car le code est encore beaucoup trop ardu pour moi. Néanmoins, cela me permet de déterminer la logique de procédure.

@Si, au contraire, parfois à trop simplifier, cela devient également incompréhensible, mais je commence à te comprendre. Et en réalité, ton code m'a permis de comprendre ce qui manquait dans le mien, qui fonctionnait, et parfaitement en fait, contrairement à ce que j'annonçais en post 3 ! J'avais mal lu une valeur, et c'est la suite réellement qui manquait, à savoir comment déterminer les 4 plus grandes valeurs, question à laquelle vous n'avez pas répondu. Mais ce n'est pas grave, c'est en forgeant....

C'est ce qui m'a pris toute la nuit.

Et maintenant, pour l’anecdote : (Vous pouvez donc zapper pour ceux que ça n'intéresse pas)

Ce matin donc, mal réveillé mais sentant que je n'étais pas loin, j'ai bataillé de 10h à midi, et miracle ! je trouve la solution. Tout content, je sauvegarde en écrasant le fichier, ce que je ne fais jamais habituellement.
Et va savoir ce qu'il s'est passé Charles, bug !!!!!
Impossible de savoir pourquoi, ni comment, et si j'ai effacé quelque chose par mégarde. Toujours est il que la galère a recommencé. Dimanche de m..... !
Mais comme je ne suis pas du genre à lâcher facilement, frustré et en colère, j'ai lu et relu, fait et refait.
Nouveau miracle ! Je trouve à nouveau un code qui me donne ce que je cherche, et ce après plusieurs tests.
Même si cela m'a pris au moins une quinzaine d'heures, ce n'est pas grave, ma frustration a disparu !
Et dernière libération, c'est d'écrire ces quelques mots, destinés à éviter l'explosion ! :D

Alors, même s'il est imparfait et certainement améliorable, je livre le code durement acquis.

VB:
Dim f As Worksheet, mondico, BD(), tablo                    'Création du dico et alimentation du combobox
Set f = ActiveSheet
Set tablo = f.Range("B3:B" & f.Range("B" & Rows.Count).End(3).Row)
BD = tablo.Value
Set mondico = CreateObject("Scripting.Dictionary") 'Combobox1, Société
    mondico.CompareMode = vbTextCompare
        For i = LBound(BD) To UBound(BD)
            If Not mondico.Exists(BD(i, 1)) Then mondico(BD(i, 1)) = ""
        Next
Me.ComboBox1.List = mondico.keys


Dim d
Set d = CreateObject("Scripting.Dictionary")                'Dictionnaire pour éliminer les doublons du CA
    d.CompareMode = vbTextCompare
        For i = 2 To UBound(BD)
ca = Format(Application.SumIfs([J:J], [B:B], Cells(i, 2), [H:H], "<" & date1), "# ##0.00")
d.Add ca, i
Next

Dim t                                                               'Tableau remplissage CA
derlig = Range("A" & Rows.Count).End(xlUp).Row
t = Range("B2:B" & derlig).Rows
For i = 2 To UBound(t)
ca = Format(Application.SumIfs([J:J], [B:B], Cells(i, 2), [H:H], "<" & date1), "# ##0.00")
t(i, 1) = ca
Next
  
For i = 1 To UBound(t)                                              'Affectation des valeurs aux labels
      If t(i, 1) = Application.Large(d.keys, 1) Then
        Label45 = " " & Cells(i, 2): End If
      If t(i, 1) = Application.Large(d.keys, 2) Then
        Label46 = " " & Cells(i, 2): End If
      If t(i, 1) = Application.Large(d.keys, 3) Then
        Label47 = " " & Cells(i, 2): End If
      If t(i, 1) = Application.Large(d.keys, 4) Then
        Label48 = " " & Cells(i, 2):  End If
Next

Voili voilou :)

Bonne soirée, et merci.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
le code est encore beaucoup trop ardu pour moi. Néanmoins, cela me permet de déterminer la logique de procédure.
Ben oui, c'est le but ! il ne reste plus dans la partie applicative de la programmation que l'algorithme qui suit la logique d'établissement du résultat. Tout le travail préparatoire de classement approprié et de regroupements sur le ou les critères voulus est assumé par la fonction Gigogne qui est dans un module de service, et dont la complexité n'a pas plus d'importance que celle, certainement considérablement plus grande de la programmation de la bibliothèque Excel par exemple.
Je comprends d'autant moins qu'une procédure de moins de 20 lignes paraisse ardue…
 

Calvus

XLDnaute Barbatruc
Je comprends d'autant moins qu'une procédure de moins de 20 lignes paraisse ardue…
Mais Dranreb, je ne suis pas informaticien moi, contrairement à toi, qui l'es depuis 40 ans.
Je fais donc de mon mieux, mais ce qui te parait comme évident ne l'est pas forcément.
Voir des centaines de lignes qui se succèdent sans comprendre un bas mot de ce qu'il se passe est loin d'être évident.
Alors je ne dis pas que ce n'est pas bien, ni efficace, ni agréable d'avoir une telle aide avec un fichier qui fonctionne in fine, je dis simplement que ce n'est pas facile pour quelqu'un qui tente de comprendre pour progresser.
Vous êtes quelques uns sur le site, éminemment forts, mais manquez parfois de pédagogie.
Alors si tu veux prendre la peine de m'expliquer comment fonctionne ton code, je suis preneur, avec plaisir.
 

Dranreb

XLDnaute Barbatruc
J'explique du mieux que je peux comment doit fonctionner le code qu'on veut écrire dans son application. Essayer de comprendre comment s'y prend la fonction Gigogne pour établir la collection qu'il faut pour ça c'est aussi inutile, voire interdit, que de vouloir comprendre comment la méthode Range s'y prend pour communiquer avec l'image en mémoire d'une cellule dans une feuille d'un classeur Excel. Tout ce que vous vous avez à savoir pour utiliser celle ci c'est que pour qu'elle renvoie un objet Range valide il faut lui spécifier en paramètre une expression String représentant une adresse de cellule valide ou un nom. Ben là c'est pareil. Les explications se concentrent donc seulement sur les règles de paramétrage nécessaire à l'utilisation de la fonction. Sa programmation interne ne vous regarde pas plus que si elle vous était purement et simplement inaccessible. C'est, et ça doit rester, une grosse boîte noire, qu'une absence totale, parfaitement voulue, de commentaire décourage délibérément d'essayer de comprendre.
Du moins dans le cadre de la démarche consistant à établir une programmation applicative qui va l'utiliser.
En dehors de ce cadre, si c'est par curiosité, bien sûr, je veux bien vous expliquer comment elle s'y prend si vous y tenez. Que voudriez vous savoir exactement ?
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re

« @Si, au contraire, parfois à trop simplifier, cela devient également incompréhensible, mais je commence à te comprendre … » :cool:

A partir du moment où j’ai pris une nouvelle version d’Excel (siècle dernier) je me suis mis au goût du jour. Je ne me vois pas reprendre les anciens modèles de syntaxe donc j'en propose de nouveaux.;) comme dans le nouvel exemple.
Pour faire simple je n'ai pas rajouté les noms dans le tri (tu l'as fait:)).
 

Pièces jointes

  • Somme.Si.Ens_Tableau et Tri.xlsm
    22.8 KB · Affichages: 28

Calvus

XLDnaute Barbatruc
Bonsoir,

@Dranreb : Je vais regarder de plus près le fonctionnement et vous dirai tous les points qui sont du chinois. Attendez vous à ce qu'il y en ait beaucoup ! :D Mais oui, ça m'intéresse.

@Si : J'ai compris que tu veux que je déprime, mais je m'accroche. Tu aurais au moins pu noter les progrès !;). Et ne compte pas sur moi pour m'arracher les cheveux, je vais décortiquer ton code également !
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Dans les très grandes lignes, la fonction Gigogne fait 5 choses :
1) — Elle interprète les paramètres en rangeant dans des variable globales Private du module les données et les numéros de colonnes critères de classement et de regroupement,
2) — Elle fait IndexerParFusions sur ces données et ces colonnes,
3) — Elle amorce la phase suivante par un ultime positionnement initial,
4) — Elle renvoie la collection fabriquée par une autre fonction, SousGroupes, récursive celle là, qui renvoie, non seulement cette collection, mais aussi, pour son propre usage, les collections à ranger dans les propriétés Co des objets SsGr qui la composent, et aussi éventuellement de ceux qui composent à leurs tours ces collections là.
5) — Elle libère les ressources utilisées pour tout ce qui précède.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Alors, les questions pour approfondir le sujet ne fusent pas tant que ça en fin de compte, malgré ma présentation générale du poste précédent que j'estimai bon point de départ ?
Ce n'était pourtant sûrement pas suffisant pour comprendre tout seul le détail du reste, si ?
Y aurais je par hasard livré un indice essentiel, non vraiment important en soi, mais qui aurait le mérite d'éviter les questions qu'il n'y a pas lieu de se poser ?
Ou est-ce tout simplement parce que les commentaires guides d'utilisation sont finalement suffisants, à partir du moment où on a compris l'importance de les étudier attentivement ?
Remarque: je me suis aperçu qu'ils ne sont pas complet. Il n'y a aucun détail sur les diverses formes acceptées du paramètre PlageOuTableau. Ce sera réparé dans ma prochaine version du module MGigogne.
 

Calvus

XLDnaute Barbatruc
Bonsoir Dranreb,

Pas du tout.
C'est simplement que je n'ai pas eu le temps de regarder ça à tête reposée.
Je pense pouvoir le faire demain soir, et reviendrai avec mon lot de questions.
Merci en tout cas pour cette première présentation.
A bientôt
 

Calvus

XLDnaute Barbatruc
Bonsoir Dranreb, le forum,

Je viens de passer un bon moment sur votre code, et je suis impressionné de voir tous ces sauts d'une fonction à une autre, avec un résultat très rapide quand on l'exécute intégralement.
J'ai également lu et relu vos indications du post 25, néanmoins cela reste très ardu pour mon faible niveau, ce même en lisant attentivement les commentaires du code.
Je devrais être un peu plus à même de comprendre d'ici un an ou deux, du moins je l'espère. :rolleyes:

Par exemple, je ne comprends pas pourquoi en changeant
 

Discussions similaires