Problème avec fonction recherche et remplace pour le symbole "?"

Résolu/Fermé
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - Modifié par bassmart le 5/04/2016 à 13:53
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 11 avril 2016 à 18:47
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!
A voir également:

3 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
Modifié par gbinforme le 5/04/2016 à 22:13
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.microsoft.com/en-us/office/find-or-replace-text-and-numbers-on-a-worksheet-0e304ca5-ecef-4808-b90f-fdb42f892e90?ui=en-us&rs=en-us&ad=us
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
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
6 avril 2016 à 13:43
Merci beaucoup gbinforme pour l'info!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
6 avril 2016 à 12:20
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?
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
6 avril 2016 à 13:48
Bonjour pijaku,

effectivement la macro est longue d'exécution! Je pensais que c'était dû aux nombres de fichiers excel à traités, en plus chaque fichiers peut contenir plusieurs feuilles.

C'est certain que si on peux améliorer la vitesse, je ne dit pas non!

merci!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023
6 avril 2016 à 14:00
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
________________________________________________________
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
6 avril 2016 à 14:28
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
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
6 avril 2016 à 14:33
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!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
6 avril 2016 à 15:14
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
6 avril 2016 à 16:23
Qu'il trouve les valeur "X" => ok. Mais ou? Dans qu'elle colonne???

0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
6 avril 2016 à 18:19
Toujours dans la colonne E (L1), qui correspond à des lectures en mètre. Ces valeurs doivent absolument être des valeurs numériques, c'est pourquoi, je remplace les valeurs X, ?, cassé, brisé, etc.. par 0 ou par rien.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023
6 avril 2016 à 18:35
Bon.
Tu va tester ça sur des copies de deux trois classeurs cibles.
Ok?
Par contre, dans les commentaires de la macro, tu verras ceci (je n'ai pas compris ce que tu cherches à faire. Rien à mon avis...) :
            'CETTE PARTIE LA EST ENCORE A M'EXPLIQUER :
            '            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
            '------------ FIN EXPLICATIONS


J'ai également ajouté le .Close sur ActiveWorkbook... Mais je ne suis pas sur de moi à 100%...

Option Explicit

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
    Dim CptPlein As Long, CptCasse As Long, CptBrise As Long, CptInterr As Long, CptX As Long
    
    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)
                    .Unprotect
                    Sheets(x).Columns("E:O").EntireColumn.Hidden = False
                    DerLig = .Range("E" & Rows.Count).End(xlUp).Row
                    For N = 2 To DerLig
                        Select Case .Range("E" & N).Value
                            Case "plein"
                                .Range("E" & N).Value = 0
                                CptPlein = CptPlein + 1
                            Case "cassé"
                                .Range("E" & N).Value = ""
                                CptCasse = CptCasse + 1
                            Case "brisé"
                                .Range("E" & N).Value = ""
                                CptBrise = CptBrise + 1
                            Case "?"
                                .Range("E" & N).Value = ""
                                CptInterr = CptInterr + 1
                            Case "X", "x"
                                CptX = CptX + 1
                                If .Range("E" & N).Offset(0, 10) = cible Then
                                    .Range("E" & N).Value = ""
                                Else
                                    .Range("E" & N).Value = 0
                                End If
                            Case Else
                        End Select
                    Next N
                    .Protect
                End With
            Next x
            'CETTE PARTIE LA EST ENCORE A M'EXPLIQUER :
            '            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
            '------------ FIN EXPLICATIONS
            '        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
            With ActiveWorkbook
                .SaveCopyAs Chemin & Fichier
                '!!!!!!!!!!!!!! A TESTER
                .Close
            End With
            '-------------------------------------------
        Next i
    Else
        MsgBox "Annuler"
    End If
    MsgBox "Vous avez corrigé :" & vbCrLf & _
                CptX & " X," & vbCrLf & _
                CptBrise & " brisé," & vbCrLf & _
                CptCasse & " cassé," & vbCrLf & _
                CptInterr & " ?," & vbCrLf & _
                CptPlein & " plein."
    UserForm1.Hide
    ThisWorkbook.Saved = True
    Application.ScreenUpdating = True
    UserForm2.Show
    
fin:
Application.Quit
End Sub
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
6 avril 2016 à 21:13
Merci beaucoup, je teste ça!

Pour les lignes que tu mentionnent, je vient de me souvenir!

C'est un aspect quand même important que j'avais complètement oublié, désolé!

C'est que dans les colonnes A, B et C se retrouve des valeurs mais seulement sur la première ligne de chacune des nouveaux emplacement de lecture. Donc, il me faut recopier cette valeur jusqu'à la prochaine valeur différente de la colonne C.

Alors la macro, détecte la dernière ligne non vide de la colonne D parce que c'est la première colonne de la feuille à contenir des valeurs jusqu'à la fin. Recopie la valeur de la colonne A, B et C jusqu'à la nouvelle valeur de la colonne C.

Merci pour le coup de main!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023
7 avril 2016 à 07:45
Bonjour,

Ce que tu as codé ne correspond pas du tout à ce que tu me dis concernant les colonnes A, B et C...

Bon attendons déjà de faire fonctionner le reste, on reviendra là dessus après.
0
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
7 avril 2016 à 15:22
Bonjour,

Bon, j'ai testé le tout!

Pour de ce qui est de la vérification de la valeur "X" dans la colonne E si le texte de la colonne O est égale à "plein d'eau", la valeur de la colonne E est alors égale "0". Ne fonctionne pas, voir feuille Z32164 (fichier1_test).

Pour le reste ça fonctionne bien!

Pour le code concernant les colonnes A, B et C, je ne suis pas un expert et ce n'est pas moi qui l'écrit, mais c'est ce que ça fait en gros! C'est probablement mon explication qui est erroné, mais le résultats que j'ai c'est ça.

Merci beaucoup!
0