macro tri mois d'une plage de date

almas

XLDnaute Occasionnel
Bonjour le forum

j 'ai adapté un code à un de mes projets qui consiste à trier par mois une base de donnée avec une date de début et une date de fin
ca marche nikel......sauf quand la date de début n'a pas le même mois que celle de fin

il faut que je rajoute une fonction "ou" dans mon code et sans faire de doublon

ex: titre 12/01/2017 10/02/2017

je doit retrouver titre dans l onglet janvier et aussi dans l'onglet février et sans qu 'il soit 2 fois en janvier
et je n 'y arrive pas en VBA

je vous joint un fichier test ( le code s 'active quand on actualise la cellule A1 de chaque onglet par la liste)
 

Pièces jointes

  • test mois.xls
    62.5 KB · Affichages: 34

vgendron

XLDnaute Barbatruc
Hello

avant de modifier le code, il y a des choses que je ne comprend dedans..
1) qu'est censé faire ton code?
2) à quoi sert cette ligne?
Set plage = Sheets("Liste_manif").Range("Q1")
'Liste Manif est une zone nommée --> si oui. laquelle?

dans le fichier posté, il y a de nombreuses zones nommées dont les références ont été perdues..
 

ChTi160

XLDnaute Barbatruc
Bonjour almas
Bonjour le Fil (vgendron),Le Forum
Une approche de ce que j'ai compris Lol
Attention aux Noms des Feuilles (accent éventuel)
Pourquoi ne pas remplir la zone de recherche lors de l'activation de la Feuille ?
Plutôt que par une liste à un Nom (Mois)
Bonne journée
 

Pièces jointes

  • test mois Chti160.xls
    69 KB · Affichages: 29
Dernière édition:

vgendron

XLDnaute Barbatruc
Une idée de code. si le besoin est bien de dispatcher ta feuille "Liste_Manif" dans les autres
VB:
Sub dispatch()
Dim tablo() As Variant

tablo = Sheets("Liste_manif").Range("A1").CurrentRegion.Offset(1).Value  'on place les data dans un tablo--->offset(1) pour éviter la ligne de titre
For i = LBound(tablo, 1) To UBound(tablo, 1)  'sur chaque ligne du tablo
    MoisDebut = Month(tablo(i, 2)) 'on récupère la date de début
    MoisFin = Month(tablo(i, 3))   'on récupère la date de fin
    For IndiceMois = MoisDebut To MoisFin
        mois = UCase(MonthName(IndiceMois)) 'on récupère le mois en lettre
        For Each ws In Worksheets
            If UCase(ws.Name) = mois Then
                With Sheets(mois)
                    .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 1)
                    .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 4)
                    .Range("C" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 5)
                End With
            End If
        Next ws


    Next IndiceMois
Next i

End Sub
 

vgendron

XLDnaute Barbatruc
Hello Chti ! raffraichi juste après

petite modif de code
VB:
Sub dispatch()
Dim tablo() As Variant

tablo = Sheets("Liste_manif").Range("A1").CurrentRegion.Offset(1).Value  'on place les data dans un tablo--->offset(1) pour éviter la ligne de titre
For i = LBound(tablo, 1) To UBound(tablo, 1) - 1 'sur chaque ligne du tablo
    MoisDebut = Month(tablo(i, 2)) 'on récupère la date de début
    MoisFin = Month(tablo(i, 3))   'on récupère la date de fin
    For IndiceMois = MoisDebut To MoisFin
        mois = UCase(MonthName(IndiceMois)) 'on récupère le mois en lettre
        flag = 0
        For Each ws In Worksheets
            If UCase(ws.Name) = mois Then
                flag = 1
                With Sheets(mois)
                    .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 1)
                    .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 4)
                    .Range("C" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 5)
                    Exit For
                End With
            End If
        Next ws
        If flag = 0 Then MsgBox "la feuille: " & mois & " n'existe pas"


    Next IndiceMois
Next i

End Sub
 

almas

XLDnaute Occasionnel
Bonjour ChiTI160 et vgendron et merci vos 2 réponses marche parfaitement avec une approche différente:)
Vgendron:
1) qu'est censé faire ton code?
2) à quoi sert cette ligne?
Set plage = Sheets("Liste_manif").Range("Q1")
'Liste Manif est une zone nommée --> si oui. laquelle?
en faite je réutilisais un code qui faisais une recherche sur plusieurs onglet et la "set plage" était la liste de tous les onglet ou il fallait chercher
j 'ai pas chercher à rectifier le code j 'ai donc refait une liste de 1 nom :p

ton code est le plus simple car aucune autre ligne de code dans aucune feuil et tu extrais directement le moi en texte sans passé par une autre colonne avant
mettre les titre de colonne en tableau je maitrise pas du tous mais c 'est génial

Chiti160:
j 'avais prévu de faire actualisé à la sélection de l onglet mais j 'ai laisser la sélection manuelle pour l instant

sinon vos approche avec un seul code a activer comme on veux marche parfaitement
je vais les décortiquer et je vous remercie encore
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Re modif pour effacer les feuilles mensuelles avant de recoller les infos
VB:
Sub dispatch()
Dim tablo() As Variant
For Each ws In Worksheets 'on efface les différentes feuilles
    If ws.Name <> "Liste_manif" Then
        ws.Range("A6").CurrentRegion.Offset(1).ClearContents
    End If
Next ws

tablo = Sheets("Liste_manif").Range("A1").CurrentRegion.Offset(1).Value  'on place les data dans un tablo--->offset(1) pour éviter la ligne de titre
For i = LBound(tablo, 1) To UBound(tablo, 1) - 1 'sur chaque ligne du tablo
    MoisDebut = Month(tablo(i, 2)) 'on récupère la date de début
    MoisFin = Month(tablo(i, 3))   'on récupère la date de fin
    For IndiceMois = MoisDebut To MoisFin
        mois = UCase(MonthName(IndiceMois)) 'on récupère le mois en lettre
        flag = 0
        For Each ws In Worksheets
            If UCase(ws.Name) = mois Then
                flag = 1
                With Sheets(mois)
                    .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 1)
                    .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 4)
                    .Range("C" & .Rows.Count).End(xlUp).Offset(1, 0) = tablo(i, 5)
                    Exit For
                End With
            End If
        Next ws
        If flag = 0 Then MsgBox "la feuille: " & mois & " n'existe pas"
    Next IndiceMois
Next i
End Sub
 

almas

XLDnaute Occasionnel
excellent je m 'en aurai pas spécialement aperçut de-suite car la base de donnée va en grandissant et donc les liste auraient été de plus en plus grandes

par contre mettre la base de donnée en tableau je découvre et je me régale!!!!
 

almas

XLDnaute Occasionnel
je joint un fichier avec ton code

j 'ai mis un bouton "Dispatch" dans liste manif pour lancer ton code

avec ce code ca marche:
For Each ws In Worksheets 'on efface les différentes feuilles
If ws.Name <> "Liste_manif" Then
ws.Range("A7:C2000").ClearContents
End If

mais si je décide d 'afficher 4 colonne de mon tableau au lieux de trois faudra que je modifie mon code a cette endroit
 

Pièces jointes

  • test mois.xls
    63.5 KB · Affichages: 20
Dernière édition:

vgendron

XLDnaute Barbatruc
remplace le début du code par ceci
VB:
For Each ws In Worksheets 'on efface les différentes feuilles
    If ws.Name <> "Liste_manif" Then
            'ws.Range("A6").CurrentRegion.Offset(1).ClearContents
            ws.Range("A7:C" & Range("A" & Rows.Count).End(xlUp).Row).ClearContents
    End If
Next ws
 

vgendron

XLDnaute Barbatruc
euh non. par ca en fait
VB:
For Each ws In Worksheets 'on efface les différentes feuilles
    If ws.Name <> "Liste_manif" Then
        With ws
            If .Range("A" & .Rows.Count).End(xlUp).Row <> 6 Then
                .Range("A7:C" & .Range("A" & .Rows.Count).End(xlUp).Row).ClearContents
            End If
        End With
    End If
Next ws
 

Discussions similaires

Réponses
14
Affichages
517

Statistiques des forums

Discussions
312 108
Messages
2 085 377
Membres
102 876
dernier inscrit
BouteilleMan