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 :

Méthode Find ne fonctionne pas tout le temps [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Dévelopeur Excel
    Inscrit en
    Juillet 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Dévelopeur Excel

    Informations forums :
    Inscription : Juillet 2016
    Messages : 27
    Par défaut Méthode Find ne fonctionne pas tout le temps
    Bonsoir

    J'utilise la Méthode Find Pour voir si un argument existe dans ma feuille de calcule (Colonne B)

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Cell_Test = Range("B12:B10000").Find(Concat, LookAt:=xlWhole) '
    If Cell_Test Is Nothing Then
    Si il ne trouve pas de valeur il écrit en dernière ligne / Si il trouve la valeur il écrit sur la ligne désigné

    Or si je quitte excel, que je relance mon application, tout fonctionne
    Si j’exécute le code plusieurs fois, il ne trouve plus la valeur alors qu'elle est bien présente

    J'ai essayer de réinitialiser la variable "Cell_Test" avec = Nothing mais cela ne change rien

    Si quelqu'un avais une piste

    Le code complet:
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
    Sub Enreg()
     
    Worksheets("Ser_Pont").Select
     
    ' Date
    Dim Dat As Date
    Dim Concat As Long
    ' Pont
    Dim Ref_Pont As Variant
    Dim OF_Pont As Variant
    Dim Ind_Pont As Variant
    'Cuve
    Dim Ref_Cuve As Variant
    Dim OF_Cuve As Variant
    Dim Ind_Cuve As Variant
    ' Trompettes
    Dim Ref_Tr As Variant
    Dim OF_Tr_G As Variant
    Dim Ind_Tr_G As Variant
    Dim OF_Tr_D As Variant
    Dim Ind_Tr_D As Variant
     
    Dim Remplit As Variant
     
    Dim Puiss_G As Integer
    Dim Puiss_D As Integer
    Dim Cote_G As Variant
    Dim Cote_D As Variant
    Dim NB_Em As Integer
     
     
    Remplit = Range("N20").Value
    Dat = Range("C5").Value
    Concat = Range("K1").Value
     
    Ref_Pont = Range("G5").Value
    OF_Pont = Range("C7").Value
    Ind_Pont = Range("G7").Value
     
    Ref_Cuve = Range("C9").Value
    OF_Cuve = Range("C11").Value
    Ind_Cuve = Range("G11").Value
     
    Ref_Tr = Range("C15").Value
     
    OF_Tr_G = Range("C20").Value
    Ind_Tr_G = Range("C21").Value
    OF_Tr_D = Range("G20").Value
    Ind_Tr_D = Range("G21").Value
     
     
    Puiss_G = Range("C23").Value
    Puiss_D = Range("G23").Value
    Cote_G = Range("D25").Value
    Cote_D = Range("H25").Value
     
     
     
     
    If Remplit <> 1 Then
    MsgBox "Saisissez les données!!", vbOKOnly + vbCritical, "Information"
    Exit Sub
    Else
     
    '_________________________________________________
     
     
    Worksheets("Archives").Select
     
    'Dé-protection de la feuille
    Dim MDP As Variant
    MDP = Worksheets("Admin").Range("C7").Value
    Sheets("Archives").Unprotect Password:=MDP
     
    Dim Cell_Test As Range
    Dim numéro As Long
    numéro = Concat
    Dim ligne As Integer
    ligne = 0
    Set Cell_Test = Nothing
     
    Set Cell_Test = Range("B12:B10000").Find(Concat, LookAt:=xlWhole) '
     
     
     
     
    If Cell_Test Is Nothing Then
     
    '----------------Pas de valeur trouvé-----------------------
    Dim celluletrouvee As Range
    numéro = 0
     
    Set celluletrouvee = Range("B11:B10000").Find(numero, LookIn:=xlValues)
     
    ligne = celluletrouvee.Row
    'Chercher la dernière ligne et coller les valeurs
    Set Maplage = Range("B" & ligne & ":B" & ligne)
            Maplage.Select
            Range("B" & ligne & ":B" & ligne).Value = Concat
            Range("C" & ligne & ":C" & ligne).Value = Dat
     
            Range("D" & ligne & ":D" & ligne).Value = Ref_Pont
            Range("E" & ligne & ":E" & ligne).Value = OF_Pont
            Range("F" & ligne & ":F" & ligne).Value = Ind_Pont
     
            Range("G" & ligne & ":G" & ligne).Value = Ref_Cuve
            Range("H" & ligne & ":H" & ligne).Value = OF_Cuve
            Range("I" & ligne & ":I" & ligne).Value = Ind_Cuve
     
            Range("J" & ligne & ":J" & ligne).Value = Ref_Tr
     
            Range("K" & ligne & ":K" & ligne).Value = OF_Tr_G
            Range("L" & ligne & ":L" & ligne).Value = Ind_Tr_G
     
            Range("M" & ligne & ":M" & ligne).Value = OF_Tr_D
            Range("N" & ligne & ":N" & ligne).Value = Ind_Tr_D
     
     
    Else
    '--------------------------Valeur trouver-----------------
    ligne = Cell_Test.Row
     
    If MsgBox("Souhaitez vous écraser les valeurs existantes ?", vbYesNo, "Demande de confirmation") = vbYes Then
    'Selection de la ligne et coller les valeurs
            Range("B" & ligne & ":B" & ligne).Value = Concat
            Range("C" & ligne & ":C" & ligne).Value = Dat
     
            Range("D" & ligne & ":D" & ligne).Value = Ref_Pont
            Range("E" & ligne & ":E" & ligne).Value = OF_Pont
            Range("F" & ligne & ":F" & ligne).Value = Ind_Pont
     
            Range("G" & ligne & ":G" & ligne).Value = Ref_Cuve
            Range("H" & ligne & ":H" & ligne).Value = OF_Cuve
            Range("I" & ligne & ":I" & ligne).Value = Ind_Cuve
     
            Range("J" & ligne & ":J" & ligne).Value = Ref_Tr
     
            Range("K" & ligne & ":K" & ligne).Value = OF_Tr_G
            Range("L" & ligne & ":L" & ligne).Value = Ind_Tr_G
     
            Range("M" & ligne & ":M" & ligne).Value = OF_Tr_D
            Range("N" & ligne & ":N" & ligne).Value = Ind_Tr_D
     
     
     
    'If MsgBox("Souhaitez retourner sur la feuille de saisie?", vbYesNo, "Demande de confirmation") = vbYes Then
    'Worksheets("Ser_Pont").Select
    End If
    End If
    End If
    'End If
    If MsgBox("Souhaitez retourner sur la feuille de saisie?", vbYesNo + vbQuestion, "Demande de confirmation") = vbYes Then
    Worksheets("Ser_Pont").Select
    End If
     
    'Vidage des variables
    Dat = Empty
    Concat = Empty
    Ref_Pont = Empty
    OF_Pont = Empty
    Ind_Pont = Empty
     
    Ref_Cuve = Empty
    OF_Cuve = Empty
    Ind_Cuve = Empty
     
    Ref_Tr = Empty
     
    OF_Tr_G = Empty
    Ind_Tr_G = Empty
    OF_Tr_D = Empty
    Ind_Tr_D = Empty
     
     Set Cell_Test = Nothing
     
     
     
    'Cell_Test = Nothing
    'celluletrouvee = Nothing
    numéro = Empty
    Sheets("Archives").Protect Password:=MDP
     
    MDP = Empty
    End Sub
    Cordialement Eric

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je n'ai pas vraiment envie de procéder à une analyse complète des modifs que provoque ton code (qui "touche également à la cellule don concat prend la valeur) avant que tu n'aies vérifié d'abord toi-même ce que contient (lorsque cela ne marche plus) ta variable concat.
    Veux-tu bien procéder à cette vérification et nous confirmer qu'au moment où cela "ne marche pas", la plage fouillée contient bien cette valeur concat ?
    Si tel n'est pas le cas, ce n'est pas la méthode Find, qui est en cause, mais la logique des autres lignes de ton code).

  3. #3
    Membre averti
    Homme Profil pro
    Dévelopeur Excel
    Inscrit en
    Juillet 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Dévelopeur Excel

    Informations forums :
    Inscription : Juillet 2016
    Messages : 27
    Par défaut
    Bonsoir et merci de ta réponse

    La variable "Concat" contient bien la valeur attendu, au début je l'avais déclaré en mode "Variant", Excel la prenait automatiquement en Mode String >> "142142" au lieu de 142142
    J'ai donc modifier en mode As Long et là la valeur est correct. mais j'ai toujours le problème.

    Cordialement Eric

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Si ce que tu rapportes est exact, je n'ai alors aucune explication.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je suppose que tu utilise find/findnext dans ta boucle
    si c'est le cas c'est normal que ce ne fonctionne qu'une fois

    si tu fait un range.find("tavalue",en xlwhole) et que:
    si elle existe tu la modifie alors ton find n'est plus rien et donc nothing donc le find next (erreur!!!!!)

    bien sur si tu utilise simplement un find ca le fait qu'une fois bien entendu sur la première occurrence trouvé

    attention aussi a l'argument
    xlwhole =valeur absolue
    xlvalues =valeur cellule entière
    xlpart = partie de


    ps si la valeur recherché est identique pour toute et que la valeur de remplacement est identique pour toutes
    tu peut faire simplement un cells.replace

    a méditer


    j'attends ta réponse pour voir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre averti
    Homme Profil pro
    Dévelopeur Excel
    Inscrit en
    Juillet 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Dévelopeur Excel

    Informations forums :
    Inscription : Juillet 2016
    Messages : 27
    Par défaut
    Merci Patrick pour ta réponse

    Pour expliquer un peut le context >:
    Sur ma feuille de saisie l'utilisateur doit remplir un N° de Série et un N° individuel
    Ceux ci sont concaténer dans une cellule automatiquement (K1)

    Ensuite je Charge la valeur concaténer dans une variable "Concat" pour la transférer dans la première colonne de ma base de donnée "B"

    jusqu'ici tout va bien.

    Dans mon programme j'utilise deux fois la méthode Find
    La première fois pour vérifier que la ligne n'existe pas déja (c'est celle qui pose problème)
    et le deuxième pour connaitre le N° de la première ligne vide

    J'ai re-tester à l'ouverture d'excel
    Çà fonctionne tant que je ne modifie pas la valeur de concat, mais si celle-ci change et que j’essaie de la charger plusieurs fois, il le fait alors que ma valeur existe

    Je vous joint le fichier:
    Serrage Presse 150t V7.xlsm

    PS le code de sécurité est 1234
    à partir du menu choisir le bouton "Serrage"
    Ensuite tenter l'enregistrement
    Il dit que la ligne existe déjas
    Si on revient a la feuille de saisie est que l'on change le N° d'OF du pont (en C7)
    Que l'on refaire l'enregistrement plusieurs fois c'est là que le problème se pose

    Cordialement Eric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Requête update ne fonctionnant pas tout le temps
    Par feldi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/03/2011, 15h44
  2. Réponses: 6
    Dernier message: 21/12/2010, 20h00
  3. Réponses: 2
    Dernier message: 16/03/2010, 09h49
  4. _POST qui ne fonctionne pas tout le temps
    Par johnson95 dans le forum Langage
    Réponses: 8
    Dernier message: 24/04/2008, 09h45
  5. [AJAX] script ajax qui fonctionne pas tout le temps
    Par krfa1 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/05/2007, 11h12

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