XL 2010 Problème sur Formule

Mister Binaire

XLDnaute Occasionnel
Bonjour le Forum,

j'ai récupéré sur le forum ce petit fichier qui permet de comparer des mots proches des uns des autres.
Je veux utiliser ce fichier pour comparer des sorties et des entrées d'un processus.
Dans l'onglet Liste 1 j'ai des sorties et dans l'onglet Liste 2 j'ai des entrées tout cela sous forme de texte.
Le fichier permet de trouver si un vocabulaire identique existe entre ces deux listes.
Ce que je ne comprends pas c'est que parfois le fichier dégage l'erreur !VALEUR.
Quelqu'un pourrait il m'expliquer pourquoi et comment y remédier ?
Merci de votre support...

Bien Amicalement,
Mister Binaire
 

Pièces jointes

  • Essais.xls
    54.5 KB · Affichages: 42

Iznogood1

XLDnaute Impliqué
Bonjour,

Ta fonction crée un tableau "temp" de 5 colonnes (car tu as saisie une formule matricielle sur 5 colonnes) par

Code:
ncol = Application.Caller.Columns.Count
Dim temp(): ReDim temp(1 To ncol)

Puis tu remplis ton tableau quand tu trouves un valeur proche
Code:
If InStr(c, v(i)) > 0 Then
  p = p + 1: temp(p) = c
End If

Donc p vaut 1, puis 2, puis 3, ...
Puis 6 !
Donc erreur car 6 est trop grand (temp(5) est l'index maxi)
 

Mister Binaire

XLDnaute Occasionnel
Merci de ta réponse Iznogood1
C'est à dire qu'il faudrait que je prolonge la formule matricielle sur 6 ou 7 colonnes pour éviter l'erreur avec toujours le risque que P soit > à 7 ou faut il modifier quelque chose dans la macro ? pour éviter de dépasser 5 colonnes ?

Merci de ton support
 

Iznogood1

XLDnaute Impliqué
Plusieurs solutions...
--> prolonger la formule matricielle
--> modifier la fonction pour qu'elle ne retourne qu'un nombre de valeurs compatibles avec la zone d'entrée
--> mettre un paramètre d'entrée pour indiquer la valeur max retournée


Enfin quelques idées pour améliorer le code
--> Utilise Option Explicit et déclare les variables avant de les utiliser
--> Utilise des noms parlants
--> Evite le code inutile

Code:
Option Explicit

Function procheMult2(Vcherche As Range, catalog As Range) As Variant
  Dim result() As Variant
  Dim nb_colonnes As Integer
  Dim valeurs() As String
  Dim index_valeurs As Integer
  Dim element_du_catalogue As Range
  Dim index_result As Integer

  nb_colonnes = Application.Caller.Columns.Count
  ReDim result(nb_colonnes)

  valeurs = Split(Vcherche, " ")

  For index_valeurs = 0 To UBound(valeurs)
     For Each element_du_catalogue In catalog
        If InStr(element_du_catalogue.Value, valeurs(index_valeurs)) > 0 Then
           index_result = index_result + 1
           If index_result <= nb_colonnes Then result(index_result) = element_du_catalogue
        End If
     Next element_du_catalogue
  Next index_valeurs

  procheMult2 = result

End Function

enfin, pour optimiser la fonction, tu devrais utliser "FIND" au lieu de parcourir toutes les entrées du "catalogue"
Ce sera beaucoup plus rapide.

Une bon example de find est dispo dans l'aide en ligne (Ce lien n'existe plus)
 

Discussions similaires

Réponses
1
Affichages
416

Statistiques des forums

Discussions
312 069
Messages
2 085 037
Membres
102 763
dernier inscrit
NICO26