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 :

Fonction Find ou Replace [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Par défaut Fonction Find ou Replace
    Bonjour le forum,

    Le code suivant me sert à ouvrir et à récupérer des données (telles que la moyenne, valeur maximun ...) à partir d'un fichier texte que je copie dans un fichier excell.

    Cependant, je recherche la valeur mimimum des données et celle-ci est parfois égale à zéro (voir fichier texte joint).
    Je souhaite donc ne pas prendre en compte les valeurs égales à zéro et j'ai pour cela utiliser la fonction replace imbriqué dans deux boucles for...
    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
     
    Sub Sheet_resistance()
     
    Dim WB As Workbook
    Dim TreatedFile As Workbook
    Dim Counter As Variant 'Declaration de counter
    Dim a As Integer 'declaration de la varaible a comme nombre entier
    Dim maximum As String
    Dim minimum As String
    Dim i As Integer
    Dim j As Integer
     
    i = 4
    j = 1
     
    Set WB = ThisWorkbook  'creation d'un nouveau fichier
     
    Counter = Application.GetOpenFilename(",*.map", , , , True) 
    If VarType(Counter) = vbBoolean Then Exit Sub
     
    For a = 1 To UBound(Counter)
     
        Set TreatedFile = Application.Workbooks.Open(Counter(a), xlMSDOS)
     
        With TreatedFile
            newname = Worksheets(1).Name
     
            For i = 4 To 8
                For j = 1 To 5
                    If Worksheets(1).Cells(i, j).Value = 0 Then
                        Worksheets(1).Cells(i, j).Value = Replace(Worksheets(1).Cells(i, j).Value, "0", " ")
                    End If
                Next j
            Next i
            maximum = Application.WorksheetFunction.max(range(Cells(4, 1), Cells(9, 5)))
            minimum = Application.WorksheetFunction.Min(range(Cells(4, 1), Cells(9, 5)))
            .Close (False)
         End With
     
        i = 4
        j = 1
     
    Next a 'fin condition
    Ce code fonctionne bien mais je me dit que faire deux boucles for, ça doit pas être terrible et il doit surement y avoir moyen de gagner du temps et que ça soit plus simple.

    J'ai essayé la fonction "find", mais j'avoue que meme avec l'aide et les divers posts sur le net, je n'y suis pas arrivé.

    Y en a t-il parmi vous qui aurait des idées SVP?
    Merci d'avance,
    Johann
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonjour,

    J'ai une super idée : l'enregistreur de macros

    Restons sur les lignes 4 à 8 et les colonnes 1 à 5. De plus, j'ai remplacé "0" par "TEST" histoire de bien voir

    Ca donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("A4:E8").Select
    Selection.Replace What:="0", Replacement:="TEST", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    Ca te plait ?

    EDIT : les Select c'est le mal ! Optimise donc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A4:E8").Replace LeBazarQuiSuit
    Bonne aprèm !

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Oui, tu peux instancier la plage de cellules concernées et n'utiliser qu'une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Plage As Range, Cell As Range
    Set Plage = Worksheets(1).Range(Cells(4, 1), Cells(8, 5))
    For Each Cell In Plage
         If Cell = "0" Then Cell = Replace(Cell, "0", "")
    Next
    Bon après-midi

    Edit
    Je pense que la méthode donnée par DeaD78 est plus rapide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Par défaut
    Merci DeaD78,

    Ta solution me plait, mais je souhaiterai éviter de préciser "A4:E8".

    Je pense qu'avec la piste que tu viens de me donner, ça devrait aller.

    Je vais en profiter pour vous demander des petits renseignements, quitte à passer pour le débutant que je suis

    Pourquoi dans un cas, ce code fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Selection.Replace What:="0", Replacement:="TEST", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    Et dans d'autres cas, celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).Cells(i, j).Value = Replace(Worksheets(1).Cells(i, j).Value, "0", " ")
    J'avoue que je ne comprends pas pourquoi il faut préciser "what" et tout ça dans le premier...

    Merci de m'éclairer

    Johann

    Merci pour vos réponses,

    J'ai essayé la première qui fonctionne bien, même trop bien...

    En effet, il me rempace tous les zéros par TEST... à savoir que si j'ai "510", il me remplace par "51TEST"...

    Je regarde ca de plus près et vous tiens au courant

    Johann

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonne question !

    Je n'ai jamais utilisé cela comme ça donc faudrait que je recherche un petit peu mais je n'ai pas trop le temps là. Mets un coup de F1 dessus, tu seras fixé.

    Sinon, ça aurait été plus simple d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Worksheets(1).Cells(i, j).Value = "0" Then
        Worksheets(1).Cells(i, j).Value = " "
    End If
    Enfin, pour ce que je t'ai proposé, au lieu de Range("A4:E8"), tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dl = Range("A65536").End(xlUp).row
    dc = Range("IV1").End(xlToLeft).column
    Range(Cells(1,1),Cells(dl,dc))
    Ainsi, tu auras une plage "dynamique" où faire ton Replace. En gros, ta plage ira de la cellule A1 à la cellule ayant pour colonne la dernière colonne non vide de la ligne 1 et ayant pour ligne la dernière ligne non vide de la colonne A.

    A bientôt

    Pour ta dernière erreur, remplace xlWhole par xlPart et c'est bon

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Par défaut
    Merci beaucoup....

    Je vois que j'ai encore des progrès et qu'il ne faut pas oublier de faire l'enregistreur de macros de temps en temps...
    J'avais perdu l'habitude...

    Johann

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Pense au petit une fois que tu auras réglé le problème du xlWhole

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Par défaut
    Pour la derniere erreur, il faut bien mettre xlWhole et non xlPart

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    En effet, avec xlWhole, on regarde l'ensemble du contenu de la cellule. Si cet ensemble est égal à la valeur recherchée, alors on remplace. xlPart permet de vérifier chaque caractère et chaque ensemble de caractères contenus dans la cellule. Du coup, en fonction de la recherche, on peut trouver plusieurs fois la même combinaison de caractères dans une cellule (ou pire si la recherche porte sur un seul caractère).

    D'où ton problème !

    Bon Week-End !

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

Discussions similaires

  1. Fonction Find et Replace
    Par beuzy dans le forum SAP
    Réponses: 7
    Dernier message: 11/03/2014, 05h08
  2. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 18h43
  3. [VBA-E]Fonction .find
    Par marie10 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/01/2006, 11h03
  4. [VBA-E] Fonction "FIND"
    Par cinc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/09/2005, 11h16
  5. Cherche Fonction du style replace...
    Par sdchamplas dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/03/2003, 13h54

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