RESOLU par job75 Ordre et citations...

Guido

XLDnaute Accro
Bonjour le Forum

Je recherche les formules pour avoir l'ordre dans la plage de droite ,Voir le petit fichier

La je l'ai fais manuellement

Merci

Guido
 

Pièces jointes

  • FICHIER MUST GUIDOTURF PERSO MODELE.xls
    31 KB · Affichages: 81

Guido

XLDnaute Accro
Bonjour le Forum

Je suis surpris du manque de réponse...mais quand je ne donne pas assez de précision ont me le fais savoir...

quand je donnes le max de précisions ,la même pas une réponse. Mon profil dois gêné ???? ou le thème ???pour mes fichiers

des courses de chevaux...

Bonne fin de journée

Guido
 

Theze

XLDnaute Occasionnel
Bonjour,

Avec une fonction perso à valider par Ctrl+Maj+Entrée. Tu sélectionnes ta ligne puis dans la barre Formule tu appelles la fonction de cette façon et tu valeur sous forme matricielle :
Code:
=OrdreParColonne(B3:J5)
voici la fonction :
Code:
Function OrdreParColonne(Plage As Range) As Integer()
   
    Dim Tbl() As Integer
    Dim Cel As Range
    Dim Col As Range
    Dim I As Integer

    For Each Col In Plage.Columns
   
        For Each Cel In Col.Cells
       
            If Cel.Value <> "" Then
           
                I = I + 1
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = Cel.Value
           
            End If
           
        Next Cel
       
    Next Col
   
    OrdreParColonne = Tbl()
   
End Function
 

job75

XLDnaute Barbatruc
Bonjour Guido, Theze, le forum,

Ce n'est pas un problème simple alors ne soyez pas étonné qu'il n'attire pas les foules.

Et ne soyez pas non plus étonné de ne rien comprendre à cette fonction VBA matricielle :
Code:
Function Classement(tablo, Optional ncite&)
Dim a(), d As Object, e, b, c, i&, n&
tablo = tablo 'matrice, plus rapide
ReDim a(1 To Application.Caller.Columns.Count)
If ncite Then
  Set d = CreateObject("Scripting.Dictionary")
  For Each e In tablo
    If e <> "" Then d(e) = d(e) + 1 'comptage
  Next
  If d.Count Then
    b = d.keys: c = d.items
    For i = 0 To UBound(b)
      If c(i) = ncite Then
        n = n + 1
        a(n) = b(i)
      End If
    Next
  End If
Else
  For Each e In tablo
    If e <> "" Then
      n = n + 1
      a(n) = e
    End If
  Next
End If
For i = n + 1 To UBound(a)
  a(i) = "" 'évite les valeurs zéros
Next
Classement = a 'vecteur ligne
End Function
Avec le Dictionary et des tableaux VBA c'est très rapide.

Fichier joint avec les explications pour utiliser cette fonction dans la feuille de calcul.

Edit : s'il y a plus de 9 valeurs dans le tableau B22:J24 la plage des résultats O22:W22 se remplit de valeurs d'erreur #VALEUR!.

C'est très utile car cela permet de savoir qu'il faut agrandir la plage des résultats (ou effacer les nombres indésirables).

A+
 

Pièces jointes

  • FICHIER MUST GUIDOTURF PERSO MODELE(1).xls
    91 KB · Affichages: 96
Dernière édition:

Guido

XLDnaute Accro
Re

Bonjour job75, Theze, le forum

Merci pour vos propositions

Theze merci pour ta VBA, je la garde sous le coude.

job75,comme d'habitude tu est a la hauteur pour satisfaire a mes demande.,Merci

A bientôt pour d'autres demandes...

Amitiés

Guido
 

job75

XLDnaute Barbatruc
Bonjour Guido,

Les solutions qu'on vous a données sont des solutions VBA.

Et les formules matricielles fonctionnent sous toutes version.

Mais il ne faut pas de cellules fusionnées où elles se trouvent.

Le fichier que j'ai joint est un .xls, je ne vois pas pourquoi il ne fonctionnerait pas sur Excel 2003.

A+
 

Guido

XLDnaute Accro
Re

Job75

Je le dit depuis longtemps, j'ai découvert Excel depuis 2008 et c'est un ami qui me fessais les macros et les formules matricielle

la il n'est plus de ce monde ...

En Excel et formules je suis nul.

je sais faire le minimum

J'apprend petit a petit,

A plus

Guido
 

job75

XLDnaute Barbatruc
Bonjour Guido, le forum,

Puisque vous êtes allergique aux formules matricielles voici une autre solution dans ce fichier (2).

Elle utilise une fonction VBA différente :
Code:
Function ClassementNombre(tablo, Optional ncite&)
Dim d As Object, e, b, c, i&, n&, a()
tablo = tablo 'matrice, plus rapide
If ncite Then
  Set d = CreateObject("Scripting.Dictionary")
  For Each e In tablo
    If IsNumeric(CStr(e)) Then d(e) = d(e) + 1 'comptage
  Next
  If d.Count Then
    b = d.keys: c = d.items
    For i = 0 To UBound(b)
      If c(i) = ncite Then
        n = n + 1
        ReDim Preserve a(1 To n)
        a(n) = b(i)
      End If
    Next
  End If
Else
  For Each e In tablo
    If IsNumeric(CStr(e)) Then
      n = n + 1
      ReDim Preserve a(1 To n)
      a(n) = e
    End If
  Next
End If
If n Then ClassementNombre = a Else ClassementNombre = "" 'vecteur ligne
End Function
Les formules dans la feuille de calcul ne nécessitent plus de validation matricielle.

Mais elles sont plus compliquées et surtout le temps de calcul est beaucoup plus long.

Et faites très attention aux signes $, il faut les mettre uniquement où c'est nécessaire.

Croyez-moi, la solution du fichier (1) est bien meilleure !!!

Bonne journée.
 

Pièces jointes

  • FICHIER MUST GUIDOTURF PERSO MODELE(2).xls
    92.5 KB · Affichages: 73

job75

XLDnaute Barbatruc
Re,

Une amélioration importante pour les 2 fichiers.

La création du Dictionary prend du temps, il faut donc le créer une seule fois :

- en haut du code écrire :
Code:
Dim d As Object 'mémorise la variable
- et dans la fonction :
Code:
  If d Is Nothing Then Set d = CreateObject("Scripting.Dictionary") Else d.RemoveAll
Fichiers (1 bis) et (2 bis).

Edit : j'ai mesuré (sur Win 10 - Excel 2013) les temps de calcul de toutes les formules de la feuille :

- fichier (1 bis) => 0,75 millième de seconde

- fichier (2 bis) => 6,3 millièmes de seconde donc 8 fois plus long.

A+
 

Pièces jointes

  • FICHIER MUST GUIDOTURF PERSO MODELE(1 bis).xls
    91 KB · Affichages: 76
  • FICHIER MUST GUIDOTURF PERSO MODELE(2 bis).xls
    96.5 KB · Affichages: 79
Dernière édition:

Discussions similaires

Réponses
17
Affichages
756

Statistiques des forums

Discussions
314 190
Messages
2 106 996
Membres
109 735
dernier inscrit
Mounskad