Problème avec fonction recherche et remplace pour le symbole "?" [Résolu/Fermé]

Signaler
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
-
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
-
Bonjour à tous,

J'ai créer une macro qui recherche certaines valeurs (texte) et qui les remplacent soit par une valeur numérique ou bien laisse la cellule vide. Mon problème c'est que, lorsque que je recherche le symbole "?", le reste de ma macro ne s'effectue pas comme elle devrait, mais je n'ai pas de message d'erreur!

Je ne réussi pas à mettre le doigt dessus! Lorsque j'enlève cette ligne
Cells.Replace what:="?", replacement:="", lookat:=xlWhole
, toute ma macro fonctionne très bien!

Quel est le problème?

Voici ma macro complète:
Private Sub CommandButton1_Click()

    Dim nombre As Integer
    Dim QuelFichier()
    Dim Chemin As String, Fichier As String, Nomclasseur As String
    Dim DerLig As Long
    Dim plage As Range
    Dim cible As String
    Dim r As Range
    
    cible = "plein d'eau"
    ChDrive "m"
    ChDir "M:\Entrepot\BDFS\1_Piézomètres\"
On Error GoTo fin
    QuelFichier = Application.GetOpenFilename("Fichier excel(*.xls; *.xlsx),*.xls;*.xlsx", , , , True)
    If IsArray(QuelFichier) Then
        For i = LBound(QuelFichier, 1) To UBound(QuelFichier, 1)
            Workbooks.Open QuelFichier(i)
            '-------------------------------------------
            'Nom de fichier SANS extention en partant du chemin complet
            Nomclasseur = Left(Mid(QuelFichier(i), InStrRev(QuelFichier(i), "\") + 1), Len(Mid(QuelFichier(i), InStrRev(QuelFichier(i), "\") + 1)) - 4)
            '-------------------------------------------
            Application.ScreenUpdating = False
            nombre = ActiveWorkbook.Sheets.Count
            For N = 2 To nombre
                Worksheets(N).Unprotect
            Next N
            For x = 2 To Sheets.Count - 1
                With Sheets(x)
                    Sheets(x).Select
                    Columns("E:O").Select
                    Selection.EntireColumn.Hidden = False
                    DerLig = .Range("F" & Rows.Count).End(xlUp).Row
                    For N = 2 To DerLig
                    With Range("E2" & ":E" & N).Select
                        Cells.Replace what:="plein", replacement:="0", lookat:=xlWhole
                        Cells.Replace what:="cassé", replacement:="", lookat:=xlWhole
                        Cells.Replace what:="brisé", replacement:="", lookat:=xlWhole
                        Cells.Replace what:="?", replacement:="", lookat:=xlWhole
                        Set plage = Range("E2" & ":E" & N)
                        For Each r In plage
                            If UCase(r.Value) = "X" Then
                                If r.Offset(0, 10) = cible Then
                                    r.Value = "0"
                                Else
                                    r.Value = ""
                                End If
                            MsgBox "Valeur X trouvé!"
                            End If
                        Next r
                    
                    End With
                        If .Range("D" & N) <> "" Then
                            If .Range("A" & N) <> "" Then
                                TInfos = .Range("A" & N & ":C" & N)
                            Else
                                .Range("A" & N & ":C" & N) = TInfos
                            End If
                        End If
                    Next N
                    Sheets(x).Range("A2").Select
                End With
            Next x
            nombre = ActiveWorkbook.Sheets.Count
            For N = 2 To nombre
                Worksheets(N).Protect
            Next N
            Chemin = CurDir & "\Transfert\"
            Fichier = Nomclasseur & "_traité" & ".xlsx"
            On Error Resume Next
            ActiveWorkbook.SaveCopyAs Chemin & Fichier
            '-------------------------------------------
        Next i
    Else
        MsgBox "Annuler"
    End If
    UserForm1.Hide
    ThisWorkbook.Saved = True
    Application.ScreenUpdating = True
    UserForm2.Show
    
fin:
Application.Quit

End Sub


Merci beaucoup pour l'aide!

3 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 196
Bonjour,

Le point d'interrogation (?), est un caractère générique qui remplace n'importe quel caractère, alors bien sûr, c'est un cas particulier.

En consultant le support tu as la solution :
https://support.office.com/en-us/article/find-or-replace-text-and-numbers-on-a-worksheet-0e304ca5-ecef-4808-b90f-fdb42f892e90
Cells.Replace what:="~?", replacement:="", lookat:=xlWhole

 Toujours zen
La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.  Antoine de Saint-Exupéry
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1
Merci beaucoup gbinforme pour l'info!
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
2 496
Bonjour tous les deux,

Dites moi, avec un certains nombre de lignes, va être longue à exécuter cette macro...
@Bassmart : un pitit coup de main pour accélérer le bouzin?
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
2 496 >
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020

Pour cela, il nous faudra le classeur contenant la macro + 1 ou 2 classeurs "à ouvrir".

Pour joindre un fichier sur les forums de ccm il faut:
________________________________________________________
- se rendre sur le site : https://www.cjoint.com/
- cliquer sur parcourir
- rechercher le fichier
- cliquer sur ouvrir
- cliquer sur créer le lien Cjoint
- copier le lien
- revenir ici le coller dans une réponse
________________________________________________________
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1 >
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020

Et voilà mes fichiers!

http://www.cjoint.com/c/FDgmzE3B0to, Macro
http://www.cjoint.com/c/FDgmAacIzSo, fichier test
http://www.cjoint.com/c/FDgmAVO8Zqo, fichier test
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1
J'ai une demande, la macro m'avertie présentement chaque fois qu'elle découvre une valeur "x" dans le fichier.

Mais je voudrais qu'elle me donne, seulement à la fin, le nombre total de valeur qui ont été remplacé que ce soit: x, plein, cassé, brisé et ?

Merci beaucoup!
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
2 496
Qu'est censé faire ta macro???
1- ouvrir x fichiers
2- boucler sur toutes les feuilles
3- si, en colonne E on trouve "X" ET qu'en colonne O on a "plein d'eau"
alors la colonne E = "0"
sinon la colonne E = ""
4- remplacer, en colonne E, les cellules contenant plein, cassé, brisé et ? par rien
5- renvoyer le nombre de X, plein, cassé, brisé et ?

C'est bien ça?

Par ec que c'est pas clair...
Tu m'envoie 2 fichiers à traiter, le premier .xlsm ne risque pas d'être ouvert par ta macro et le second ne contient aucun X en colonne E...

Alors, stp, soit clair.
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1 >
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020

Tu presque tout bon!

Je t'explique la macro, la macro me sert à ouvrir un ou plusieurs fichiers excel selon la sélection.

Ensuite pour chacune des feuilles des fichiers sélectionnés, je veux qu'il m'affiche les colonnes masqués entre les colonnes E et O.

Qu'il trouve les valeur "X", comme ton numéro 3.

Ensuite qu'il remplace en colonne E, les cellules contenant plein par 0 et cassé, brisé et ? par rien.

À la fin du traitement, comme ton numéro 5.

On sauvegarde une copie de tous les fichiers ouvert en ajoutant à la fin du nom "_traité" , dans un sous répertoire qui s'appelle Transfert.

On ferme tous les fichiers ouvert sans sauvegarder l'original.

Et pour terminé on ferme quitte l'application!

Je te renvoie une version corrigé pour le fichier 1_test. Tu trouveras des valeurs "X" sur la feuille Z32164 du Fichier 1_test.

N.B: Normalement, je ne fais pas afficher l'ouverture de mes fichiers à l'écran avec le ligne
Application.Visible = False
placé sur la page ThisWorkbook.
Private Sub Workbook_Open()

Application.Visible = False
UserForm1.Show

End Sub

Voici le nouveau fichier 1_Test
http://www.cjoint.com/c/FDgoan5QfYo

J'espère que c'est un peu plus clair!
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
2 496
Qu'il trouve les valeur "X" => ok. Mais ou? Dans qu'elle colonne???

Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1 >
Messages postés
15378
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 octobre 2020

Re,

merci pour l'info! J'ai supprimé un des 2 et je n'ai plus d'erreur de compilation, mais la macro ne fonctionne pas complètement, elle sort en cours d'exécution!
Messages postés
15378
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 octobre 2020
1 379 >
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020

Re,

Pour voir l'erreur, mettre la ligne On Error Goto Fin en commentaire
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1 >
Messages postés
15378
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 octobre 2020

RE,

Ok, j'ai placé On Error Goto Fin en commentaire et là, j'ai une erreur d'exécution 1004 sur la ligne
.Range("A2").select
.
Messages postés
15378
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 octobre 2020
1 379 >
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020

Re,

Normal, l'onglet n'est pas actif. Pourquoi selectionnez-vous cette cellule???
Messages postés
266
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
14 février 2020
1 >
Messages postés
15378
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 octobre 2020

En fait, plus j'y pense et ça ne sert à pas grand chose! Je vais la supprimer, j'ai probablement garder cette ligne qui était là au débout de ma programmation.

En la supprimant, la macro s'effectue correctement!

Merci beaucoup!