IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur sur la Fonction Selection.Find VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2022
    Messages : 5
    Par défaut Erreur sur la Fonction Selection.Find VBA
    Bonjour,

    L'objectif de ma macro est de trouver les 3 plus grandes valeurs dans une colonne d'une semaine X. Le format de cellule de ces valeurs est monétaire . Les colonnes sont les 52 semaines. Je note ces valeurs dans la colonne BI. Jusque là, pas de soucis.
    Ensuite je cherche à trouver la désignation (se trouvant en A1) de ces valeurs et les noter en colonne BJ.
    Dans la ligne Selection.find, j'ai l'erreur suivante : Erreur d'exécution '91'. Variable object ou variable de bloc With non définie. Je suppose que c'est au niveau du What que cela pose problème. Lorsque je lance ma macro, la variable Top1 a bien une valeur associée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Range(Cells(2, ColonneE), Cells(derniereligneE, ColonneE)).Select
    Application.FindFormat.NumberFormat = "#,##0.00 $"
    Selection.Find(What:=€ & Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    Lignetop1 = ActiveCell.Row
    Defauttop1 = Range("A" & Lignetop1)
    Range("A" & Lignetop1).Select
    Range("BJ3").Value = Defauttop1
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Find(What:=Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    mais cela ne fonctionne pas non plus.

    Il me sélectionne bien la colonne de la semaine demandée.

    Cette formule fonctionnait sur une autre version d'Excel. Sur Excel 2016 pro, elle me met l'erreur.

    J'ai défini mes variables tel quel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim SemaineSaisieE As Byte
        Dim ColonneE As Integer
        Dim derniereligneE As Integer
        Dim SemaineE As String
        Dim Top1, Top2, Top3 As Currency
        Dim Lignetop1, Lignetop2, Lignetop3 As String
        Dim Defauttop1, Defauttop2, Defauttop3 As String
    Comment résoudre cette erreur svp ?
    Merci par avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut premierement bienvenue sur le forum,

    Pour inserer le code tu peux te servir de la balise "#" c'est beaucoup plus lisible !

    En suite dans ta fonction il me semble que le signe "€" n'est pas entre guillemets alors que c'est un caratere (string), c'est surement pour cette raison que ca ne fonctionne pas.

    cdt

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2022
    Messages : 5
    Par défaut
    Citation Envoyé par ChristianBosch Voir le message
    Salut premierement bienvenue sur le forum,

    Pour inserer le code tu peux te servir de la balise "#" c'est beaucoup plus lisible !

    En suite dans ta fonction il me semble que le signe "€" n'est pas entre guillemets alors que c'est un caratere (string), c'est surement pour cette raison que ca ne fonctionne pas.

    cdt
    Bonjour,

    Merci pour l'info de la balise je ne savais pas comment faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Range(Cells(2, ColonneE), Cells(derniereligneE, ColonneE)).Select
    Application.FindFormat.NumberFormat = "#,##0.00 $"
    Selection.Find(What:="€" & Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    Lignetop1 = ActiveCell.Row
    Defauttop1 = Range("A" & Lignetop1)
    Range("A" & Lignetop1).Select
    Range("BJ3").Value = Defauttop1
    J'ai essayé avec les guillemets. Cela me met le même message d'erreur. J'ai mis le signe euros pour indiquer que c'est un type monétaire.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Je pense que cette erreur indique que la recherche n'a pas aboutit car quand tu mets ".activate" etant donné que le "find" doit etre a "nothing" la méthode n'a pas d'objet pour travailler.

    Si il y a une possibilité que la méthode find ne trouve pas il faut faire une gestion d'erreur sur le find avant d'executer le ".activate"

    Apres j'ai pas bien compris ce que tu voulais faire avec le "€", si tes cellules sont au format monaitaire alors tu n'as pas besoin de preciser la devise il te faut seulement indiquer la valeur dans ta rechercher qui correspond a "top1" j'imagine, retire le "€". Le formatage n'est qu'une sur couche que Excel rajoute pour l'affichage de certaines valeur (ici ajouter le sigle "€") mais la valeur de ta cellule ne change pas.

    cdt,

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2022
    Messages : 5
    Par défaut
    Pourtant la valeur qu'il cherche existe car c'est une valeur qu'il a déjà récupérer dans la colonne.
    Je vais mettre le code en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Sub Graphique_Ligne_E()
     
    'Définitions des valeurs max de rebuts entre code défaut
     
        Dim SemaineSaisieE As Byte
        Dim ColonneE As Integer
        Dim derniereligneE As Integer
        Dim SemaineE As String
        Dim Top1, Top2, Top3 As Currency
        Dim Lignetop1, Lignetop2, Lignetop3 As String
        Dim Defauttop1, Defauttop2, Defauttop3 As String
     
     
    Sheets("Récapitulatif_Ligne E").Select
     
    'Saisie du numéro de la semaine
     
    On Error Resume Next
    10:
    SemaineSaisieE = InputBox("Merci de saisir le numéro de semaine à étudier :", "Numéro de semaine à renseigner", "12")
    If Err.Number <> 0 Then
        Exit Sub
    ElseIf SemaineSaisieE = 0 Or SemaineSaisieE > 52 Then
        MsgBox "Erreur de saisie de la semaine." & vbNewLine & "Merci d'indiquer un nombre entre 1 et 52."
        GoTo 10
    End If
     
    On Error GoTo 0
     
    SemaineE = "S" & SemaineSaisieE
     
    'Trouver la dernière ligne du tableau
     
    Range("A2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.End(xlDown).Select
    derniereligneE = ActiveCell.Row
     
    'Rechercher la colonne de la semaine demandée précedemment
    Range("C1").Activate
    Cells.Find(What:=SemaineE, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
     
     
    ColonneE = ActiveCell.Column
     
    ' Ecrire les 3 plus grandes valeurs de la colonne
     
    Range("BI3").Select
    ActiveCell.FormulaR1C1 = "=LARGE(R2C" & ColonneE & ":R" & derniereligneE & "C" & ColonneE & ",1)"
    Top1 = ActiveCell.Value
    Range("BI4").Select
    ActiveCell.FormulaR1C1 = "=LARGE(R2C" & ColonneE & ":R" & derniereligneE & "C" & ColonneE & ",2)"
    Top2 = ActiveCell.Value
    Range("BI5").Select
    ActiveCell.FormulaR1C1 = "=LARGE(R2C" & ColonneE & ":R" & derniereligneE & "C" & ColonneE & ",3)"
    Top3 = ActiveCell.Value
     
    'Chercher la désignation des trois plus grandes valeurs trouvées
     
    Range(Cells(2, ColonneE), Cells(derniereligneE, ColonneE)).Select
    'Application.FindFormat.NumberFormat = "#,##0.00 $"
    Selection.Find(What:=Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    Lignetop1 = ActiveCell.Row
    Defauttop1 = Range("A" & Lignetop1)
    Range("A" & Lignetop1).Select
    Range("BJ3").Value = Defauttop1
     
    'Range(Cells(2, ColonneE), Cells(derniereligneE, ColonneE)).Select
    'Application.FindFormat.NumberFormat = "#,##0.00 $"
    'Selection.Find(What:=€ & Top2, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    'Lignetop2 = ActiveCell.Row
    'Defauttop2 = Range("A" & Lignetop2)
    'Range("A" & Lignetop2).Select
    'Range("BJ4").Value = Defauttop2
     
    'Range(Cells(2, ColonneE), Cells(derniereligneE, ColonneE)).Select
    'Application.FindFormat.NumberFormat = "#,##0.00 $"
    'Selection.Find(What:=€ & Top3, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    'Lignetop3 = ActiveCell.Row
    'Defauttop3 = Range("A" & Lignetop3)
    'Range("A" & Lignetop3).Select
    'Range("BJ5").Value = Defauttop3
     
    'Range("BL4").Select
     
     
     
    End Sub
    Mais sinon comment je gère l'erreur s'il ne trouve pas la valeur?

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Il faut passer par une variable de type "Range" tu la declare :

    En suite tu stocke la cellule trouvée dedans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set MyRange=Selection.Find(What:=Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    Apres tu teste la valeur de ta variable MyRange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If MyRange Is Nothing Then
        MsgBox "Valeur non trouvée sur la plage"
    Else
        MyRange.Activate
    End If
    CB

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2022
    Messages : 5
    Par défaut
    Merci

    Effectivement il ne trouve pas la valeur.

    Est ce que c'est à cause du fait que dans mon excel, la valeur dans la case formule est 1331,4175047961 ? Et quand je lance ma macro, sur la variable Top1, il m'affiche 1331,4175 . Où c'est juste un affichage ?

    Est que la fonction grande valeur troque le nombre de chiffre après la virgule ?

    Nom : Macro.png
Affichages : 482
Taille : 9,6 Ko

    J'ai fais des essais en mettant 1331,4175 dans ma colonne. Il ne trouve pas la valeur. Je ne comprends pas pourquoi.


    Je crois que c'est un problème de format. Car quand je tape un nombre entier, il le trouve

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Oui en fait ca vient de tes declaration de variable, au lieu de "As currency" mets "As double"

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2022
    Messages : 5
    Par défaut
    J'ai essayé String, Single, Double. Il ne la trouve pas

    Est que la fonction Set ne prend en charge que les entiers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set A = Selection.Find(What:=Top1, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 251
    Par défaut
    Hello,
    Set ce n'est pas une fonction, c'est une affection et elle ne s'applique que pour les objets (ex : Range) alors si A n'est pas un Range ou un Objet, le Set A n'est pas correct.
    Ami calmant, J.P

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    JP a raison, l'expression "set" sert a initialiser les variables objet, dans mon exemple je vais initialiser la variable MyRange (objet "range") en lui affectant la valeur que me sortira la fonction Find.

    Ici le but est de trouver une valeur sur une plage, il faut donc que les deux dimensions soient les memes sinon VBA ne va pas trouver.

    Essaye de mettre des espions sur tes variables pour connaitre leur dimension, tu peux egalement declarer en "variant" et ca prendra automatiquement la dimension d'origine.

  12. #12
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Voici un exemple qui illustre la solution (entre autres):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub findNbr()
        Dim Nbr As Double   'très important !!
        Dim myRng As Range
        Nbr = 1331.4175047961
     
        With Sheets("Sheet10").Range("B20:B24")
            Set myRng = .Find(Nbr)
            If Not myRng Is Nothing Then
                MsgBox Nbr & " is in cell " & myRng.Address
            Else
                MsgBox Nbr & " is not found !"
            End If
        End With
        Set myRng = Nothing
    End Sub

Discussions similaires

  1. [MySQL] Erreur sur la fonction mysql_result()
    Par nico26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/01/2007, 15h50
  2. erreur sur la requete present dans vba
    Par laurent.w dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/01/2007, 09h26
  3. erreur sur une fonction
    Par rimbaut dans le forum C
    Réponses: 3
    Dernier message: 01/04/2006, 17h28
  4. Infos sur la fonction select en C
    Par oook dans le forum C
    Réponses: 8
    Dernier message: 07/12/2005, 15h15
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo