[RESOLU ] [VBA] ERREUR 91 - FINDNEXT

ERREUR 91 - FINDNEXT [RESOLU ] [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 10-08-2014 à 18:39:44    

Bonjour à tous,
 
Me revoilà, pour un nouveau problème.
 
J'ai une erreur 91 "Variable objet ou variable de bloc objet With Non défini"
 
Voici le code :
 

Code :
  1. Option Explicit
  2. Dim RechCel, ValRechCarte, PremCell, ValCel, ValCelTab, ValCarte As Variant
  3. Dim ValDecoup As Variant
  4. Sub Btn_test()
  5.    
  6.     With Feuil1.Range("A:A" )
  7.    
  8.         Set RechCel = .Find("BLABLA", , xlValues)
  9.         If Not RechCel Is Nothing Then
  10.             PremCell = RechCel.Address
  11.             Do
  12.                 RechCel.Value = "BLA"
  13.                 Set RechCel = .FindNext(RechCel)
  14.             Loop While Not RechCel Is Nothing And RechCel.Address <> PremCell
  15.         End If
  16.        
  17.         Set RechCel = .Find("BLOUBLOU", , xlValues)
  18.         If Not RechCel Is Nothing Then
  19.             PremCell = RechCel.Address
  20.             Do
  21.                 RechCel.Value = "BLOU"
  22.                 Set RechCel = .FindNext(RechCel)
  23.             Loop While Not RechCel Is Nothing And RechCel.Address <> PremCell    <=========== L'erreur survient ici.
  24.         End If


Merci de votre aide.


Message édité par vb_user le 12-08-2014 à 12:24:26
Reply

Marsh Posté le 10-08-2014 à 18:39:44   

Reply

Marsh Posté le 10-08-2014 à 19:56:17    


           Bonjour,
 
           merci de respecter les règles du forum en éditant le post et en balisant le code via l'icône appropriée …
  

Reply

Marsh Posté le 11-08-2014 à 08:21:15    

Bonjour,
 
Est-ce bon ainsi?

Reply

Marsh Posté le 11-08-2014 à 09:15:05    

Bonjour,
 
Lorsque tu écris :

    Set RechCel = .FindNext(RechCel)
Loop While Not RechCel Is Nothing And RechCel.Address <> PremCell


Il se produit une erreur dans l’évaluation de RechCel.Address lorsque la
valeur n'est pas trouvée puisque RechCel est égal à Nothing
 
Il faut écrire :

    Set RechCel = .FindNext(RechCel)
    If RechCel Is Nothing Then Exit Do
Loop While RechCel.Address <> PremCell


               


---------------
Cordialement, Patrice
Reply

Marsh Posté le 11-08-2014 à 12:06:36    

Merci patrice.
 
Avec ce code  
     

Code :
  1. Set RechCel = .Find("BLABLA", , xlValues)
  2.         If Not RechCel Is Nothing Then
  3.             PremCell = RechCel.Address
  4.             Do
  5.                 RechCel.Value = "BLA"
  6.                 Set RechCel = .FindNext(RechCel)
  7.                 If RechCel Is Nothing Then
  8.                     Exit Do
  9.                 End If
  10.             Loop While RechCel.Address <> PremCell
  11.         End If


 
C'est fonctionnel.
 
Bonne journée


Message édité par vb_user le 12-08-2014 à 10:44:27
Reply

Marsh Posté le 11-08-2014 à 13:47:01    

Re,
 
Lorsqu'il n'y a qu'un seule instruction dans la condition, au lieu de :

   If RechCel Is Nothing Then
        Exit Do
    End If


Tu peux ecrite sur une seule ligne :

   If RechCel Is Nothing Then Exit Do


---------------
Cordialement, Patrice
Reply

Marsh Posté le 11-08-2014 à 14:30:43    

Merci pour l'astuce.
 
J'ai un autre souci; Je sais pas si j'ouvre un autre sujet.
 
Il s'agit d'un bug Excel.
 
je m'explique.
 
Dans script lance des recherches de mots et renomme la cellule.
Mais à un moment, il repart à zéro et ne s'arrête jamais, j'ai donc intégré dans mon code, un if qui stoppe le script si la cellule est inférieur à une cellule précise, il doit s'arrêter. sauf que ma cellule A100 est considéré comme inférieur à A18.
 
Voici mon code pour vous éclaircir :
Cette condition permet d'instancier la variable qui va stopper ma boucle:

Code :
  1. Select ...
  2.   Case Else
  3.        If ValStopRech = "" Then
  4.           ValStopRech = RechCel.Address
  5.        End If
  6. End Select


 
Le bug survient ici :

Code :
  1. Set RechCel = .FindNext(RechCel)
  2.     If RechCel Is Nothing Then
  3.        Exit Do
  4.     ElseIf RechCel.Address < ValStopRech Then
  5.                     Exit Do
  6.     End If


 
J'ai mis le msgbox suivant :
 

msgbox RechCel.Address & " < " ValStopRech


Résultat :
 $A$100 < $A$18;
 
J'ai dû passer par une méthode de split pour que ça marche :

Code :
  1. decoup = Split(ValStopRech2, "$" )
  2. decoup2 = Split(RechCel.Address, "$" )
  3. ElseIf decoup2(1) < decoup(1) Then
  4.    Exit Do
  5. End If


Pourquoi ce bug?
 
Merci pour vos réponses.


Message édité par vb_user le 12-08-2014 à 10:45:17
Reply

Marsh Posté le 11-08-2014 à 17:27:42    

Re,
 
RechCel.Address  renvoie une chaine de caractères alphanumériques et
dans l'ordre alphabétique, le 0 étant avant le 8, il est normal que $A$100 soit avant $A$18
 
Tu aurais pu utiliser RechCel.Row qui renvoi le numéro de ligne sous forme de nombre et tu aurais eu le 18 avant le 100.
 
C'est une des raisons pour lesquelles il est préférable de déclarer correctement chaque variable
plutôt que de tout déclarer comme Variant !
 
 
Edit : Dans 99,9% des cas ce qui semble un Bug Excel est en réalité une erreur dans le développement !


Message édité par patrice33740 le 11-08-2014 à 17:36:22

---------------
Cordialement, Patrice
Reply

Marsh Posté le 11-08-2014 à 22:27:08    

J'ai suivi ta solution mais j'ai du faire des modification pour que ça marche :

Code :
  1. Case Else
  2.                                 If ValStopRech = 0 Then
  3.                                     ValStopRech = RechCel.Row
  4.                                 End If
  5.                                
  6.                         End Select
  7.                 End Select
  8.                
  9.                 Set RechCel = .FindNext(RechCel)
  10.                 If RechCel Is Nothing Or (RechCel.Row < ValStopRech + 1) Then Exit Do.


Merci.


Message édité par vb_user le 12-08-2014 à 10:45:38
Reply

Marsh Posté le 11-08-2014 à 22:42:26    

J'ai un autre souci.
 
Dans ma recherche, j'ai intégré un Sub pour changer de texte selon un valeur trouvée (ex : si dans ma recherche blabla, il trouve aussi le chiffre 1 alors dans ma modification il va mettre "la" en revanche si il trouve le chiffre 2 alors dans ma modification il va mettre "ici".)
Sauf que lors de la première exécution il fait les modifications "la" mais aucune "ici". C'est après la seconde exécution (vu qu'il n'existe plus de chiffre 1) qu'il va me mettre le 0.
 
Voici la procédure appelée:
 
 

Code :
  1. Private Sub ProcCbOwner(LaIci As String)
  2.     Dim LI as String
  3.    
  4.     If Not RechCel.Cells.Find("1", , xlValues) Is Nothing Then
  5.         LI = "la"
  6.     Else
  7.         LI = "ici"
  8.     End If
  9.    
  10.     LaIci= LI


 
Dans mon script principale
       

Code :
  1. Set RechCel = .Find("BLABLA", , xlValues)
  2.         If Not RechCel Is Nothing Then
  3.             PremCell = RechCel.Address
  4.             Do
  5.                 ProcCbOwner LaIci
  6.                 ValCel = RechCel.Value
  7.                 ValCelTab = Split(ValCel, " " )
  8.                 ValDecoup = UBound(ValCelTab)
  9.                
  10.                 Select Case ValCelTab(3) & " " & ValCelTab(4)
  11.                     Case "RO RO"
  12.                         RechCel.Value = LaIci & "LALO " & ValCelTab(ValDecoup - 1) & _
  13.                             " " & ValCelTab(ValDecoup)
  14.                     Case "RI RI"
  15.                         RechCel.Value = LaIci & "LOLI " & ValCelTab(ValDecoup - 1) & _
  16.                             " " & ValCelTab(ValDecoup)
  17.                     Case Else
  18.                         Select Case ValCelTab(3)
  19.                             Case "BLU"
  20.                                 RechCel.Value = LaIci & "LOLU " & ValCelTab(ValDecoup - 1) & _
  21.                                 " " & ValCelTab(ValDecoup)
  22.                             Case "BLO"
  23.                                 RechCel.Value = LaIci & "LELI " & ValCelTab(ValDecoup - 1) & _
  24.                                 " " & ValCelTab(ValDecoup)
  25.                              Case Else
  26.                                 If ValStopRechCarte = 0 Then
  27.                                     ValStopRechCarte = RechCel.Row
  28.                                 End If
  29.                                
  30.                         End Select
  31.                 End Select


 
 
J'ai l'impression que ma recherche initial "BLABLA" se transforme en recherche "BLABLA 1". Parce qu'il saute les cellules contenant "BLABLA 2"
 
Je sais pas si c'est clair.


Message édité par vb_user le 12-08-2014 à 10:46:20
Reply

Marsh Posté le 11-08-2014 à 22:42:26   

Reply

Marsh Posté le 12-08-2014 à 09:31:20    

 
           Partir du principe le VBA ne se trompant jamais ni ne décide quoique ce soit comme « sauter des cellules »,
           c'est donc une erreur de conception et voilà tout !
 
           En fait il manque dans la ligne … Ah zut, le code n'est toujours pas balisé ! …
 

Reply

Marsh Posté le 12-08-2014 à 10:10:39    

;) J'ai balisé le code en allant voir le bbcode de patrice.
 
