Recherche info dans BDD

Bonjour

Je viens vers vous pour de l'aide à nouveau, sur le fichier joint je souhaites à récupérer les infos dans la base de données afin de remplir la feuille "Piquet" par rapport au choix de la date.

Merci a vous

24recherche-info.xlsm (17.30 Ko)

Bonjour,

un début de solution ici (pour le haut de ton tableau piquet

P.

22recherche-info.xlsm (26.47 Ko)

Bonjour Pampaero,

voilà un essai dis moi si cela te conviens.

Cordialement

19recherche-info.xlsm (19.02 Ko)

Bonjour le fil, bonjour le forum,

Une autre proposition VBA avec la macro événementielle Change ci-dessous :

Private TEST As Boolean 'déclare la variable TEST

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim D As Worksheet 'déclare la variable D (onglet Data)
Dim DC As Date 'déclare la variable DC (Date Cherchée)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim T As Boolean 'déclare la variable T (Trouvé)
Dim DT As Date 'déclare la variable DT (Date trouvée)
Dim LI As Integer 'déclare la variable LI (Ligne)

If TEST = True Then Exit Sub 'si la variable TEST est [Vrai], sort de la procédure
If Target.Address <> "$C$6" Then Exit Sub 'si le changement a lieu ailleurs qu'en C6, sort de la procédure
TEST = True 'définit la variable TEST
Range("C13:N24").ClearContents 'vide la plage C13:N24
Set D = Sheets("Data") 'définit l'onglet D
'définit la date cherchée (en numéro de série de date de la cellule C6)
DC = DateSerial(Year(Target), Month(Target.Value), Day(Target.Value))
TC = D.Range("A1").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de ligne NL du tableau de cellules TC
Application.ScreenUpdating = False 'masque les rafraîchissement d'écran
For I = 3 To NL 'boucle sur toutes les lignes I de TC
    'définit la date trouvée DT (numéro de série de date de la valeur ligne I colonne 1 de TC)
    DT = DateSerial(Year(TC(I, 1)), Month(TC(I, 1)), Day(TC(I, 1)))
    If DT = DC Then T = True: Exit For 'si les date sont identiques, définit la varoable PT, sort de la boucle
Next I 'prochaine ligne de la boucle
If T = False Then MsgBox "Aucune donnée à cette date !": GoTo fin 'si T est [faux], message, va à l'étiquette "fin"
LI = I 'définit la ligne LI
For J = 1 To 12 'boucle sur les 12 lignes du tableau "Personnels planifiés"
    Cells(12 + J, 3).Value = TC(LI, 2) 'récupère le nom
    Cells(12 + J, 7).Value = TC(LI, 3) 'récupère l'heure de début
    Cells(12 + J, 8).Value = TC(LI, 4) 'récupère l'heure de fin
    Range(Cells(12 + J, 9), Cells(12 + J, 10)).Value = TC(LI, 5) 'récupère le poste
    Cells(12 + J, 11).Value = TC(LI, 6) 'récupère l'événement
    LI = LI + 1 'incrément la ligne LI
Next J 'prochaine ligne de la boucle
fin: 'étiquette
TEST = False 'réinitialise la variable TEST
Range("C6").Select 'sélectionne la date éditée
Application.ScreenUpdating = True 'affiche les rafraîchissement d'écran
End Sub
30pompaero-v01.xlsm (28.45 Ko)

Bonjour ThauThème

Je viens de jeter un œil sur ta proposition cela correspond de très prêt à mes souhaits, mais un petit hic tout de même , chose que j'aurai dû dire avant il est possible de ne pas avoir les 12 noms sur une date d'où le bug que je rencontre.

Bug sur cette ligne :

Cells(12 + J, 3).Value = TC(LI, 2) 'récupère le nom

Quand à bigdaddy154 et patrick1957 vos propositions sont également interressantes, je les garde sous le coude et vais les étudier à tête reposé. Je reviens vous dire ce qui en ai plus tard.

Merci à vous 3

Cdlt

Re,

Si il y a bug, il y a message... Quel est le message car je ne comprends pas le bug ?!... Si TC(I, 2) est vide la cellule correspondante sera vide aussi... J'ai supprimé des noms dans l'onglet Data et je n'ai pas eu de bug...

Re.

Quand je rallonge la BDD avec l'enregistrement des noms, au lieu de 12 Noms j'en ai mis que 8, alors lors de la recherche à l'aide de la date les 2 derniers noms dans le petit tableau correspondent à la date suivante.

J'ai fais un petit exemple pour mieux visualiser.

22pompaero-v02.xlsm (28.18 Ko)

Re,

Ok j'ai compris (c'eût été plus malin de la faire dans ton premier fichier...) Je regarde ça demain quand je me lève (c'est à dire tard...)

Bonjour 2eme essai

Cordialement

28recherche-info.xlsm (27.07 Ko)

Bonjour le fil, bonjour le forum,

Le code modifié :

Private TEST As Boolean 'déclare la variable TEST

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim D As Worksheet 'déclare la variable D (onglet Data)
Dim DC As Date 'déclare la variable DC (Date Cherchée)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim T As Boolean 'déclare la variable T (Trouvé)
Dim DT As Date 'déclare la variable DT (Date trouvée)
Dim LI As Integer 'déclare la variable LI (Ligne)

If TEST = True Then Exit Sub 'si la variable TEST est [Vrai], sort de la procédure
If Target.Address <> "$C$6" Then Exit Sub 'si le changement a lieu ailleurs qu'en C6, sort de la procédure
TEST = True 'définit la variable TEST
Range("C13:N24").ClearContents 'vide la plage C13:N24
Set D = Sheets("Data") 'définit l'onglet D
'définit la date cherchée (en numéro de série de date de la cellule C6)
DC = DateSerial(Year(Target), Month(Target.Value), Day(Target.Value))
TC = D.Range("A1").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de ligne NL du tableau de cellules TC
Application.ScreenUpdating = False 'masque les rafraîchissement d'écran
J = 1 'initialise la variable j
For I = 3 To NL 'boucle sur toutes les lignes I de TC
    'définit la date trouvée DT (numéro de série de date de la valeur ligne I colonne 1 de TC)
    DT = DateSerial(Year(TC(I, 1)), Month(TC(I, 1)), Day(TC(I, 1)))
    If DT = DC Then
        T = True
        Cells(12 + J, 3).Value = TC(I, 2) 'récupère le nom
        Cells(12 + J, 7).Value = TC(I, 3) 'récupère l'heure de début
        Cells(12 + J, 8).Value = TC(I, 4) 'récupère l'heure de fin
        Range(Cells(12 + J, 9), Cells(12 + J, 10)).Value = TC(I, 5) 'récupère le poste
        Cells(12 + J, 11).Value = TC(I, 6) 'récupère l'événement
        J = J + 1
    End If
Next I 'prochaine ligne de la boucle
If T = False Then MsgBox "Aucune donnée à cette date !" 'si T est [faux] message
TEST = False 'réinitialise la variable TEST
Range("C6").Select 'sélectionne la date éditée
Application.ScreenUpdating = True 'affiche les rafraîchissement d'écran
End Sub

Bonjour bigdaddy154 et ThauThème

Je viens de regarder vos propositions les 2 correspondent à mes souhaits (il va falloir que je tire au sort maintenant !!! ) . parfais parfais à vous .

Juste une petite question à bigdaddy, dans les formules sous le tableau "=SIERREUR(DECALER($B$12;EQUIV("CM";$I$13:$I$24;0);1;1;1);"")" pourquoi prend tu le référence B12 alors qu'elle vide ?

Cdlt

Re pourquoi je prend B12 :

Colonne B c'est totalement arbitraire j'aurais très bien pu prendre la C

Ligne 12 parce que tout simplement equiv me donnera au minimum 1 et donc comme j'utilise le résultat d'equiv dans decaler j'ai pris la ligne juste au dessus (je suis pas sur d’être clair )

Cordialement

Re

Pour moi pas trop (Claire , non !!) mais j'imagine qu'il faut un point de départ pour Equiv avec Décaler et donc tu prend une cellule au hasard (dans ce cas C12).

suis-je sur la bonne vois ????

Oui tu es sur la bonne voie

Bonjour

nickel je commence à comprendre un peu !!!

J'ai bien avancé dans mon projet, je vois pratiquement la fin grasse à vous .

Merci à toi, ThauThème et bigdaddy154 pour l'aide sur ce post. Je mets résolu maintenant.

Cdlt

Rechercher des sujets similaires à "recherche info bdd"