Rechercher une une date dans une plage en fonction d'un msgbox [Résolu/Fermé]

Signaler
Messages postés
3
Date d'inscription
jeudi 9 juin 2016
Statut
Membre
Dernière intervention
14 juin 2016
-
Messages postés
3
Date d'inscription
jeudi 9 juin 2016
Statut
Membre
Dernière intervention
14 juin 2016
-
Bonjour,


Voici ma problématique :

J’ai créé une macro avec msgbox demandant de saisir une date ( 01/03/AAAA ou 01/06/AAAA ou 01/09/AAAA ou 01/12/AAAA)

Je souhaiterais qu'en fonction de la date saisie dans le msgbox, cette macro sélectionne une plage dans un autre fichier (ce fichier comprend différente date au format 01/MM/AAAA) puis copie/colle cette plage dans une second fichier.

Le msgbox fonctionne mais je ne sais pas comment écrire la suite : rechercher et sélectionner la plage en fonction de la date saisie dans la msgbox situées dans un autre classeur puis copier les données et les coller dans un autre fichier.

Merci d’avance pour vos réponses.

3 réponses

Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Bonjour Hayat, bonjour le forum,

Explications claires mais pas suffisantes. Manquent :
• Nom et chemin d'accès du premier fichier, Destination (celui qui contient normalement la macro avec la MsgBox)
• Nom et chemin d'accès du second fichier, Source des donnés à coller
• Nom de l'onglet de la recherche du second fichier
• Nom de l'onglet du collage dans le premier fichier
• Cellule où tu veux coller...

L'idéal c'est de joindre les deux fichiers... Tu comprends bien que ce n'est pas à nous de recréer ton environnement (surtout avec si peu d'explication).
Messages postés
3
Date d'inscription
jeudi 9 juin 2016
Statut
Membre
Dernière intervention
14 juin 2016

Bonjour,

je suis débutante en programmation vba.

j'espère être claire.

Le nom du fichier qui contient la macro msg box (date à saisir) est : "macro perf immo.xlsm"

Le nom du fichier et l'onglet de la recherche est : fichier : "Données trimestrielles de perf SCI.xls"
onglet : "Données trimestrielles perf SCI"

Dans cette onglet, les dates sont en colonne M
je souhaites copier les colonnes D à M contenant la date saisie dans le msgbox.

Le nom du fichier et l'onglet du collage est :
fichier : "Performance immobilier.xls"
onglet : "données performance"

les données sont à coller dans les colonnes A à J ( à la suite des données)

Je n'ai pas la possibilité de vous transmettre les fichiers dsl.

Merci pour votre aide.
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149 >
Messages postés
3
Date d'inscription
jeudi 9 juin 2016
Statut
Membre
Dernière intervention
14 juin 2016

Re,

Là au moins c'est clair. je vais regarder ça...
>
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021

Merci
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Bonsoir Hayat,

Essaie ce code à placer dans le classeur : macro perf immo.xlsm. Attention le code considère que les autres classeurs se trouvent dans le même dossier que le classeur de cette macro. Si ce n'est pas le cas, il faudra soit modifier le code, soit ouvrir au préalablement tous les classeurs.
J'ai considéré que les données qui contiennent les dates dans l'onglet Données trimestrielles perf SCI du classeur Données trimestrielles de perf SCI.xls, commençaient à partir de la ligne 2, la première ligne étant réservé pour les étiquettes. Si ce n'est pas le cas il faut, dans la boucle For I = 2..., remplacer 2 par 1 :
Le code commenté :
Sub Macro1()
Dim D As Variant 'déclare la variable D (Date)
Dim DR As Long 'déclare la variable DR (Date Recherchée)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

deb: 'étiquette
D = Application.InputBox("Veuillez taper la date !", "DATE", Type:=2) 'définit la date D
If D = False Then Exit Sub 'si bouton [Annuler], sort de la procédure
'si non renseignée, message puis retourne à D via l'étiquette "deb"
If D = "" Then MsgBox "Vous devez renseigner la date !": GoTo deb
'si date non valide, message puis retourne à D via l'étiquette "deb"
If Not IsDate(D) Then MsgBox "date non valide !": GoTo deb
DR = CLng(CDate(D)) 'définit la date recherchée DR (cela parmet de passer outre les formats de date)

