Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2011, 17h06   #1
Invité de passage
 
Inscription : janvier 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 7
Points : 2
Points : 2
Par défaut Fonction de recherche entre deux classeurs

Bonsoir,

je m'arrache les cheveux depuis quelques jours sur une fonction de recherche entre deux fichiers. J'ai testé pas mal de fonction différente mais il me manque à chaque fois quelque chose et donc n'arrive pas à faire ce que j'ai envie.

En pièce jointe mes deux fichiers exemples "destination" et "source".
Donc dans le fichier source, je viens lire la cellule B1 avec un texte de longueur variable, de nombre de mot variable mais la constante est: "N* 30 Ans" ou "N* 60 Ans".
A partir de ce chiffre et de ce format, je recherche dans la cellule B2 du fichier destination, l'onglet qui comporte le même format et là on copie la plage B9:B18 du classeur "source" vers le classeur "destination".
Avec une boucle sur tous les onglets de "source" et un message d'erreur si on ne trouve pas de correspondance.


J'arrive à trouver le bon terme mais me manque l'expérience pour réussir à tout faire et regrouper la "source" et là "destination", si vous avez des idées ou la fonction qui peut m'aider, je suis preneur car je n'y arrive pas.

PS: je me débrouille en VBA mais me manque les bases et la pratique.
Fichiers attachés
Type de fichier : xls Source.xls (14,5 Ko, 7 affichages)
Type de fichier : xls Destination.xls (30,5 Ko, 7 affichages)
Nemesis7285 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 09h40   #2
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
J'ai commenté les code, je te laisse faire du tri

Code :
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Sub Macro_Recherche()
 
Dim Str_Plage As String
Dim Cel As Range
Dim FeuilSource As Worksheet, FeuilDestination As Worksheet 'Met des noms qui ont un sens c'est plus simple ensuite
Dim Str_critere As String 'pas d'accent sur les variables
Dim X As Byte
Dim Plage_Str As String
Dim destination As String
Dim ANSpos As Integer, Npos As Integer, LongueurChaine As Integer
Dim NumAns As String
 
'Il faut utiliser des variable pour pointer sur tes fichiers
Dim WbSource As Workbook, WbDestination As Workbook
 
'ensuite tu les définis
'Nul part dans ton code tu ne défini Source, je suppose donc qu'il faut l'ouvrir
Set WbSource = Workbooks("Source.xls") 'Workbooks.Open("Le chemin de ton fihcier Source")
Set WbDestination = ThisWorkbook
 
 
'Str_Plage = "B1:B3"
'Str_critere = "*N* 30 Ans*" 'mot que l'on cherche 'On ira le chercher dans la feuille source
 
'pour chaque onglet de source
'on lit la cellule B1 avec le texte de la forme "*N* 30 Ans*" ou "*N* 60 Ans*"
'on copie B9:B18
'on active cette feuille
'on recherche le texte dans le fichier destination en cellule B2
'on active cette feuille
'on colle B9
 
'il faut préciser sur quel classeur tu travailles
'On boucle sur les feuilles du classeur source
For Each FeuilSource In WbSource.Sheets
    'Je ne comprend pas, il n'y a bien qu'une seule info en cellule B1, pourquoi faire une boucle
    'For Each Cel In Feuil.Range("B1", Feuil.Cells(Feuil.Rows.Count, "B").End(xlUp))
    'Par contre il faut maintenant boucler sur les feuilles du classeur Destination
    'On va devoir isolé le critére à rechercher, il se trouve entre "N°" et "Ans"
    'déjà *N°*
    'Je vais détailler pour que ce soit plus simple a comprendre
    'On prend la position de ANS
    ANSpos = InStr(1, UCase(FeuilSource.Range("B1")), "ANS")
    'ANSpos contient la position du A de Ans dans la chaine Acvba N°1 60 Ans Babdfuibba par exemple
    'On va pointer le s de Ans, on rajoute donc 2 à la valeur trouvé
    ANSpos = ANSpos + 2
    'On prend ensuite la position de N°
    Npos = InStr(1, UCase(FeuilSource.Range("B1")), "N°")
    'Npos pointe sur la position du N
    'On regarde la longueur de la chaine qu'il faut lire entre N et s donc
    LongueurChaine = ANSpos - Npos + 1
 
    'Ensuite on prend une partie du text Acvba N°1 60 Ans Babdfuibba, pour ne garder que N°1 60 Ans
    Str_critere = Mid(FeuilSource.Range("B1"), Npos, LongueurChaine)
    'ici on commence a prendre le texte à partie du N (Npos) et on lit le texte de longueur LongueurChaine
    'On rajoute les * au début et à la fin
    Str_critere = "*" & Str_critere & "*"
 
 
    For Each FeuilDestination In WbDestination.Sheets
        'On regarde si les terme correspondent
        If UCase(FeuilDestination.Range("B2")) Like UCase(Str_critere) Then
            'Feuil.Activate 'inutile de les activer pour travailler avec
            'Cel.Activate
            'X = MsgBox("Mot """ & Str_critère & """ trouvé :" & Chr(13) & _
            "Sur la feuille : " & Feuil.Name & Chr(13) & _
            "à l'adresse : " & Cel.Address(0, 0) & Chr(13) & Chr(13) & _
            "Oui : on arrête la recherche" & Chr(13) & _
            "Non : on continue la recherche " & Chr(13), vbDefaultButton1 + _
            vbQuestion + vbYesNo, "MOT TROUVÉ")
            'destination = Feuil.Name & Chr(13) '?
 
            'Le text est trouvé
            'On copie donc les données contenu dans source vers les classeur Destination
            'Si les donnée sont toujours en B9:B18 on fait comme ça
            FeuilSource.Range("B9:B18").Copy FeuilDestination.Range("B9:B18")
 
            'Select Case X
            '    Case 6
            '        'Feuil.Activate
            '        'Cel.Activate
            '        Exit Sub
            '
            '    Case 2
            '        Exit Sub
            '
            '    Case Else
            '        'on fait rien, mais on pourrait
            'End Select
 
            'Vu qu'on a trouver une correspondance, on passe à la recherche de la feuille Source suivante
            'On pourrait utiliser Exit For, pas exit sub, existe sub quite toute la procédure en cours
            'Mais pour pouvoir tester si une correspondance à été trouver on va utiliser
            GoTo Trouve
        End If
    Next
    'Lorsque Exit For est appellé, on se retrouve ici, mais on ne sait pas si une correspondance a été trouvée
    'Le code qui se trouve ici ne sera executer que si aucune correspondance n'a été trouvée
    MsgBox "Pas de correspondance pour la feuille " & FeuilSource.Name & " du classeur Source"
 
Trouve:     'lorsque goto Trouve est appelé, on se retrouve ici directement, sans executer le code qui se trouve entre Next et Trouve:
    'On pass à la feuille source suivante
Next FeuilSource
 
'MsgBox ("pas trouvé")
End Sub
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2011, 11h21   #3
Invité de passage
 
Inscription : janvier 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 7
Points : 2
Points : 2
Salut,

alors là bravo, je n'aurais jamais eu l'idée d'utiliser ça, j'avais le principe mais pas les fonctions nécessaires !

Problème résolu et simplement et rapidement, merci à toi !!

Et pour ma culture, ce genre de recherche est possible dans le directement dans le nom d'un classeur ou document word ?
Nemesis7285 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 11h35   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
bien sur tu peux rechercher directement dans le nom de ta feuille si là est ta question.
remplace
Code :
FeuilSource.Range("B1")
par
et
Code :
FeuilDestination.Range("B2")
par
et le tour est joué.

Pour Word, il faut faire une recherche sur le forum, mais il est bien entendu possible d'ouvrir un fichier word et de faire une recherche à l’intérieur.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h28.


 
 
 
 
Partenaires

Hébergement Web