Copier par rapport à une date de validation

Résolu
nuro02 - Modifié par pijaku le 6/02/2016 à 19:37
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 9 févr. 2016 à 20:05
Bonjour,
Je suis novice dans la programmation VBA, j'aurais besoin d'aide SVP!!
J'ai un tableau avec des commandes que je valide suivant les dates de réception.
Je voudrais ressortir les commandes suivant les dates de validations, avec un mois par onglet (1er onglet "2016", 2ième onglet "Janvier, 3ième onglet "Février"...).
J'ai déjà récupérer un programme que j'ai modifié "à ma sauce".
Tout fonctionne bien pour janvier, mais pour Février je ne sais pas comment faire car il me copie la même chose que pour Janvier !!??.

Quelqu'un pourrais m'aider ?? Merci

"BI5" correspond à "31-janv", je pense que viens de là mon problème.





Sub Trier par mois()
    Dim plage As Range, cel As Range
    'stop rafraichissement ecran
    Application.ScreenUpdating = False
    'valeur a chercher
    valcherch = Sheets("2016").Range("BI5")
    With Worksheets("2016")
        'derniere cellule colonne D
        derlig = .Range("D" & Rows.Count).End(xlUp).Row
        'defintion plage a tester en memoire
        Set plage = .Range("D4:D" & derlig)
    End With
    
    derlig = 0
    With Worksheets("Janvier")
        'test plage
        For Each cel In plage
            If cel <= valcherch Then
                'premiere cellule vide apres derniere non vide colonne D
                derlig = .Range("D" & Rows.Count).End(xlUp).Row + 1
                'premier lancement
                If derlig = 2 Then
                    derlig = 4
                End If
                'copy ligne entiere
                cel.EntireRow.Copy .Range("A" & derlig)
            End If
        Next cel
    End With
    'rafraichissement ecran
    Application.ScreenUpdating = True
    derlig = 0

    With Worksheets("Février")
        'test plage
        For Each cel In plage
            If cel <= valcherch Then
                'premiere cellule vide apres derniere non vide colonne D
                derlig = .Range("D" & Rows.Count).End(xlUp).Row + 1
                'premier lancement
                If derlig = 2 Then
                    derlig = 4
                End If
                'copy ligne entiere
                cel.EntireRow.Copy .Range("A" & derlig)
            End If
        Next cel
    End With
    'rafraichissement ecran
    Application.ScreenUpdating = True
    
End Sub

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 8/02/2016 à 21:17
Je vais en attendant être gentil, en dépit de ton avarice de précisions (et grâce à ma boule de cristal)
Je ne sais pas si tu l'as remarqué, mais le dernier jour de n'importe quel mois de n'importe quelle année est forcément (informatique ou pas informatique) la veille du premier jour du mois suivant, non ?
et donc, par exemple :
mois = 2
annee = 2016
MsgBox "le dernier jour du deuxiéme mois de l'année " & annee & " est la veille du premier jour du mois suivant et est donc le " & DateSerial(annee, mois + 1, 1) - 1


ce que, dans sa très grande mansuétude, dateserial te permettrait d'être utilisé ainsi également :
MsgBox "le dernier jour du deuxiéme mois de l'année " & annee & " est la veille du premier jour du mois suivant et est donc le " & DateSerial(annee, mois + 1, 0)


Et saisis cette occasion pour te familiariser avec d'autres fonctions de dates (ton aide VBA est là pour cela):
Regarde par exemple ce qu'afficherait ceci :
MsgBox "le dernier jour du  mois de  " & MonthName(mois) & " de l'année " & annee & " est la veille du premier jour du mois (" & MonthName(mois + 1) & ") suivant et est donc le " & DateSerial(annee, mois + 1, 0)

et d'autres fonctions existent ... lis ton aide VBA
Tiens : une autre qui pourrait t'être utile un jour ou d'ores et déjà :
MsgBox Month("février 2016")

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 9/02/2016 à 10:56
partie de pêche fichue (trop de vent + houle) ===>>
voilà donc, en moins bâclé, ce que je devine que tu veux atteindre (tout à partir de la ligne 4 de chaque feuille, d'une part, + garde-fou pour le cas où pas de date valide en colonne D)
With Worksheets("2016")
Dim toto(1 To 12) As Range, derlig As Long, i As Long, mois As Byte
derlig = .Range("D" & Rows.Count).End(xlUp).Row
For i = 4 To derlig
If IsDate(.Range("D" & i).Value) Then
mois = Month(.Range("D" & i).Value)
If toto(mois) Is Nothing Then
Set toto(mois) = Rows(i)
Else
Set toto(mois) = Application.Union(toto(mois), Rows(i))
End If
End If
Next
For i = 1 To 12
If Not toto(i) Is Nothing Then
Worksheets(MonthName(i)).Cells.ClearContents
toto(i).Copy Destination:=Worksheets(MonthName(i)).Range("A4")
End If
Next
End With

- je t'ai montré plus haut (message d'hier) ce qu'étaient les fonctions Month et Monthname
- ouvre ton aide VBA à la rubrique Application.Union, méthode et lis à quoi elle sert et à quoi je l'utilise donc ici
- j'ai constitué un tableau dynamique toto. Chacun des 12 articles de ce tableau est un objet range
- ouvre ton aide VBA à la rubrique Range.Copy, méthode et lis (elle est très claire) et à la rubrique Range.ClearContents, méthode, très claire également.
Après avoir lu tout cela, tu comprendras tout de mon code.

Nous ne nous servons ici nulle part (nul besoin) d'une donnée en cellule "BI5" ...
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 6/02/2016 à 17:55
Bonjour,
tu ne peux tenter de travailler sérieusement de cette manière.
Plage a été définie comme étant une plage de cellules de ta feuille "2016" et contient donc des valeurs de ta feuille "2016" quel que puisse être ton With worksheets("....").
Pour le reste et bien que tes explications soient pour le moins très imprécises, tout donne à penser qu'il y a là un sérieux problème fondamental de conception. Et tes explications ne sont pas suffisamment claires pour que l'on tente de te guider valablement en ce qui concerne cet aspect-là (la conception elle-même).


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Je vais essayer de vous expliquer (pas évident par écrit):
je rentre des commandes de pièces détachées dans un tableau.
Je rentre le numéro de commande, la description et l'affecte à une machine.
Quand je reçois la facture d'une commande, j'indique la date de validation dans ce tableau.
Tous les mois, je dois faire un rapport à mon patron des factures validés.
Je voudrais ressortir toutes les factures validées du mois dans une autre feuille de calcul (copier/coller de la ligne complète).
Les factures validées sont parsemées dans le tableau car des fois je reçoit les factures 2-3 mois après.
Je ne sais pas si j'ai été bien clair.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 8/02/2016 à 19:05
Je vais essayer de vous expliquer (pas évident par écrit)

Ah ?
Je vais t'y aider :
oublie donc de parler de commandes, de n°s de commande, dates de validation, etc ... et parle-nous uniquement de feuilles, de colonnes et de lignes... on aura moins de difficultés à te suivre et c'est d'ailleurs ainsi que fonctionne un tableur.
(lis donc également le texte de ma signature) ...
On t'écoute .... (je ne veux voir dans ta réponse aucun des mots mis en gras et uniquement ce que j'ai souligné)

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ok merci.
Je souhaite copier des lignes d'une feuille vers d'autres feuilles selon la valeur (date) d'une cellule.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2016 à 07:35
Relis-toi donc :
Tu es toujours peu clair et très incomplet !
selon la valeur (date) d'une cellule