CH = ThisWorkbook.Path & "\" 'définit le chemin CH
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
'définit le classeur source CS (génère une erreur si ce classeur n'est pas ouvert)
Set CS = Workbooks("Données trimestrielles de perf SCI.xls")
If Err <> 0 Then 'condition : si une erreur a été générée
    Err.Clear 'supprime l'erreur
    Workbooks.Open (CH & "Données trimestrielles de perf SCI.xls") 'ouvre le classeur CS (c'est pour cela que CH est important !)
    Set CS = ActiveWorkbook 'définit le classeur source CS
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set OS = CS.Sheets("Données trimestrielles perf SCI") 'définit l'onglet source OS
TV = OS.Range("D1:M" & OS.Range("D" & Application.Rows.Count).End(xlUp).Row) 'définit le tableau des valeurs TV
K = 1 'initialise la variable K
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    'si la valeur ligne I colonne 10 (=> colonne M) convertie en entier long est égale à DR et n'est pas vide
    If TV(I, 10) <> "" And CLng(CDate(TV(I, 10))) = DR Then
        ReDim Preserve TL(1 To 10, 1 To K) 'redimensionne le tableau des lignes TL (10 lignes , K colonnes)
        For J = 1 To 10 'boucle 2 : sur toutes colonne J du tableau des valeurs TV
            TL(J, K) = TV(I, J) 'récupère en ligne J de TL la valeur colonne J de TV (= transposition)
        Next J 'prochaine colonne de la boujcle 2
        K = K + 1 'incrémente K (ajoute une colonne à TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
CS.Close False 'ferme le classeur source CS sans enregistrer
If K > 1 Then 'si K est supérieure à 1 (au moins une occurrence trouvée)
    If K = 2 Then ReDim Preserve TL(1 To 10, 1 To 2) 'si Kest égale à deux (une seule occurrence trouvée) permet l'affichage en ligne
    On Error Resume Next
    'définit le classeur destination CD (génère une erreur si ce classeur n'est pas ouvert)
    Set CD = Workbooks("Performance immobilier.xls")
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err.Clear 'supprime l'erreur
        Workbooks.Open (CH & "Performance immobilier.xls") 'ouvre le classeur CD (c'est pour cela que CH est important !)
        Set CD = ActiveWorkbook 'définit le classeur source CD
    End If 'fin de la condition
    On Error GoTo 0 'annule la gestion des erreurs
    Set OD = CD.Sheets("données performance") 'définit l'onglet OD
    'définit la celllule de destination DEST
    Set DEST = IIf(OD.Range("A1").Value = "", OD.Range("A1"), OD.Range("A" & Application.Rows.Count).End(xlUp).Offset(1, 0))
    'renvoie dans DEST redimensionnée le tableau TL transposé
    DEST.Resize(UBound(TL, 2), UBound(TL, 1)) = Application.Transpose(TL)
End If
End Sub

Bonjour,

Ça fonctionne!merci!


J'ai uniquement un problème de format de date,ça colle la date au format "mm/jj/aaaa" au lieu de "jj/mm/aaaa"

As-tu une solution.
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Bonjour,

Remplace la ligne 54 du code :
TL(J, K) = TV(I, J) 'récupère en ligne J de TL la valeur colonne J de TV (= transposition)


par :
If J = 10 Then TL(J, K) = Format(TV(I, J), "yyyy/mm/dd") Else TL(J, K) = TV(I, J) 'récupère en ligne J de TL la valeur colonne J de TV (= transposition)


Ça devrait fonctionner correctement...
Messages postés
3
Date d'inscription
jeudi 9 juin 2016
Statut
Membre
Dernière intervention
14 juin 2016

Bonjour,

Ça fonctionne. Merci pour ton aide

À plus.