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 :

je perd la valeur Findnext [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Billets dans le blog
    1
    Par défaut je perd la valeur Findnext
    Bonjour voilà mon code,
    il y a un bloc qui est en "commentaire", c'est une boucle For au milieu d'une boule Do... while qui est elle meme dans un With...

    lorsque je desactive le For J ma boucle tourne bien, et le findnext aussi,
    lorsque j'essaie d'inserer la boucle For J, lorsque j'arrive a la valeur Findnext,
    elle est a "0" ?? et je ne comprend pas pourquoi...?
    y a un souci dans l'imbrication, je pense.. mais je vois pas... comment
    ecrire

    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
    44
    45
    46
    Sub recupMpower()
    Dim i As Integer
    Dim j As Integer
    'Dim tpsTrav As Range
    Dim ws As Worksheet
    Dim zoneMpower As Range
    Dim codehor As Range
    Dim ligne As Range
    Set ligne = Range("d506").CurrentRegion
    Worksheets("PARAMETRES").Activate
    Range("D507").Select
    If ActiveCell = "" Then
                 For i = 4 To Worksheets.Count
                ActiveCell = Worksheets(i).Name
                ActiveCell.Offset(1, 0).Select
                Set zoneMpower = Worksheets(i).Range("E6:E75")
                    With zoneMpower
                    Set recupnom = .Find(M, LookIn:=xlValues)
                    If Not recupnom Is Nothing Then
                    firstAddress = recupnom.Address
                    Do
                   ActiveCell = recupnom.Offset(0, -1).Value
     
    'c'est ce bloc qui semble bloqué....
    '                   For j = 1 To 31
    'tpsTrav = recupnom.Offset(0, j).Value
    'Set codehor = Worksheets(i).Range("AN6:AN66")
    'If tpsTrav = "R" Or tpsTrav = "r" Then
    'GoTo erreur1
    'End If
    'With codehor
    'hr = .Find(tpsTrav, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 4).Value
    'End With
    'If hr = 0 Then
    'erreur1:
    'hr = ""
    'End If
    'ActiveCell.Offset(0, j) = hr
    '            Next j
                   ActiveCell.Offset(1, 0).Select
         ' et la dessous recupnom qui a la valeur de la variable M, passe à 0 '??          
                   Set recupnom = .FindNext(recupnom)
                    Loop While Not recupnom Is Nothing And recupnom.Address <> firstAddress
                   End If
                    End With
                   Next i

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    tout d'abord essaie d'indenter ton code et en entier
    comme tu le fais, c'est illisible.

  3. #3
    Membre éclairé

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    indenter... c'est organiser;..?

    alors voilà, j'ai fait du ménage...
    c'est je pense plus lisible..

    merci

    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 recupMpower()
    Dim i As Integer
    Dim j As Integer
    Dim zoneMpower As Range
    Dim codehor As Range
     
    Worksheets("PARAMETRES").Activate
    Range("D507").Select
     
    If ActiveCell = "" Then
        For i = 4 To Worksheets.Count
         Set zoneMpower = Worksheets(i).Range("E6:E75")
         Set codehor = Worksheets(i).Range("AN6:AN66")
         ActiveCell = Worksheets(i).Name
         ActiveCell.Offset(1, 0).Select
            With zoneMpower
             Set recupnom = .Find(M, LookIn:=xlValues)
                If Not recupnom Is Nothing Then
                firstAddress = recupnom.Address
                    Do
                        ActiveCell = recupnom.Offset(0, -1).Value
                        For j = 1 To 31
                        tpsTrav = recupnom.Offset(0, j).Value
                            If tpsTrav = "R" Or tpsTrav = "r" Then
                            GoTo erreur1
                            End If
                        With codehor
                        hr = .Find(tpsTrav, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 4).Value
                        End With
                            If hr = 0 Then
    erreur1:
                            hr = ""
                            End If
                        ActiveCell.Offset(0, j) = hr
                        Next j
            .FindNext (recupnom)
            ActiveCell.Offset(1, 0).Select
                    Loop While Not recupnom Is Nothing And recupnom.Address <> firstAddress
                End If
            End With
        Next i
    End If
    End Sub
    C'est plus lisible ?

    j'etais en train de relire en pas a pas mon code,
    en fait j'ai l'impression que lorsque j'arrive au findnext, il trouve le premier resultat.. donc a la meme adresse, et ma boucle ne continue pas...
    mais pourquoi....??? je ne sais pas...
    ca m'enerve !!!!

  4. #4
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Bonsoir djoumusic , le forum
    une chose est sûre, l'intentation c'est pas ça. Et à partir de là il est difficile de lire les blocs d'instructions. Donc difficile de trouver des erreurs.

    Queslques remarques :



    ESVBA

  5. #5
    Membre éclairé

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    ok pour le ucase...
    je ne savais pas bien l utiliser.. maintenant je comprends..

    M est une constante
    les find et findnext doivent se suivre...?

    j utilise le resultat du 1er find pour recupere son resultat dans une variable d'un autre find... et ca marche bien..
    sauf quand je sors de la boucle.. l'adresse du 1er find semble disparaitre...
    donc je ne peux plus faire mon findnext...

  6. #6
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut
    Franchement, ton code n'est pas correctement présenté. Comment s'y retrouver rapidement ? (intentation : toute instruction à exécuter entre deux bornes est décalée vers la droite d'un nombre constant de caractère espace))


    oui, ils doivent se suivre...


    mais en regardant l'aide Excel :
    Range.Find, méthode
    Cette méthode recherche des informations spécifiques dans une plage.
    Syntaxe

    expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

    expression Variable qui représente un objet Range.

    Paramètres

    Nom Obligatoire/Facultatif Type de données Description
    What Obligatoire Variante Données à rechercher. Il peut s'agir d'une chaîne ou de tout autre type de données Microsoft Excel.
    After Facultatif Variante Cellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur. Notez que l'argument After doit correspondre à une seule cellule de la plage. Rappelez-vous que la recherche commence après cette cellule ; la cellule spécifiée n'est pas recherchée jusqu'à ce que la méthode revienne à cette cellule. Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage. LookIn Facultatif Variante Type d'informations.
    LookAt Facultatif Variante Il peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.
    SearchOrder Facultatif Variante Il peut s'agir de l'une des constantes XlSearchOrder suivantes : xlByRows ou xlByColumns.
    SearchDirection Facultatif XlSearchDirection Direction de la recherche.
    MatchCase Facultatif Variante True pour que la recherche respecte la casse. La valeur par défaut est False.
    MatchByte Facultatif Variante S'utilise uniquement si vous avez sélectionné ou installé la prise en charge des langues codées sur deux octets. True pour que les caractères codés sur deux octets ne correspondent qu'aux caractères codés sur deux octets. False pour que les caractères codés sur deux octets correspondent à leurs équivalents codés sur un octet.
    SearchFormat Facultatif Variante Format de la recherche.

    Valeur renvoyée
    Objet Range qui représente la première cellule où ces informations sont trouvées.

    Remarques


    Cette méthode renvoie Nothing si aucune correspondance n'est trouvée. La méthode Find n'affecte pas la sélection ni la cellule active.

    Les paramètres des arguments RechercherDans, Regarder, OrdreRecherche et RespecterNbreOctets sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucune valeur pour ces arguments lors du prochain appel à la méthode, les valeurs enregistrées sont utilisées. Le fait de définir ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments explicitement chaque fois que vous utilisez cette méthode.

    Les méthodes FindNext et FindPrevious permettent de répéter la recherche.

    Lorsque la recherche atteint la fin de la plage de recherche spécifiée, elle revient au début de cette plage. Pour arrêter une recherche lorsqu'elle revient au point de départ, enregistrez l'adresse de la première cellule trouvée, puis comparez l'adresse de chaque cellule ultérieurement trouvée avec l'adresse enregistrée.

    Pour effectuer des recherches plus complexes, utilisez une instruction For Each...Next avec l'opérateur Like. Par exemple, le code suivant effectue une recherche dans toutes les cellules de la plage A1:C5 qui utilise une police dont le nom commence par les lettres Cour. Lorsque Microsoft Excel trouve une cellule correspondante, il lui affecte la police Times New Roman.

    For Each c In [A1:C5] If c.Font.Name Like "Cour*" Then c.Font.Name = "Times New Roman" End If Next



    Exemple


    Cet exemple montre comment rechercher toutes les cellules de la plage A1:A500 dans la première feuille de calcul contenant la valeur 2 et comment la remplacer par la valeur 5.

    Visual Basic pour Applications
    With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
    firstAddress = c.Address
    Do
    c.Value = 5
    Set c = .FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    End With


    © 2009 Microsoft Corporation. Tous droits réservés.
    Il faut mémoriser la position avant la seconde recherche et lorsque cette dernière est terminée, on poursuit la première recherche en utilisant le paramètre after.

    ESVBA

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

Discussions similaires

  1. [PHP 5.3] [POO] Objet persistant qui perd la valeur de ces attributs
    Par Michel Rotta dans le forum Langage
    Réponses: 20
    Dernier message: 22/04/2011, 01h49
  2. [XL-2007] Je perds ma valeur de variable
    Par eliot.raymond dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 26/06/2009, 17h10
  3. Réponses: 2
    Dernier message: 20/04/2009, 11h46
  4. Pourquoi ma variable perd sa valeur ?
    Par Bruno29 dans le forum Flash
    Réponses: 10
    Dernier message: 17/01/2007, 20h56
  5. Variable qui perd sa valeur
    Par thierry-69007 dans le forum Delphi
    Réponses: 5
    Dernier message: 14/12/2006, 13h18

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