Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

rechercher des valeurs dans chaque colonne en boucle excel mac 2011 vba

svdvet

XLDnaute Nouveau
Bonjour,
Pour excel mac 2011
Il s'agit d'un tableau contenant les résultats d'un test bactériologique. Plusieurs germes peuvent être identifiés. On aurait pu le faire avec un panier de fruits et appliquer des test permettant de retrouver de quel fruit il s'agit en fonction de critères d'observation couleur, odeur, forme, taille, …) pour ceux que la biologie pourrait destabiliser.
j'arrive à rechercher si le contenu d'une cellule est retrouvé dans une colonne, y compris pour des doublons dont je compte le nombre d'occurrences et même trouver les adresses de celles-ci ce qui me permettrait ensuite d'en faire ce que je veux (mettre en couleur, supprimer, exporter vers un contrôle dans un userform,…) mais je bloque pour effectuer des boucles de recherche pour différentes valeurs sur plusieurs colonnes avec excel mac 2011 (fonction find non dispo). La boucle s'arrête sur la deuxième colonne sur Lignearray = Application.Match(Cible, Rng, 0) lors de la deuxième boucle pour cette colonne.
J'avais pensé aussi comparer plusieurs cellules en ligne(comparer des lignes) sur plusieurs colonnes mais j'ai échoué également. Je suis sûr qu'il y a un moyen plus simple avec un array à 2 D mais j'ai perdu un peu le fil de mes pensées à ce stade. Je joins le fichier test avec le code, les commentaires et les différents points de contrôles qui montrent ce que fait la macro en mode pas à pas afin de rendre plus claire la question pour ceux que ça intéresserait. Pour l'instant, j'ai donc répété chaque boucle en déclenchant la boucle recherche_1_colonne sur un groupe d'otpionbuttons en frame 2 par 2 qui renvoient leur caption dans la ligne des valeurs à tester (incolore, anneau bleu, noir,…). avec une raz pour na pas avoir d'erreur liée à des valeurs "saisies" lors du lancement de la boucle précédente. Merci d'avance de vos avis. Si le code vous parait top bidouillé et que l'idée de départ est mauvaise, qu'auriez vous fait?
 

Pièces jointes

  • rechercher le contenu d'une cellule dans une ou plusieurs colonne (toutes les occurences).xls
    89 KB · Affichages: 55

Nairolf

XLDnaute Accro
Salut,

Je t'avouerais ne pas avoir regardé ton code au complet car je ne saisis pas bien quel résultat tu souhaites obtenir.

Je me trompe peut-être, mais j'ai le sentiment que tu as sorti l'artillerie lourde du vba pour des actions réalisables assez simplement via des formules et des outils inclus dans le tableur (la Mise en Forme Conditionnelle par exemple).

Afin de me permettre de mieux comprendre et ainsi peut-être pouvoir t'aider, pourrais-tu donner un fichier exemple avec le résultat que tu souhaites obtenir ?
 

svdvet

XLDnaute Nouveau
Merci de la réponse rapide. le fichier joint est suffisant je pense pour comprendre le but: récupérer l'adresse de chaque valeur trouvée dans la colonne (et faire autre chose avec à la place de l'instruction "msgbox" indiquant la ou les ligne à laquelle l'occurence a été trouvée à chaque boucle). (Pour mon cas, les valeurs de la ligne trouvée et colonne F sont copiées dans une listbox lors de l'événement click sur un option bouton indiquant la couleur lue ou bien effacées de cette listbox lorsqu'on a commis une erreur de remplissage du formulaire et qu'on clique l'autre otpionbutton de la frame relative au critère lu). Cette partie du code est encore incomplète car je bute sur les conditions relatives aux colonnes K, L, M qui permettent la détermination d'un type de streptocoque en particulier parmi les trois types possibles) et mon code répété pour chaque colonne est devenu un peu lourd. Je suis sûr que c'est arrivé à tout le monde de partir d'une conception erronée et de se fourvoyer durant des jours en trouvant la solution apportée très complexe tout en ayant l'intuition qu'il y a mieux à faire. tu as très bien capté mon état d'esprit, mais en même temps, c'est aussi le prix à payer pour apprendre,…
Le formulaire définitif de saisie des résultats ressemble à ça lorsqu'il et lu dans les conditions prévues par le fabricant (date MEC + 48 h)
restera à ajouter la conduite à tenir en fonction des résultats du test et des informations relatives à l'animal et au troupeau et imprimer un rapport.
 

