Problème cellule "#REF!"

Résolu/Fermé
Pierre - 28 sept. 2020 à 14:57
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 29 sept. 2020 à 15:19
Bonjour,

J'ai mis en place à l'aide d'un bout de code, une condition qui remplace tous les "month" par "mois". Tout fonctionne sauf si une cellule contient "#REF!" pour une erreur de référence.

Ma question est la suivante. Est-il possible en partant de ce code de passer outre l'erreur d'exécution '13' dû aux cellules contenant "#REF!" ?

Sub test()

Dim src As Range, fdest As Worksheet


Dim ws As Worksheet, rng As Range


Dim O As Worksheet 'd?clare la variable O (Onglet)
Dim CEL As Range 'd?clare la variable CEL (CELlule)


For Each O In Worksheets 'boucle 1 : sur tous les onglets du classeur
    'Si le nom de l'onglet contient "month", remplace "month" par "mois"
    If InStr(1, O.Name, "month", vbTextCompare) <> 0 Then O.Name = Replace(O.Name, "month", "mois", 1)
    For Each CEL In O.UsedRange 'boucle 2 : sur toutes les cellules de la plage ?dit?e de l'onglet O
        'Si la cellule contient "'month", remplace "month" par "mois"
        
        If InStr(1, CEL.Value, "month", vbTextCompare) <> 0 Then CEL.Value = Replace(CEL.Value, "month", "mois", 1)

    Next CEL 'prochaine cellule de la boucle 2
Next O 'prochain onglet de la boucle 1


End Sub



Merci d'avance pour votre aide.

4 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
28 sept. 2020 à 16:53
Bonjour,

A l'arrache, a mettre apres les declarations variable

On Error Resume Next

et a la fin

On Error GoTo 0
1
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
28 sept. 2020 à 17:16
Bonjour,

Simplement :
Sub test()
Dim O As Worksheet
  For Each O In Worksheets
    O.Name = Replace(O.Name, "month", "mois", 1)
    O.UsedRange.Replace "month", "mois", 1
  Next O
End Sub


1
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 29 sept. 2020 à 08:49
Les deux tests suivants sont totalement inutiles et chronophages, l'instruction Replace s'en charge :
If InStr(1, xxxx, "month", vbTextCompare) <> 0  Then  .... 

C'est le second qui provoque l'erreur 13 en cas de #REF!.

Par contre
On Error Resume Next
Masque toutes les erreurs :
c'est une méthode où il faut cibler la cause, surtout pas à mettre en début et fin de procédure !

Dans l'éventualité où il faudrait éviter les erreurs #REF! et uniquement celles-là, utiliser le test suivant :
  If Not CEL.Value = CVErr(XlCVError.xlErrRef) Then
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
29 sept. 2020 à 09:49
dans certains cas, je pense qu'il peut être très utile d'éviter d'assigner une valeur à une cellule, et je pense donc qu'il est parfois utile de vérifier la présence de la chaine à remplacer.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
Modifié le 29 sept. 2020 à 15:20
Effectivement, dans les cas où plusieurs alternatives existent ensuite, je dirais même qu'il est indispensable de tester la présence de la chaine à remplacer, mais pas dans le cas actuel où le test positif se traduit uniquement par un remplacement systématique. L'instruction Replace n'effectue le remplacement que si la chaine est présente, il est inutile et chronophage de le doubler par un test préalable.
Et le pire dans ce cas précis, c'est la boucle sur chacune des cellules alors qu'une seule instruction suffit pour toute la plage de cellules.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 sept. 2020 à 17:19
bonjour, suggestion:
    If Not IsError(CEL) Then
        If InStr(1, CEL.Value, "month", vbTextCompare) <> 0 Then
            CEL.Value = Replace(CEL.Value, "month", "mois", 1)
        End If
    End If
1
Merci beaucoup à tous les 3 !
0