Problème recherche référence vba (double cliquer)

Fermé
JeanPhi71000 Messages postés 2 Date d'inscription jeudi 7 décembre 2017 Statut Membre Dernière intervention 11 décembre 2017 - Modifié le 7 déc. 2017 à 15:25
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 11 déc. 2017 à 14:54
Bonjour,

J'ai crée une macro qui permet de vérifier si une références (un nom de pièce quoi) est dans un tableau donné, situé dans une autre feuille mais du même classeur. Ce tableau est une donnée externe provenant d'un autre classeur, mais cela ne pose pas de problème. Si la référence existe, alors je voudrais que la macro me renvoie le numéro de la ligne dans la case d'à côté de la référence cherchée.
Si la référence existe en plusieurs fois, je voudrais avoir le dernier numéro de lignes. S'il elle n'est pas présente, j'écris "non".
Voici en partie la macro, avec L1 la liste de ref à chercher et L2 le tableau dans lequelle je cherche :



'Selection des références étudiées (L1)
Sheets("CopierIci").Select
Range("B2").Select
Set L1 = Range(Selection, Selection.End(xlDown))


'On appelle L2 la liste contenant les informations
Sheets("InfosDAM").Select
Range("A1").Select
Set L2 = Range(Selection, Selection.End(xlDown))

'On Selectionne la feuille outil
Sheets("FeuilleOutil").Select

'Pour chaque élément étudié (de L1) on regarde où il est dans L2
For i = 1 To L1.Rows.Count
For j = 1 To L2.Rows.Count
If L1(i, 1).Value2 = L2(j, 1) Then
Sheets("FeuilleOutil").Cells(i + 1, 1) = j
End If
If j = L2.Rows.Count And Sheets("FeuilleOutil").Cells(i + 1, 1) = "" Then
Sheets("FeuilleOutil").Cells(i + 1, 1) = "non"
End If
Next j
Next i



Mon souci est le suivant, le code fonctionnait tout très bien et un jour, certaines références étaient indiquées comme inexistante ("non") alors qu'elle se situe pourtant dans le tableau (en vérifiant manuellement).

Le plus étrange c'est que si je double clique sur la référence du tableau et que je refais tourner la macro, cette fois ci elle est trouvée.

J'ai eu beau tourner le problème dans tous les sens mais je ne cmprends pas...
Si quelqu'un pouvait m'aider cela serait très appréciable. Merci.

1 réponse

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
9 déc. 2017 à 11:06
Bonjour,

J'ai pas tout compris (en particulier le contenu de la feuille outils),
mais il faut absolument éviter les Select inutiles.
Peut-être :
Option Explicit
Sub Test()
Dim L1 As Range
Dim L2 As Range
Dim C1 As Range
Dim C2 As Range

  'Définition des références étudiées (L1)
  With Sheets("CopierIci")
    Set L1 = .Range(.Range("B2"), .Range("B2").End(xlDown))
  End With

  'Définition de la liste contenant les informations (L2)
  With Sheets("InfosDAM")
    Set L2 = .Range(.Range("A1"), .Range("A1").End(xlDown))
  End With
  'On travaille sur la feuille outil
  With Sheets("FeuilleOutil")
    'Effacer les anciennes valeurs
    .Columns("A:B").Clear
    'Pour chaque élément étudié (de L1)
    For Each C1 In L1.Cells
      ' On reporte la référence sur la feuille outils ...
      .Cells(C1.Row, "A").Value = C1.Value
      For Each C2 In L2.Cells
        If C1.Value2 = C2.Value Then
          '... et on note la ligne ou elle se trouve dans L2
          .Cells(C1.Row, "B").Value = C2.Row
        End If
      Next C2
      With .Cells(C1.Row, "B")
        '... si pas trouvée
        If .Formula = "" Then .Value = "non"
      End With
    Next C1
  End With
End Sub


0
JeanPhi71000 Messages postés 2 Date d'inscription jeudi 7 décembre 2017 Statut Membre Dernière intervention 11 décembre 2017
11 déc. 2017 à 09:49
Bonjour,

Tout d'abord merci pour votre réponse rapide, utile et qui améliore grandement mon code et mes connaissances VBA.

Cependant, le problème persiste toujours : certaines références qui sont bien dans la liste L2, c'est-a dire dans la feuille "infoDAM", ne sont pas "reconnu".

Ce problème disparait si je double clique ou j'appuie sur entrée sur les références individuellement de la liste "infoDAM". Je pense donc que le problème vient de la connexion des données, c'est comme si certaines données n'étaient pas activées...

voici ci-joint le fichier en question mais il manque le fichier de données que je ne peut pas transmettre :

https://www.fichier-xls.fr/notfound.php

Cordialement,
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
11 déc. 2017 à 14:54
Bonjour,

Le problème vient du fait que les cellules ne contiennent pas la même chose, dans infoDAM les références sont toutes des textes mais dans CopierIci certaines sont des textes et d'autres des nombres (Par exemple 372851 est un nombre dans CopierIci et un texte dans InfoDAM).

Une astuce pour différencier rapidement les nombres des textes consiste à regarder comment est alignée la valeur dans la cellule (en absence d'alignement horizontal spécifique, c'est à dire en standard, ni droite, ni gauche, ni centré, ni ... ). Les textes sont à gauche, les nombres à droite, les booléen et les erreurs sont centrés et en majuscules.
Tu vois immédiatement que dans InfoDAM 372851 est à gauche et dans CopierIci il est à droite

C'est un des "défauts" d'Excel : lorsqu'on saisit quelque chose, chaque fois qu'il peut l'interpréter comme un nombre (entier, décimal, date, monnaie, ...), il le transforme automatiquement en valeur numérique correspondante. C'est ce qui se passe lorsque tu ressaisis la même valeur dans InfoDAM. Par contre lors d'un import ou d'un copier/coller il ne modifie pas les valeurs.

Je suppose que les infos InfoDAM proviennent d'une base de données extérieure, c'est pour ça (et c'est normal) qu'elles sont toutes au format texte. Pour éviter cette transformation (dans infoDAM) , il faut au préalable définir la plage concernée au format Texte, pour qu'il reste sous forme de texte en cas de ressaisie.

C'est sur la feuille CopierIci que les données ne correspondent pas à celles de InfoDAM (372851 est un nombre au lieu d'être un texte).
Une solution consiste donc simplement à définir la colonne B de CopierIci au format texte et a ressaisir tous les nombres (il seront alors considérés comme du texte).

Une autre des solutions consiste à remplacer le test, pour comparer indifféremment les nombres et les textes.
Au lieu de :
        If C1.Value2 = C2.value Then
Mettre :
        If C1.Formula = C2.Formula Then

Avec cette solution, pas besoin de modifier les formats.

Cdlt
Patrice
0