Pièces jointes

  • Capture d’écran 2017-05-31 à 16.16.14.pdf
    735.8 KB · Affichages: 86

Nairolf

XLDnaute Accro
Maintenant j'ai mieux saisi l'objectif.

Voici une première ébauche de code afin de savoir si je m'oriente dans la bonne direction:
Code:
Private Sub recherche_1_colonne_Click() ' recherche la valeur d'une cellule sur un tableur avec boucle sur plusieurs colonnes avec match (on aurait pu faire aussi avec find ou un tableau array
Dim Cible 'valeur recherchŽe dans le tableur
Dim Lignearray As Integer 'ligne du range dans lequel la recherche est effectuŽe
Dim Rng As Range 'tableau dans lequel on effectue la recherche, redimensionnŽ ˆ chaque boucle pour ne pas tomber toujours sur la premire occurence trouvŽe +++ (c'est a l'idŽe de cette fonction)
Dim Ligne 'n¡ de Ligne dans laquelle la valeur cherchŽe est trouvŽe
Dim L As Integer 'nombre de lignes dans le tableur prŽcŽdant chaque boucle
Dim n As Integer
Dim Tabl  'partie du tableur dans lequel on veut effectuer la recherche
Dim feuil1 As Worksheet
Dim dercol
Dim tablo1(10, 10)
Dim i As Integer
Dim j As Integer
Dim str As String

str = ""

Set Rng = Range("h21:H29")
Rng.Select 'pour controle uniquement
Cible = Range("H33")
MsgBox (Cible) 'pour controle uniquement
    'extraire la valeur dans le tableur (feuille TEMPO)
             'MsgBox (Range("H33").Value)
              'recherche une valeur dans le tableur (ici colonne H par la fonction match (+++ !!!) et donner la ligne correspondante (ne fonctionne pas si doublons, bien entendu: rend la premire occurence trouvŽe par la fonction match (je crois de la ligne 2 ˆ la fin du tableur)
n = 0
L = 20 ' le tableau de recherche commence ˆ la ligne 21 du tableur)
      With Application.WorksheetFunction

For j = 8 To 8
'Do
'On Error GoTo Finish
tablo1(0, j - 8) = WorksheetFunction.CountIf(Rng, Cible)
    For i = 21 To 29
                If Cells(i, j) = Cible Then
                    tablo1(i - 20, j - 8) = i
                    str = str & ", " & i
                End If
    Next i
                        'Lignearray = Application.Match(Cible, Rng, 0)
                        'Ligne = Lignearray + L
                        'MsgBox (Lignearray) 'pour controle uniquement
                        MsgBox ("La valeur " & Cible & " trouvŽe dans les lignes: " & str & "Cette valeur a ŽtŽ trouvŽe " & tablo1(0, j - 8) & "fois dans la colonne.")
                        'Set Rng = Rng.Resize(Rng.Rows.Count - Lignearray, 1).Offset(Lignearray, 0)
                        'Rng.Select
                        'n = n + 1
                        'L = Ligne
  
'Loop
Next j
End With
'Finish:

                                    ' Me.ListBox1.AddItem = Cells(Ligne, 6) 'colonne F
                                    'Me.TxtB_Date_MEC = Cells(x, Range("Date_MEC").Column) ' ici fonctionne avec des colonne nommŽes dynamiquement (("Date_MEC")
End Sub
Ce n'est pas très propre mais ça permet de te donner une idée de ce qui peut être fait.
 

svdvet

XLDnaute Nouveau
Bonjour, ça a l'air très bien et ça fonctionne. Merci !!!!! l'idée de départ était de saisir les tous Optionbutton puis de valider le choix par un buttoncommand unique (tester toute la ligne, colonne par colonne) . Entre temps j'ai réussi à terminer le code pour chaque groupe de bouton donc plus besoin de boucler sur toutes les colonnes en même temps, mais je vais quand même essayer à l'occasion en passant par ta solution. ça resservira forcément ! merci encore. L'idée de ne pas s'embêter et de passer par RECHERCHE dans le tableur me parait aussi bien plus élégante a posteriori et je la retiens pour la prochaine fois (j'attendrai plus d'etre en manque de sommeil, promis!)
 

Discussions similaires

Réponses
3
Affichages
698
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…