Lorsque je passe par le sub ProcCbOwner, la valeur de la variable est changée.

Reply

Marsh Posté le 12-08-2014 à 10:14:00    

Du coup, j'ai tout balisé. Peux-tu m'aider maintenant? ;)

Reply

Marsh Posté le 12-08-2014 à 10:21:57    

 
           Solution évidente livrée sur un plateau en utilisant le Générateurs de macros,
           si la recherche porte sur tous les mots commençant par "BLABLA" comme "BLABLA 1", "BLABLA 2", etc …
           modifier alors la ligne n° … Avec quoi as-tu balisé ?‼ Certainement pas avec l'icône dédiée au code ‼  :sarcastic:  
 
           Bref la recherche doit être effectuée avec le paramètre "BLABLA*" …
 

Reply

Marsh Posté le 12-08-2014 à 10:43:21    

Je me suis mal exprimé Marc.
 
Disons que dans mon fichier Excel, j'ai :
 
A1 = "ffsdfsdfsfsd BLABLA 1 kfsdhfshdklruos,ldufvsorbnhsoifgenrnfojzse"
A2 = "ffsdfsdfsfsd BLABLA 2 fvsdfsdf"
A3 = "ffsdfsdfsfsd BLABLA 1 rbnhsoifgenrnfojzse"
A4 = "ffsdfsdfsfsd BLABLA 2 kfsdhfshdklruos,"
 
Avec mon script, le résultat final sera ainsi :
A1 = "la BLABLA"
A2 = "ici BLABLA"
A3 = "la BLABLA"
A4 = "ici BLABLA"
...
 
Je cherche le terme dans la cellule et je le modifie dans un texte plus clair.
Je passe par une procédure supplémentaire afin d'ajouter à mon texte final "la" ou "ici.
 
Si je supprime ma procédure ProcCbOwner, il me modifiera l'ensemble des cellulles soit A1 à A4. Si je l'active, il ne me modifie que A1 et A3.
 
Ce qui fait que ta solution ne me convient pas.
 
Ps : je vais modifier le balisage avec la bonne balise C/C++.


Message édité par vb_user le 12-08-2014 à 10:48:34
Reply

Marsh Posté le 12-08-2014 à 12:23:39    

Marc vous avez raison sur un point la solution est évidente.
Je m'explique dans mon script ligne 7 (vive le balisage ;)) . Je découpe ma recherche, il suffisait de récupérer l'information dans la "découpe" pour modifier ma variable LI.
 
J'ai cherché compliqué alors que c'était simple.
 
Merci à vous 2.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed