VBA Variables Tableaux - Trouver une valeur sans boucle

La braise

XLDnaute Occasionnel
Bonjour à Tous,

Mon problème du jour... :)

J'utilise une variable tableau (2D) que je souhaite utiliser comme une base pour faire du mapping.

Je cherche VAR_TAB(z, 2) pour un z donné.

Pour identifier z, j'utilise une boucle du genre :

For i = 1 To UBound(VAR_TAB, 1)
If VAR_TAB(i, 1) = Val_Cherchee Then Z = i
Next i
MsgBox VAR_TAB(Z, 2)

Existe t-il un moyen plus efficace que passer par une boucle qui balaye toutes les valeurs la colonne 1 du tableau?

En gros, comment lire une valeur donnée dans un tableau?

D'avance merci pour votre aide toujours aussi efficace.

:D
 

tototiti2008

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Re,

Essaye d'enlever les guillemets autour du 1003
il y a de grandes chances pour que ce soit des nombres dans ta feuille de calcul, tu dois donc rechercher un nombre

Code:
Dim Val_Cherchee As Long
...
Val_Cherchee = 1003
 

La braise

XLDnaute Occasionnel
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Bonjour pierrejean,

Je cherche la solution la plus rapide pour ce type de traitement.

- J'ai abandonné le Vlookup

- je privilégie pour l'instant la variable tableau. En fait une pour la base, une pour le mapping et en fin de traitement je colle la variable tableau mapping dans un range. Ainsi, rien ne se passe dans le fichier. Ce qui me semble le plus rapide.

Le but est d'ouvrir la base, la coller dans la variable tableau base sans avoir à la copier/coller dans un fichier où je ferais la recherche.

Pour le .find, il faudrait que je laisse ouvert le fichier contenant la base, ou que je le copie d'un onglet de mon fichier destination.
 

pierrejean

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Re

Ce n'est pas ce qui ressort de ton fichier exemple
Il faut bien comprendre qu'on veut bien se casser la tête pour resoudre ton problème , mais tant qu'on n'en aura pas l'énoncé complet (avec fichier(s) à l'appui) on risque d'y passer notre jeunesse (laquelle entre parentheses m'a deja quitté depuis un moment)
 

Misange

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Tu sais que tu peux joindre un fichier sur ce forum :) ?
il te suffit d'aller en mode avancé et de cliquer sur le trombone. Il restera de la sorte sur le forum (sauf si tu l'enlèves), à la dispo de ceux qui regarderont la question dans X temps.

ceci fonctionne sans problème chez moi et me renvoie 3, c.aD le N° de la ligne contenant 1003
HTML:
Sub Test()

Dim VAR_TAB
Dim Val_Cherchee As Integer
Dim i As Integer

VAR_TAB = Range("A1:B8")
Val_Cherchee = 1003

Debug.Print Application.Match(1003, Application.Index(VAR_TAB, 0, 1), 0)
Debug.Print Application.Match(Val_Cherchee, Application.Index(VAR_TAB, 0, 1), 0)

End Sub
 

pierrejean

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Re

en partant du # 11 et en supposant avoir bien compris le problème
2 fichiers
1) labraise = base de données (a creer avec la macro puis fermer)
2) labraise1
lancer d'abord la macro import
puis la macro creeliste (a priori la + longue ) qui creera une liste aleatoire de termes prelevés dans la colonne A de la base de donées
Enfin lancer la macro traite qui recuperera quelques colonnes de la base de données
NB: premier jet pour traiter les concepts (on pourra parametrer et traiter les erreurs potentielles ulterieurement si cela convient)
 

Pièces jointes

  • labraise.xls
    28.5 KB · Affichages: 102
  • labraise.xls
    28.5 KB · Affichages: 96
  • labraise.xls
    28.5 KB · Affichages: 90
  • labraise1.xls
    41.5 KB · Affichages: 108

La braise

XLDnaute Occasionnel
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Tu sais que tu peux joindre un fichier sur ce forum :) ?
il te suffit d'aller en mode avancé et de cliquer sur le trombone. Il restera de la sorte sur le forum (sauf si tu l'enlèves), à la dispo de ceux qui regarderont la question dans X temps.

ceci fonctionne sans problème chez moi et me renvoie 3, c.aD le N° de la ligne contenant 1003
HTML:
Sub Test()

Dim VAR_TAB
Dim Val_Cherchee As Integer
Dim i As Integer

VAR_TAB = Range("A1:B8")
Val_Cherchee = 1003

Debug.Print Application.Match(1003, Application.Index(VAR_TAB, 0, 1), 0)
Debug.Print Application.Match(Val_Cherchee, Application.Index(VAR_TAB, 0, 1), 0)

End Sub

Misange,

Effectivement le code fonctionne, mais la variable cherchée est un nombre (integrer).
Dans le cas d'un nombre, effectivement cela me conviens à la perfection.
je retrouve la données de la 2ème colonne par :
VAR_TAB(Application.Match(Val_Cherchee, Application.Index(VAR_TAB, 0, 1), 0), 2)

Mon problème venait donc de la déclaration de la variable. :mad:

J'ai fais le test en inversant les 2 colonnes de la base, en déclarant la variable en string et en cherchant "CCC" il me retrouve bien le numéro de la ligne.

Merci beaucoup pour l'aide et le temps que tu as consacré à m'aider.

:)
 

La braise

XLDnaute Occasionnel
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Re

en partant du # 11 et en supposant avoir bien compris le problème
2 fichiers
1) labraise = base de données (a creer avec la macro puis fermer)
2) labraise1
lancer d'abord la macro import
puis la macro creeliste (a priori la + longue ) qui creera une liste aleatoire de termes prelevés dans la colonne A de la base de donées
Enfin lancer la macro traite qui recuperera quelques colonnes de la base de données
NB: premier jet pour traiter les concepts (on pourra parametrer et traiter les erreurs potentielles ulterieurement si cela convient)

PierreJean,
J'ai récupéré tes fichiers et je te remercie du temps passé.
Je vais analyser avec attention ton CreateObject("scripting.dictionary") qui est pour moi un nouveauté. :cool:

C'est toujours pareil avec PierreJean, du code inconnu sur lequel on passe du temps à comprendre mais qui au final nous ouvre de nouveaux horizons. :D
Je ne manquerais pas de revenir vers toi pour des compléments d'infos.
C'est grace à tes gens comme toi qu'on se couche moins bête!
 

Misange

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Contente de t'avoir aidé à trouver la soluce (que je mets dans mes tablettes d'ailleurs :) )
Quand j'ai des doutes sur les déclarations de variable... je les enlève et je vois si ça passe puis je les remets une à une pour voir où ça coince. C'est la technique mayonnaise ratée qu'on reprend :)
pour scripting .dictionary, j'ai fait un tuto sur cet outil très utile
Ce lien n'existe plus
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Bonjour,

Pour des recherches vraiment très rapides, utiliser dictionary

Code:
Sub RechercheTableau()
  a = [A1:b20000]
  t = Timer()
  For j = 15000 To 16000 Step 2  ' 500 recherches= 4 sec
    x = "Nom" & Trim(Str(j))
    For i = 1 To 20000
      If a(i, 1) = x Then
        y= a(i, 2)
      End If
     Next i
   Next j
   MsgBox Timer() - t
End Sub

Sub RechercheDico()
  Set mondico = CreateObject("scripting.dictionary")
  a = [A1:b20000]
  For i = 1 To 20000
    mondico(a(i, 1)) = a(i, 2)
  Next i
  t = Timer()
  For j = 15000 To 16000 Step 2 ' 500 recherches= 0,015 sec
    x = "Nom" & Trim(Str(j))
    y= mondico(x)
   Next j
   MsgBox Timer() - t
End Sub

Sub RechercheFind()
  Set mondico = CreateObject("scripting.dictionary")
  t = Timer()
  For j = 15000 To 16000 Step 2 ' 500 recherches= 2,65 sec
    x = "Nom" & Trim(Str(j))
    Set result = [A1:A20000].Find(what:=x)
    y = result.Offset(, 1)
   Next j
   MsgBox Timer() - t
End Sub

Objet dictionary

JB
 

Pièces jointes

  • RechercheTableauDico.zip
    344.4 KB · Affichages: 119
  • RechercheTableauDico.zip
    344.4 KB · Affichages: 96
  • RechercheTableauDico.zip
    344.4 KB · Affichages: 94
Dernière édition:

Misange

XLDnaute Barbatruc
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Bonjour Jacques

Avec ceci
Code:
Sub Test()

Dim VAR_TAB
Dim Val_Cherchee As Integer
t = Timer()
VAR_TAB = Range("A1:A20000")
Val_Cherchee = 1003

Range("B1") = Application.Match(Val_Cherchee, Application.Index(VAR_TAB, 0, 1), 0)
MsgBox Timer() - t
End Sub

0.01 secondes ...

c'est tout l'intérêt de ne pas avoir à boucler sur les éléments de la feuille ou du tableau.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : VBA Variables Tableaux - Trouver une valeur sans boucle

Bonjour Misange,

Je crois que tu a mal lu.

Une recherche de clé avec Dictionary n'utilise pas de boucle
(La boucle du programme permet une mesure plus précise).

valeur=Mondico(clé)

0,015 sec pour 500 recherches donne0,00003 sec pour une recherche

Avec Application.Match, pour la recherche de Nom15000, j'obtiens 0,06 s au lieu de 0,00003 sec (Dictionary)

JB
 

Pièces jointes

  • RechercheTableauDico.zip
    280.8 KB · Affichages: 74
  • RechercheTableauDico.zip
    280.8 KB · Affichages: 76
  • RechercheTableauDico.zip
    280.8 KB · Affichages: 95
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 894
Membres
103 404
dernier inscrit
sultan87