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 :

Recherche de données dans plusieurs feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut Recherche de données dans plusieurs feuilles
    Bonjour,

    j'ai récupéré ce code que j'ai un peu modifié et qui allait jusque là... Mais maintenant je dois faire la même chose mise à part qu'il faut contrôler la saisie qui est fait sur la feuil2 sur totalité des feuilles du classeur sauf la feuil2 bien entendu et la feuil3... Si quelqu'un pouvait me donner un coup d'pouce ce serait fort sympa ! Petite précision le nombre de feuille peut-être aléatoire...
    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
    47
    48
    Sub emp2()
      Dim wksSource As Worksheet
      Dim wksDest As Worksheet
      Dim rSource As Range
      Dim c As Range ' cellule source
      Dim d As Range ' cellule destination
      Dim i As Integer
     
      Set wksSource = Sheets("Feuil2")
      Set wksDest = Sheets("Feuil1")
     
      Set rSource = Range(wksSource.[A1], _
                          wksSource.Cells(wksSource.Cells.SpecialCells(xlLastCell).Row, 1))
      For Each c In rSource
        Set d = TrouveNumero(c.Value, wksDest)
    '    For i = 1 To 6
          AjouteValeur c.Offset(0, i), d, i
    '    Next i
      Next c
    End Sub
     
    Function TrouveNumero(sValue As String, Wks As Worksheet) As Range
      Dim c As Range
      Set c = Wks.Columns(1).Find(What:=sValue, LookAt:=xlWhole, MatchCase:=False)
      If c Is Nothing Then
        ' Attention, la feuille destination doit avoir, au moins, une ligne remplie
        Set c = Wks.Cells(Wks.Cells.SpecialCells(xlLastCell).Row + 1, 1)
        c = sValue
      End If
      Set TrouveNumero = c
    End Function
     
    Sub AjouteValeur(sValue As String, DestCell As Range, nCol As Integer)
    nCol = 2
        If DestCell = "" Then
        Exit Sub
        Else
      If IsEmpty(DestCell.Offset(0, nCol)) Then
        DestCell.Offset(0, nCol) = "new"
      Else
        MsgBox DestCell & " Déjà saisie", vbCritical
       ' Exit Sub
        If InStr(1, DestCell.Offset(0, nCol), sValue) = " " Then
          DestCell.Offset(0, nCol) = DestCell.Offset(0, nCol) & " "
        End If
        End If
        End If
    End Sub

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour

    Pour boucler sur les sheet,
    tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Set wksDest = Sheets("Feuil1")
        For Sheet_number = 1 to Sheets.Count
            Set wksSource = Sheets(Sheet_Number)
            If wkSource <> wksDest 
           ' code detail
            endif
        Next
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Merci pour la réponse mais malheureusement je n'y parvient pas... le code ne passe pas. Il bloque au niveau du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If wksSource <> wksDest

  4. #4
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    et il renvoie quelle erreur?
    Alleï Bonjour chez vous!

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Elle renvoie l'erreur suivante :
    "Erreur d'exécution '438'
    Propriété ou méthode non gérée par cet objet"

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    si je peut me permettre en modifiant le code d'origine je verrais le code plutot comme ça

    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
    Sub emp2()
      Dim wksSource As Worksheet
      Dim wksDest As Worksheet
      Dim rSource As Range
      Dim c As Range ' cellule source
      Dim d As Range ' cellule destination
      Dim i As Integer
     
      Set wksSource = Sheets("Feuil2")
     
      For Each wksDest In Worksheets
        If wksDest.Name <> "Feuil2" And wksDest.Name <> "Feuil3" Then
     
          Set rSource = Range(wksSource.[A1], _
            wksSource.Cells(wksSource.Cells.SpecialCells(xlLastCell).Row, 1))
          For Each c In rSource
            Set d = TrouveNumero(c.Value, wksDest)
    '    For i = 1 To 6
            AjouteValeur c.Offset(0, i), d, i
    '    Next i
          Next c
        End If
      Next
    End Sub
    non ?
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  7. #7
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    permet toi seulement!

    Alleï Bonjour chez vous!

  8. #8
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Resalut,

    il y a une faute dans mon code.

    Voici la correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If wksSource.name <> wksDest.Name then
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Merci Zyhack ! La première partie du code fonctionne mais plus la suite, ou du moins pas comme je l'aimerais. Je m'explique, dans la feuil1 je saisie des chiffre. Mon code doit ensuite aller chercher dans les feuilles suivantes où ce trouve le chiffre et inscrire "new" dans la 3ème colonne sur la même ligne que le n° trouvé. Je vais creuser le truc de mon côté mais si vous avez une idée avant moi, c'est avec plaisir...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    tu avais écris
    Mais maintenant je dois faire la même chose mise à part qu'il faut contrôler la saisie qui est fait sur la feuil2
    si ta source est la feuille 1
    il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set wksSource = Sheets("Feuil1")
    et ne pas traiter les feuilles préciser sur cette ligne j'ai remplacé Feuil2 par Feuil1 et à toi de voir s'il faut vérifier ou pas la feuil3 comme tu l'avais demandé précédemment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If wksDest.Name <> "Feuil1" And wksDest.Name <> "Feuil3" Then
    Je te laisse tester ok
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Je me suis mal exprimé La partie de recherche fonctionne correctement et sur les bonnes feuilles. Le problème c'est que lorsqu'il cherche le n° dans une feuille et qu'il ne le trouve pas, il me l'inscrit à la fin et je ne comprend pas (encore...) pourquoi. Dans les feuilles où il ne trouve pas le n°, il ne doit rien faire, juste passer à la suivante...

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Voilà, j'ai trouvé le code qui fonctionne pour ce que je devais faire
    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 emp2()
      Dim wksSource As Worksheet
      Dim wksDest As Worksheet
      Dim rSource As Range
      Dim c As Range ' cellule source
      Dim d As Range ' cellule destination
      Dim i As Integer
     
      Set wksSource = Sheets("Feuil1")
      For Sheet_Number = 1 To Sheets.Count
        Set wksDest = Sheets(Sheet_Number)
           If wksDest.Name <> "Feuil1" And wksDest.Name <> "Récapitulatif" Then
      Set rSource = Range(wksSource.[A1], _
                          wksSource.Cells(wksSource.Cells.SpecialCells(xlLastCell).Row, 1))
     
      For Each c In rSource
        Set d = TrouveNumero(c.Value, wksDest)
          AjouteValeur c.Offset(0, i), d, i
      Next c
      End If
      Next
      End Sub
     
    Function TrouveNumero(sValue As String, Wks As Worksheet) As Range
      Dim c As Range
      Set c = Wks.Columns(1).Find(What:=sValue, LookAt:=xlWhole, MatchCase:=False)
      If c Is Nothing Then
       End If
      Set TrouveNumero = c
    End Function
     
    Sub AjouteValeur(sValue As String, DestCell As Range, nCol As Integer)
    nCol = 2
        If DestCell Is Nothing Then
        Exit Sub
        Else
      If IsEmpty(DestCell.Offset(0, nCol)) Then
        DestCell.Offset(0, nCol) = "new"
      Else
        MsgBox DestCell & " Déjà saisie", vbCritical
         If InStr(1, DestCell.Offset(0, nCol), sValue) = " " Then
          DestCell.Offset(0, nCol) = DestCell.Offset(0, nCol) & " "
        End If
        End If
        End If
    End Sub
    Je vais encore essayer d'ajouter un message qui me dis si le n° que j'ai saisie dans la feuil1 n'a pas été trouvé... Si quelqu'un a une idée...

  13. #13
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,

    voici une proposition pour ton numéro non trouvé :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub emp2()
      Dim wksSource As Worksheet
      Dim wksDest As Worksheet
      Dim rSource As Range
      Dim c As Range ' cellule source
      Dim d As Range ' cellule destination
      Dim i As Integer
      Dim Found As Boolean
      
      Set wksSource = Sheets("Feuil1")
      For Sheet_Number = 1 To Sheets.Count
        Set wksDest = Sheets(Sheet_Number)
           If wksDest.Name <> "Feuil1" And wksDest.Name <> "Récapitulatif" Then
      Set rSource = Range(wksSource.[A1], _
                          wksSource.Cells(wksSource.Cells.SpecialCells(xlLastCell).Row, 1))
      Found = false
      For Each c In rSource
        Set d = TrouveNumero(c.Value, wksDest)
          AjouteValeur c.Offset(0, i), d, i
        If not d Is Nothing Then
           Found = True
        End If
        
      Next c
      if not found then
          msgbox ("Numéro "& c.Value & "non trouvé" , vbInformation)
      endif
      End If
      Next
      End Sub
     
    Function TrouveNumero(sValue As String, Wks As Worksheet) As Range
      Dim c As Range
      Set c = Wks.Columns(1).Find(What:=sValue, LookAt:=xlWhole, MatchCase:=False)
      If c Is Nothing Then
       End If
      Set TrouveNumero = c
    End Function
     
    Sub AjouteValeur(sValue As String, DestCell As Range, nCol As Integer)
    nCol = 2
        If DestCell Is Nothing Then
        Exit Sub
        Else
      If IsEmpty(DestCell.Offset(0, nCol)) Then
        DestCell.Offset(0, nCol) = "new"
      Else
          MsgBox DestCell & " Déjà saisie", vbCritical
         If InStr(1, DestCell.Offset(0, nCol), sValue) = " " Then
          DestCell.Offset(0, nCol) = DestCell.Offset(0, nCol) & " "
        End If
        End If
        End If
    End Sub
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Merci pour la réponse ! Ca fonctionne mais ce n'est pas idéal. Ce qui serait bien c'est que le message vienne une fois que toutes les feuilles ont été testé et pas avant... Je ne sais pas si c'est possible ?
    Merci d'avance

  15. #15
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Et tu cherches combien de valeurs différentes ? Indéfini ?

    Et tu veux 1 message unique avec toutes les valeurs non trouvées ?
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Je cherche en effet un nombre de valeur indéfini. Par contre je peux avoir un message pour chaque valeur qui n'a pas été trouvé ou un pour l'ensemble, c'est égale, mais après que ça ait bouclé sur toutes les feuilles... Je ne sais pas si c'est jouable...

  17. #17
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    C'est bien sur jouable mais ta logique n'est pas adpatée à cela :

    il te faut pour cela :

    Boucle 1
    Boucle 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Sheet_Number = 1 To Sheets.Count
    ce qui permettrait de tester pour chaque C si on l'a trouvé dans une feuille ou pas et d'agir en fonction.

    Je n'ai pas le temps de le changer pour toi. Fais le et je m'occupe du message après ?

    Ok pour toi.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  18. #18
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Je comprend bien ce que tu veux dire mais par contre c'est pas certain que j'arrive à modifier mon code dans ce sens...

  19. #19
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,

    essaie ceci (non testé)
    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
     
    Sub emp2()
      Dim wksSource As Worksheet
      Dim wksDest As Worksheet
      Dim rSource As Range
      Dim c As Range ' cellule source
      Dim d As Range ' cellule destination
      Dim i As Integer
      Dim Found As Boolean
      Dim missed() As Integer
      Dim i_mis      As Long
     
      Set wksSource = Sheets("Feuil1")
      Set rSource = Range(wksSource.[A1], _
                    wksSource.Cells(wksSource.Cells.SpecialCells(xlLastCell).Row, 1))
      i_mis = 0
      For Each c In rSource
        Found = False
        For Sheet_number = 1 To Sheets.Count
            Set wksDest = Sheets(Sheet_number)
                 If wksDest.Name <> "Feuil1" And wksDest.Name <> "Récapitulatif" Then
                    Set d = TrouveNumero(c.value, wksDest)
                    AjouteValeur c.Offset(0, i), d, i
                    If Not d Is Nothing Then
                        Found = True
                    End If
                 End If
        Next Sheet_number
        If Not Found Then
           ReDim Preserve missed(i_mis To i_mis + 1)
           i_mis = i_mis + 1
           missed(i_mis) = c.value
        End If
      Next c
      For i = 1 To i_mis
       tutu = MsgBox("Numéro " & missed(i) & " non trouvé", vbInformation)
      Next i
      End Sub
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  20. #20
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Points : 54
    Points
    54
    Par défaut
    Quelle talent Merci beaucoup, ça à l'air de fonctionner !

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

Discussions similaires

  1. [XL-2007] Recherche de données dans plusieurs feuilles excel
    Par jerem1 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/01/2014, 22h18
  2. Suppression de données dans plusieurs feuilles
    Par nomade333 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2012, 15h56
  3. [Toutes versions] Recherche de données dans une feuille pour les copier dans une autre
    Par mattdogg97 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/02/2011, 14h22
  4. Rechercher une valeur dans plusieurs feuilles
    Par modus57 dans le forum Excel
    Réponses: 28
    Dernier message: 30/03/2008, 18h54
  5. [VBA-E]Recherche de date dans plusieurs feuilles
    Par atypik dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 05/04/2006, 20h36

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