Trouver et copier une plage de données entre 2 cellules

Bonjour,

Je suis plus ou moins débutant sur Excel et j'aimerais rechercher 2 valeurs dans une colonne puis copier toutes les cellules qui se trouvent entre ces 2 valeurs.

Plus explicitement, imaginons que je dispose d'une feuille avec des dates classées mais avec un intervalle différent en colonne A et par ailleurs une autre feuille contenant un tableau qui comporte en ligne différents évènements et dont la colonne 2 et 3 présentent les dates que je souhaite trouver dans mon autre feuille.

Ainsi, j'aimerais, pour chaque ligne, recopier toutes les dates qui se trouvent entre la date 1 (colonne 2) et la date 2 (colonne 3). Vous trouverez un aperçu de mon exemple en pièce jointe.

De plus, si cela est possible, j'aimerais automatiser le tout grâce à une macro afin de créer une feuille pour chaque ligne du tableau.

Bien évidemment je vous demande cela car je dispose d'un fichier comportant 180 lignes, ce qui rend la chose beaucoup plus difficile qu'avec seulement 20 lignes.

Merci par avance pour votre aide.

10exemple.xlsx (176.47 Ko)

Bonjour,

pas sûr que ce soit moi qui réponde, c'est juste pour que tu complètes

recopier toutes les dates qui se trouvent entre la date 1 (colonne 2) et la date 2 (colonne 3).

On a compris l'idée mais on a que des #REF! comme dates (fichier lié, copie-colle les valeurs)

On a l'impression que c'est toutes les dates du lundi au vendredi. Si c'est ça on n'a pas besoin de la liste. Tu confirmes ?

afin de créer une feuille pour chaque ligne du tableau.

Qui ressemble à quoi ? Mettre une feuille modèle si besoin

Qui s'appellera comment ?

eric

Merci pour ton intervention j'avais effectivement oublié de coller en valeur. Je viens de mettre à jour mon fichier exemple.

Effectivement il s'agit des dates d'ouverture du marché à Hong-Kong. Globalement le marché est ouvert du lundi au vendredi, néanmoins il y a parfois des jours fériés ce qui complique la chose. Par ailleurs la durée d'étude s'étend de 2005 à 2016 c'est pour cela qu'aucune régularité n'est envisageable. Dans mon exemple je n'ai présenté qu'une petite partie des dates mais le fichier initial compte pratiquement 4000 lignes.

Le but final est d'avoir une feuille pour chaque évènement (qui portera le nom de l'évènement) avec une colonne comportant les dates et une autre colonne comportant les cours de l'action mais pour cette deuxième colonne je pense m'en sortir grâce aux explications que j'aurai obtenu pour la première.

8exemple.xlsx (50.07 Ko)

la liste des fériés aurait suffit mais comme la liste des dates est faite...

A tester

eric

10exemple.xlsm (48.48 Ko)

Merci pour ton aide mais malheureusement je travaille sur Excel Mac 2011 et je ne peux pas ouvrir ton fichier. Aurais-tu une solution pour que je puisse tester ton travail ?

Je ne connais pas sur Mac.

Peut-être des sécurités à valider pour accepter les macros.

Sinon cherche un PC autour de toi, ça doit se trouver

Par contre j'ai dû changer un bouton ActiveX (inconnu des Mac) en bouton Formulaire.

Je te met un double en .xls des fois que tu les ouvres plus facilement.

eric

9exemple.xlsm (46.65 Ko)
13exemple.zip (35.18 Ko)

Merci beaucoup, tout marche parfaitement ! Je ne comprends pas grand chose à la macro mais je pense pouvoir m'en servir pour mon étude !

Encore merci et bonne fin de soirée

Un dernier problème persiste : j'aimerais réutiliser ta macro dans mon fichier original néanmoins le nom de feuille pose problème et je n'arrive pas à comprendre à quel niveau de la macro tu définis que les feuilles doivent prendre le nom "exemple1", "exemple2", etc.

Merci d'avance pour ton aide.

le code principal commenté :

