Copier lignes en fonction dates VBA

Bonjour a tous,

Je cherche a copier les lignes d un tableau qui contiennent une date comprise entre deux dates, ces dates se situent dans une meme colonne du tableau

Je veux copier ces lignes sur une autre feuille.

Par exemple je cherche a copier sur le feuille PRIMES les lignes des feuilles janvier fevrier mars qui contiennent une date comprise entre le 01/01/17 et le 31/03/17.

La colonne cible pour la date est la colonne I.

Ci joint mon fichier excel pour vous éclairer...

87test-datevba.xlsx (25.71 Ko)

merci par avance et longue vie au forum !!!

Bonsoir JC, bonsoir le forum,

En pièce jointe ton fichier modifié. Code commenté. Clique sur le bouton Primes...

580jc-jez-v01.xlsm (45.30 Ko)

WAOUWW,

Ca c'est de la réactivité...je te remercie pour ton travail qui a du te prendre que quelques minutes quand moi j ai galéré toute la soirée sans aucun résultat...

Le plus c'est que tu commante chaque ligne de commande et sa c super!!

J'aurai cependant une dèrniere question si tu le permet..:

Au lieu de mettre la date de début et la date de fin dans un msgbox j'aimerai enlever celui ci et mettre en direct dans le code vba ces deux dates.

Autre petit souci, si mes feuilles sont protégees sans mot de passe, pourrais tu me mettre la commande pour enlever la protection en début de macro et les reprotéger toujours sans mot de passe en fin de commande.

Merci encore pour ta réactivité , tes explications et surtout tes connaissances !!

Salut Thau Theme

Bonjour JC, bonjour le forum,

jc jez a écrit :

Au lieu de mettre la date de début et la date de fin dans un msgbox j'aimerai enlever celui ci et mettre en direct dans le code vba ces deux dates.

Les InputBoxes (ce ne sont pas des MsgBoxes). Elles permettent à l'utilisateur de saisir des données utilisées par la suite dans le code VBA. Elles sont donc déjà dans la code. Si je mets les dates en dur, sans passer par une InputBox, tu ne pourras plus changer, sans aller modifier le code. Donc elles seront bloquées ?!... Mais si c'est cela que tu veux, il faudrait que tu me dises quelles sont ces dates, je suis pas devin !...

Quant à la déprotection/protection : rajoute cette ligne :

P.Unprotect 'déprotège l'onglet

juste en-dessous de la ligne : Set P = Worksheets("PRIMES") 'définit l'onglet P

puis la ligne :

P.Protect 'protège l'onglet

juste avant la derniere ligne : End Sub

Salut,

oui autant pour moi c'st une imputbox

les dates sont dans mon premier post c'est 01/01/2017 et 31/03/2017

une fois que j'aurai compris la syntaxe des dates dans le code je pourrais aisément les changer ( quitte a attribuer chaque période concernée a un bouton différent.)

merci

Re,

La version 2 avec le code très simplifié du coup :

Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Primes)
Dim DDL As Long 'déclare la variable DDL (Date de début en Long)
Dim DFL As Long 'déclare la variable DFL (Date de Fin en Long)
Dim O As Worksheet 'déclare la variable O (Onglets)
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 TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim D As Long 'déclare la variable D (Date)

Set P = Worksheets("PRIMES") 'définit l'onglet P
P.Range("A1").CurrentRegion.ClearContents 'efface d'éventuelles anciennes données de l'onglet P

'ici les dates en dur...
DDL = DateSerial(2017, 1, 1) 'définit la variable DDL
DFL = DateSerial(2017, 31, 3) 'définit la variable DDF

K = 1 'initialise K
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
    If Not O.Name = "PRIMES" Then 'condition 1 : si le nom de l'onglet n'est pas "PRIMES"
        TV = O.Range("D3").CurrentRegion 'définit le tableau des valeurs TV
        For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            D = DateSerial(Year(TV(I, 6)), Month(TV(I, 6)), Day(TV(I, 6))) 'définit la date D (convertie en entier Long)
            If D >= DDL And D <= DFL Then 'condition 2 : si la date est comprise entre les dates de début et de fin (incluses)
                ReDim Preserve TL(1 To 8, 1 To K) 'redimensionne le tableau des lignes TL
                For J = 1 To 8 'boucle 3 : sur les 8 colonnes du tableau des valeurs TV
                    TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL, la donnée en colonne J de TV (=transposition)
                Next J 'prochaine colonne de la boucle 3
                K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
            End If 'fin de la condition 2
        Next I 'prochaine ligne de la boucle 2
    End If 'fin de la condition 1
Next O 'prochain onglet de la boucle 1
If K > 1 Then 'condition : si K est supérieure à 1
    'renvoie dans A1 redimensionnée de l'onglet P, la première ligne du tableau des valeurs TV
    P.Range("A1").Resize(1, 8) = Application.Index(TV, 1)
    'renvoie dans A2 redimensionnée de l'onglet P, le tableau TL transposé
    P.Range("A2").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End If 'fin de la condition
End Sub

Le fichier :

114jc-jez-v02.xlsm (43.86 Ko)

merci bcp c'est exactement ce qu'il me fallait meme si le code est bien simplifié comme cela

je conserve tout de meme le premier

merci de ta réactivité

bonne journée

Bonjour,

Je recherche cette même fonction que votre exemple : JC Jez_v01.xlsm,

Par contre je n'arrive pas à adapter votre VBA à mon tableau.

mon tableau part de la colonne A à la colonne Y et les dates sont dans la colonne S, entête du tableau sur la ligne 1, dans la Feuille nommée BD

Je souhaite copier toutes les lignes contenues entre 2 dates dans la feuille DEPOT

Merci.

Rechercher des sujets similaires à "copier lignes fonction dates vba"