Mon Code VBA donne " #VALEUR!"

Fermé
SinanSakalli - 9 oct. 2018 à 16:07
 sinan - 10 oct. 2018 à 15:35
Bonjour,


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
A voir également:

1 réponse

danielc0 Messages postés 1162 Date d'inscription mardi 5 juin 2018 Statut Membre Dernière intervention 2 octobre 2024 133
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.

Daniel
0
réponses:
1) oui
2) je vais essayer
conseil) tu as raison, je prends bonne note de ton conseil
0
Il me manque le Sub End déjà ?
0
danielc0 Messages postés 1162 Date d'inscription mardi 5 juin 2018 Statut Membre Dernière intervention 2 octobre 2024 133
10 oct. 2018 à 15:29
C'est ce que je t'ai indiqué en 1. tu n'as qu'un début de macro.

Daniel
0
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.
0