Je me permets de partager mon problème avec vous, parce que je ne vois pas mes erreurs.
Situation:
- Je souhaite faire une recherche dichotomique à partir d'une plage constitutuée d'une seule colonne.
- donc plusieurs lignes sur une seule colonne
- j'ai fait deux fonctions : essai() et rechDicho
- essai() doit me permettre de récupérer les coordonnées de la plage et autres informations
- rechDicho() doit me permettre de faire la recherche dichotomique et renvoyer l'adresse de la cellule correspondante.
- essai() reçoit une plage constitués d'entiers uniques et triés dans l'ordre croissant
ma méthode d'application:
- je choisis une cellule sur la feuille excel où se trouve une petite plage de nombres entiers sur une colonne
- j'applique une fonction à cette cellule
résultat:
- #VALEUR! dans cette cellule après des petits messages (MsgBox).
- j'obtiens les messages de la deuxième fonction sur min écran, donc l'appel de la fonction rechDicho() fonctionne
Sub MonPremierMacro() ' ' MonPremierMacro Macro '
' Dim plage As Range Dim valeur As Integer Set plage = Application.InputBox("sélectionnes la plage dans laquelle tu veux rechercher", "plage de recherche") Set valeur = Application.InputBox("inséres la valeur que tu recherches", "la valeur cherchée") essai(plage, valeur)
Function essai(plage As Range, valeur As Integer) 'la fonction retourne un résultat 'Dim plage As Range Dim colonne As String ' variable qui va contenir le numéro de colonne de la sélection range Dim ligne As Integer 'variable qui va contenir le numero de ligne cette fois-ci Dim dernligne As Integer 'variable qui va contenir le numéro de a deniere ligne Dim nbligne As Integer 'variable qui va contenir le nombre de ligne total de la sélection Dim adresse As Long 'Dim valeur As Integer Dim cellule As Range 'cellule que l'on va agir dessus dont l'adresse va être renvoyée par la fct de rechDIcho
colonne = plage.Column 'on récupère le numéro de la première colonne de la sélection ligne = plage.Row 'on récupère le numéro de la première ligne de la sélection nbligne = plage.Rows.Count 'on compte le nombre total de ligne et on stocke dernligne = ligne + nbligne - 1 'on repère la dernière ligne de la sélection Call MsgBox("ma colonne se trouve au " & colonne & "ma ligne se trouve au " & ligne) 'on affiche les valeurs des variables affectées adresse = rechDicho(valeur, colonne, ligne, dernligne) essai = ActiveSheet.cellule(adresse).Select 'on retourne l'action "sélect"
End Function Function rechDicho(ByVal valrech As Integer, ByVal col As String, ligne As Integer, dernligne As Integer) As Long
Dim trouve As Boolean 'variable boolenne qui va se déclencher quand on aura trouvé la valeur cherchée Dim iDeb As Integer 'on recre les meme variables sous un autre nom Dim iFin As Integer 'on recre les meme variables sous un autre nom Dim iMil As Integer 'on recre les meme variables sous un autre nom Dim tabnav As Range 'curseur qui va naviguer et permettre d'envoyer l'adresse Call MsgBox(prompt:="Votre sélection est bien " & valrech & "dans la colonne" & col, Buttons:=vbYesNo) ' message de confirmation trouve = False iDeb = ligne iFin = dernligne While trouve = True And (iFin - iDeb) > 1 iMil = (iDeb + iFin) / 2 Call MsgBox("iMil vaut " & iMil) If ActiveSheet.tabnav.Columns(col).Rows(iMil).Value = valrech Then trouve = True End If If ActiveSheet.tabnav.Columns(col).Rows(iMil).Value > valrech Then iFin = iMil Else iDeb = iMil End If Wend If trouve = True Then rechDicho = ActiveSheet.tabnav.Columns(col).Rows(iDeb).Address Else rechDicho = ActiveSheet.tabnav.Columns(0).Rows(0).adress End If
End Function
Désolé si je vous dérange; je viens de plonger dans la VBA sans passer par les exercicess d'initiation ion j'en suis sur que si je passais par les exercices intermédiaires j'aurais mieux compris la logique. C'est en effet dû à un manque de temps
danielc0
Messages postés1334Date d'inscriptionmardi 5 juin 2018StatutMembreDernière intervention17 décembre 2024155 9 oct. 2018 à 16:49
Bonjour,
Des pistes de recherche :
1. Tu as un début de macro en tête de ton code ?
2. Mets des points d'arrêt et exécute le code en mode ligne à ligne.
et un conseil :
ce n'est pas en faisant résoudre tes problèmes par d'autres que tu progresseras.
Désolé j'ai essayé de supprimer ma question sur CCM, mais je n'y arrive pas.
Je préfère comme tu dis de le résoudre moi-même; je dois le résoudre moi-même.
Merci pour ton aide.
9 oct. 2018 à 17:47
1) oui
2) je vais essayer
conseil) tu as raison, je prends bonne note de ton conseil
9 oct. 2018 à 17:48
10 oct. 2018 à 15:29
Daniel
10 oct. 2018 à 15:35
Je préfère comme tu dis de le résoudre moi-même; je dois le résoudre moi-même.
Merci pour ton aide.