1) Et à quoi reconnais-tu ces lignes "selon cette valeur" ?
2) Et chacune de tes "autres feuilles" doit regrouper quelles lignes ?

Tu ne trouves pas que tes "explications" sont vraiment pour le moins légères ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2016 à 08:07
Est-ce que par hasard, tu voudrais finalement dire ceci :

"sur une feuille "2016", j'ai, en colonne D des dates diverses de l'année 2016
j'ai par ailleurs 12 autres feuilles (une pour chaque mois de l'année)
je souhaite copier sur chacune de ces 12 feuilles les données de la feuille "2016" qui auraient, en colonne D, une date correspondant au mois de la feuille d'éclatement concernée."

si oui :
- il est quand-même étonnant que tu ne parviennes pas à expliquer d'emblée ce qu'un autre (moi, donc) dont ce n'est pourtant pas le projet, explique clairement en si peu de mots, non ?
- on se demande alors que vient faire la valeur que tu invoques dans ton tout premier message (celle de ta cellule B15) !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2016 à 08:43
Bon ... je dois aller pêcher .
Regarde ce que ferait ceci (que je viens de bâcler), en admettant que tu aies des feuilles nommées janvier, février, mars, etc ....
Private Sub CommandButton1_Click()
With Worksheets("2016")
Dim toto(1 To 12) As Range
For i = 1 To .Range("D" & Rows.Count).End(xlUp).Row
mois = Month(.Range("D" & i).Value)
If toto(mois) Is Nothing Then
Set toto(mois) = Rows(i)
Else
Set toto(mois) = Union(toto(mois), Rows(i))
End If
Next
For i = 1 To 12
If Not toto(i) Is Nothing Then
toto(i).Copy Destination:=Worksheets(MonthName(i)).Range("A1")
End If
Next
End With
End Sub


0
OK je vais lire les rubriques que tu me conseils car là c'est très flou pour moi.
Encore merci.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 10/02/2016 à 07:38
Bon ...
Entre-temps : si ton problème est maintenant solutionné : il convient de libérer cette discussion (un clic sur le tag RESOLU) au niveau de ton tout premier message. Merci d'y penser.

EDIT : classé RESOLU à ta demande.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Rejoignez-nous