Sub btnCreerF()
    Dim datas, shDate As Worksheet
    Dim lig As Long, c1 As Range, c2 As Range, supprim As Boolean

    supprim = MsgBox("Supprimer les feuilles existantes ?", vbQuestion + vbYesNo) = vbYes
    Application.ScreenUpdating = False
    Set shDate = Sheets("Feuil1")
    ' lire les données
    datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1, 3).Value

    ' pour chaque ligne de données
    For lig = 1 To UBound(datas)
        ' si la feuille a été crée
        If creerFeuille(datas(lig, 1), supprim, False) Then ' feuille à créer ?
            With Sheets(datas(lig, 1))
                ' rechercher date1
                Set c1 = shDate.[A:A].Find(datas(lig, 2), LookIn:=xlFormulas, lookat:=xlWhole)
                ' rechercher date2
                Set c2 = shDate.[A:A].Find(datas(lig, 3), LookIn:=xlFormulas, lookat:=xlWhole)
                If c1 Is Nothing Or c2 Is Nothing Then
                    ' si une date non trouvée
                    MsgBox "Date absente pour " & datas(lig, 1)
                Else
                    ' si les 2 dates sont trouvées
                    Sheets(datas(lig, 1)).[A1] = "Date" ' titre
                    ' copier-coller la série de dates
                    shDate.Range(c1, c2).Copy Sheets(datas(lig, 1)).[A2]
                End If
            End With
        End If
    Next lig
End Sub

J'ai oublié de te dire.

Au cours des tests parfois une date existante n'était pas trouvée (problème bizarre... déphasage aléatoire ??)

Si ça t'arrive aussi il suffit de relancer en conservant les feuilles, ça arrive rarement

Malheureusement cela ne m'explique pas comment les feuilles prennent le nom que tu souhaites leur donner. Je pense que la réponse se trouve peut-être dans la deuxième partie du code qui se trouve juste en dessous. Pourrais-tu commenter, comme tu viens de le faire, la deuxième partie du code ?

C'est noté pour le problème des dates, merci beaucoup !

Bonjour,

oui, c'est une fonction que je m'étais faite pour créer les feuilles.

Le nom est passé en paramètre, si elle est existante et ecraser=true elle est supprimée, puis crée si absente.

Nommée ici :

ActiveSheet.Name = nomFeuille

eric

Bien le bonjour,

Tout d'abord merci beaucoup pour ton aide qui m'est vraiment précieuse. J'ai tenté de réutiliser ton code et de l'adapter à mon fichier mais ce fut sans succès.

Je te joins mon fichier original afin que tu puisses voir ce qui cloche dans le code. Le but étant, comme pour l'exemple que je t'avais donné, d'avoir une feuille pour chaque évènement, intitulée "Evenement 1", "Evenement 2", etc. Dans chaque feuille on retrouvera, comme dans l'exemple, les dates comprises entre "T - 150" et "T + 15".

Le seul changement apparait dans la première feuille ("Calendrier") où les dates ne sont plus en colonne A mais en colonne D.

J'aurais voulu réussir moi même grâce à ton aide mais visiblement j'ai encore beaucoup de choses à apprendre..

Merci d'avance

16exemple2.xlsm (420.13 Ko)

Ah, au début ce n'est pas instinctif...

Sub btnCreerF()
'...
    Set shDate = Sheets("Calendrier")
'...
                Set c1 = shDate.[D:D].Find(datas(lig, 2), LookIn:=xlFormulas, lookat:=xlWhole)
               Set c2 = shDate.[D:D].Find(datas(lig, 3), LookIn:=xlFormulas, lookat:=xlWhole)
'...

ça devrait être tout.

eric

C'est exactement ce que j'ai fait, pensant qu'il ne fallait modifier que ces 2 petits détails mais ça ne fonctionne pas.

Lorsque je clique sur le bouton, les feuilles se créent en prenant comme intitulé la colonne D ("Nom de société") au lieu de la colonne A ("Evenement") ce qui aboutit à l'arrêt de la macro car à un moment donné le nom dépasse les 31 caractères autorisés. Par ailleurs, le problème que tu avais soulevé concernant la date manquante apparait pour toutes les feuilles qui ont malgré tout pu se créer.

Si tu le peux, essaye de faire fonctionner la macro qui est dans mon fichier Exemple 2 et tu verras par toi même les erreurs qui apparaissent.

Il n'y a pas de code dans ton exemple2

Tu as dû changer à tort :

datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1, 3).Value

Effectivement j'avais modifié à tort le [A2] en [D2] croyant qu'il s'agissait de la colonne contenant la base des dates.

Tout fonctionne parfaitement et mes 179 pages se sont créées avec les dates comme il fallait.

Encore merci pour tout et bonne continuation !

itoo

Rechercher des sujets similaires à "trouver copier plage donnees entre"