IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

la fonction Match a t elle une limite?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut la fonction Match a t elle une limite?
    Salut a tous!

    Je viens de remarquer quelque chose d'etrange a propos de worksheetfunction.match.
    Quand on utilise une variable tableau en tant qu'array de recherche, la fonction semble avoir une limite.
    Exemple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    option explicit
    Sub TestMatchFctTab()
    Dim i As Long
    Dim tb(200000) As String
    Dim xyz As Single
     
     
        For i = 0 To 200000
            tb(i) = i & "x"
        Next i
     
        xyz = fcttestmtb(tb)
        Debug.Print xyz
     
    End Sub
     
    Function fcttestmtb(tbx() As String) As Single
     
        fcttestmtb = WorksheetFunction.Match(3392 & "x", tbx, 0)
     
    End Function
    Pas d'erreur, le debug.print nous donne bien une valeur, ok.
    Maintenant si on met 3393 dans la fonction a la place de 3392, cela ne marche plus et pour toutes les valeurs >3392 on obtient l'erreur 1004.

    Je n'arrive absolument pas a comprendre pourquoi cela s'arrete a 3392.
    Le pire est que si je mets ces valeurs dans les cellules d'un worksheet et que je remplace dans ma fonction Match ma variable tableau tbx par la colonne ou j'ai mis les valeurs, et bien la ca marche...

    Si vous avez une explication a ceci, je serais tres interesse!
    Merci!

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    le souci vient de la taille de la variable tableau car comme beaucoup de fonctions internes d'Excel, il y a une limite !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Demo()
        Dim L&, TB$(1 To 65536)
        For L = LBound(TB) To UBound(TB):  TB(L) = L & "x":  Next
        Debug.Print Application.Match("3393x", TB, 0)
    End Sub
    En augmentant la borne supérieure de 1, cela ne passe plus …

    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    bonjour
    pour mes object arraylist et sortedlist de Scripting runtime j'avais fait une fonction match qui n'avais pas de limite tout du moins autant qu'une cellule a en terme de string

    des que je rentre ce soir je te la donne adaptée a une variable tableau

    re voila
    juste avant de repartir

    un exemple avec un tableau de 100 000 item
    sub de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    Dim tablo(100000), i, M
    For i = 0 To UBound(tablo)
    tablo(i) = Round(Rnd * 100050)
    Next
    M = matche(tablo, 1563)
    'M = matche(tablo, 1563, 3) 'si tu veux le 3 eme etc....... le 3 eme argument est optional
    If M <> False Then MsgBox M
    End Sub
    fonction matche perso
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function matche(T As Variant, it, Optional nbit As Long = 1) 'As Variant
    'Debug.Print Join(T, ",")
    On Error GoTo fin
    matche = UBound(Split(Split(Join(T, ","), it)(nbit - 1), ",")) + 1
    Exit Function
    fin:
    matche = False
    End Function
    on pourrait même sortir match en tableau d'occurrence si tu veux
    je peux te faire ca y a pas de soucis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je viens de me rendre compte qu'elle manquait de précision surtout pour les numériques
    je l'ai donc blindée au niveau de la distinction de la chaine complete demandée

    exemple sur un tableau de 100000 item

    la ligne 10 prouve bien si c'est exact
    sub de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim tablo(100000), i, M
    For i = 0 To UBound(tablo)
    tablo(i) = Round(Rnd * 102000)
    Next
    M = matche(tablo, "32124")
    'M = matche(tablo, 1563, 3) 'si tu veux le 3 eme etc....... le 3 eme argument est optional
    If M <> False Then
    MsgBox M
    MsgBox tablo(M) 'pour verifier !!!!!!!!!!!
    End If
    'Cells(1, 1).Resize(65000, 1) = Application.Transpose(tablo)'j'ai bloqué on peut bien évidemment pas coller ce tableau dans un sheets 
    End Sub
    la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function matche(T As Variant, it, Optional nbit As Long = 1) As Variant
    'Debug.Print Join(T, ",")
    On Error GoTo fin
    j = Join(T, ","): reste = Split(j, "," & it & ",")(nbit - 1)
    matche = UBound(Split(reste, ",")) + 1
    If matche > UBound(T) Then matche = False
    Exit Function
    fin:
    matche = False
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Comme un mal poli j'ai oublie de repondre.
    Merci beaucoup a vous 2!

    Ca resout mon probleme

    Effectivement, entre temps j'avais remarque quelque chose, ca marche par tranche de 2^16 (donc 65536).
    On peut chercher seulement jusqu'au reste de la division euclidienne de la dimension par 65536
    si ma dimension est de n*65536-1 je peux aller jusque 65535
    si ma dimension est de n*65536 (par exemple 196608 qui est egal a 3*65536) ca fera tout le temps erreur, comme si le tableau etait vide!!

    Si je declare mon tableau avec une dimension de 200000 comme dans mon exemple je peux chercher seulement jusque 3392, car si je divise 200000 par 65536, le reste est de 3392.

    Super ta fonction Patrick, je n'avais pas du tout penser a tenter de trouver une solution de cette facon!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2012, 15h48
  2. Réponses: 9
    Dernier message: 13/07/2010, 16h54
  3. Réponses: 2
    Dernier message: 08/04/2010, 14h37
  4. une page jsp, a t-elle une limite d'affichage?
    Par amoula84 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 09/07/2009, 16h23
  5. Faire la recherche d'un élement dans une colonne avec la fonction match
    Par ckrikri dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/11/2008, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo