Récupérer valeurs en fonction de date

Hello ! Décidément c'est ma 2ème fois aujourd'hui !

J'utilise une macro qui ouvre un classeur, parcours la plage A1:AV1 dans laquelle se trouve des date qui démarre en A1 "janv-23"
Je veux récupérer les valeurs sur la plage A4:AV4 UNIQUEMENT pour le mois en cours et tous les mois précédent.

Ce code me permet de récupérer la valeur en février mais je ne comprend pas pourquoi je n'ai pas Janvier et Mars...

Merci d'avance pour votre aide précieuse.

Dim currentDate As Date
Dim startMonth As Date
Dim endMonth As Date
Dim val4() As Double ' déclarer val4 comme un tableau à deux dimensions de type Double
Dim i As Integer
Dim j As Integer

'Obtenir la date actuelle
currentDate = Date

'Récupérer la plage de dates A1:AV1
Dim dateRange As Range
Set dateRange = extWs4.Range("A1:AV1")

'Récupérer la plage de valeurs à partir de A4:AV4
Dim valueRange As Range
Set valueRange = extWs4.Range("A4:AV4")

'Redimensionner le tableau "val4" pour correspondre à la taille de la plage de valeurs
ReDim val4(1 To valueRange.Rows.Count, 1 To valueRange.Columns.Count)

'Parcourir les colonnes de la plage de dates
For i = 1 To dateRange.Columns.Count
    'Obtenir la date de début et de fin du mois correspondant à la colonne
    startMonth = DateSerial(Year(currentDate), Month(currentDate) - i + 1, 1)
    endMonth = DateSerial(Year(currentDate), Month(currentDate) - i + 2, 0)

    'Parcourir les cellules de la plage de dates correspondante
    For j = 1 To dateRange.Rows.Count
        'Vérifier si la date est comprise dans le mois actuel ou précédent
        If dateRange.Cells(j, i).Value >= startMonth And dateRange.Cells(j, i).Value <= endMonth Then
            'Si oui, stocker la valeur correspondante de la plage de valeurs
            val4(j, i) = valueRange.Cells(j, i).Value
        End If
    Next j
Next i

L'onglet semble être de même format que l'onglet "Calendrier" de ton précédent post et dans ma réponse, je t'ai donné une méthode pour calculer l'indice de la colonne correspondant à une date. En te servant de cette méthode tu peux dimensionner ton tableau et parcourir la ligne de donnée des colonnes 1 à la colonne correspondant à la date. En plus je ne comprends pas pourquoi tu as une boucle sur les lignes vu que ta plage ne comporte qu'une seule ligne ...

Sinon pour ton pbm, startMonth = DateSerial(Year(currentDate), Month(currentDate) - i + 1, 1) ne calcule pas la date de but du mois de ta colonne car ton calcul se base sur le mois de mars (currentdate = date) donc il n' y a qu'en février où 3(mars) - 2 + 1 te donne 2(février) ... Idem pour la date de fin de mois.

Sinon en gros le code tient en :

  • Calculer l'indice de la colonne correspondant à la date du jour (ou autre)
  • Dimensionner le tableau des valeurs de 1 à l'indice calculé
  • Faire une boucle sur les colonnes de 1 à l'indice calculé et stocker la valeur

Merci vraiment pour le soutien j'en vois pas le bout, j'ai pas réussi à adapter l'autre bout de code...

Je te met un tableau vidé avec mon code actuel parce que la je deviens fou... Excel ne me rend pas tout l'amour que je lui porte

2dateforum.xlsm (34.16 Ko)

Voir Module1 du fichier joint

4dateforum2.xlsm (34.56 Ko)

Incroyable merci !!

Tu m'aura vraiment aidé...

Je vais continuer de bosser et surtout de décortiquer ca pour voir comment le détourner pour la suite...

MERCIII

Après plusieurs essais je ne parvient pas a faire ce que je veux, j'aimerais réutiliser ton code mais cette fois ci pour faire l'inverse, renvoyer le mois en cours et les mois suivants, sans prendre les précédents : j'ai déduis que c'était dans cette partie :

' Calcul de la colonne de l'onglet "Calendrier" à partir de la 1ère date du calendrier et de la currentdate
dDtInit = extWs4.Range("A1").Value
nIColCD = Month(currentDate) + ((Year(currentDate) - Year(dDtInit)) * 12)

ai je raison ?

Bonjour RoamlN123456,

Cette partie ne bouge pas, nIColCD détermine l'indice de la colonne correspondant à currentdate et cela reste valable pour ta nouvelle demande. Par contre, dans la version précédente, il y a deux boucles For / Next (l'une pour récupérer les valeurs, l'autre pour les écrire dans "flux") à partir de 1er mois du fichier jusqu'à nIColCD. Pour répondre à ta nouvelle demande :

  • Il faut modifier ces 2 boucles pour qu'elles traitent à partir de nIColCD jusqu'au dernier mois de ton fichier. L'intérieur des boucles n'est pas impacté
  • Initialiser nIColDepense non pas à 6 (premier mois dans flux) mais le calculer pour qu'il corresponde à la colonne du mois pointé par nIColCD.

J'ai conservé la structure de ton code initial mais il serait aussi possible de ne faire qu'une seule boucle qui récupère les valeurs dans "calendrier" et qui les écrit dans "flux". Dans ce cas, plus besoin du tableau qui ne sert qu'au stockage entre les 2 boucles.

Je te laisse regarder et faire ou dis moi si tu veux que je le fasse.

3ajoutclient.xlsm (61.42 Ko)

Bon j'ai essayer aujourd'hui et hier soir et j'arrive pas au but...

Je te met le tableau avec des données exemples.

Pour rappel :

J'ajoute un client qui souscrit un abonnement mensuel, donc la valeur s'ajoute sur le mois en cours et sur tous les mois qui suivent (je créerai un bouton pour supprimer un client qui arrete l'abonnement sur la meme logique après)

Bouton dans feuil BOARD ajouter client

Si abo mensuel (optionbutton1) : récupérer B2 dans feuil Revenus, insérer dans feuil Calendar dans ligne2 colonne mois en cours et les mois suivant jusqu'à fin du Tableau3

Si abo annuel (optionbutton2) : récupere E19 dans feuil Revenus, additionne dans feuil Calendar ligne 2 colonne mois en cours + mois identique des années suivantes jusqu'à fin du Tableau3.

Je fais au mieux pour clarifier mon besoin.

(Si tu peux vraiment détailler le code avec des commentaire j'aimerais vraiment tout comprendre...)

Bonjour,

Voir fichier ci-joint, j'ai commenté le code dans le UserForm1 procédures "CommandButton1_Click()" (modifiée) et "InsereAboDansCalendar" (créée).

3ajoutclient.xlsm (65.70 Ko)

Je regarde ca de suite !

Bon j'ai l'impression d'être bête mais je découvre en même temps donc ca doit être normal, je voudrais additionner les valeurs à celle déjà présente et non pas remplacer.

Si 2 client s'abonne le meme mois, il me faut bien 2 fois la valeur, idem si un 3eme choisi un abonnement annuel, je veux bien avoir dans ma cellule 1 abo mois + 1 abo mois + un abo année...

Et même ca j'y arrive pas c'est rageant

J'ai pensé qu'il fallait retoucher ici dans le buttoncommand:

      ws.ListObjects("tableau2").Range(2, 3).Value = ws.ListObjects("tableau2").Range(2, 3).Value + 1
      InsereAboDansCalendar CDate(Me.TextBox1.Value), ws.Cells(19, 5).Value, 12

ou ici dans ton code insereabo :

      ' Boucle du mois de souscription jusqu'à la fin du tableau selon la fréquence indiquée dans nToutLesNbMois
      For nICol = nIColCalDeb To nIColCalMax Step nToutLesNbMois
         ' Copie le montant dans la colonne du mois concerné
         .Range(2, nICol).Value = nMontant

Ou est ce que je me plante ?

Dans la procédure "CommandButton1_Click()" tu additionnes bien le nombre d'abonnements doc ça c'est bon.

C'est bien dans la boucle de "InsereAboDansCalendar()" qu'il faut faire la modification. Actuellement la valeur nMontant est écrite dans la cellule du mois .Range(2, nICol).Value = nMontant et par conséquent nMontant écrase la valeur précédente de la cellule du mois s'il y en avait une. Pour l'additionner, il suffit de lui dire que la valeur de la cellule est égale à la valeur de cette même cellule à laquelle tu ajoutes nMontant .Range(2, nICol).Value = .Range(2, nICol).Value + nMontant .

Houra j'ai réussi seul, le problème de ce code est que nICol doublait la valeur, il fallait enfait faire :

.Range(2, nICol).Value = .Range(2, 2).Value + nMontant

A la place de :

.Range(2, nICol).Value = .Range(2, nICol).Value + nMontant

(après plusieurs essais ca fonctionne bien comme il faut, dis moi si j'ai fais une erreur ou si j'ai raison sur ce coup la)

Et un énorme MERCI à toi pour ta patience et le détails des commentaire dans le code, c'est vraiment sympa !

Tu veux bien ajouter le montant de l'abonnement du nouveau client aux montants des abonnements déjà enregistrés pour les mois concernés de ton nouveau client ?Si oui, je ne vois pas comment .Range(2, nICol).Value = .Range(2, nICol).Value + nMontant pourrait doubler le montant, il ne fait qu'ajouter nMontant au montant déjà présent dans la cellule .

La ligne .Range(2, nICol).Value = .Range(2, 2).Value + nMontant = Montant du mois nICol = montant de février ".Range(2, 2).Value" + nMontant donc je suis très surpris que cela fonctionne comme il faut ... tu as dû modifier autre chose dans le code. Si tu repostes quelque chose, je regarderai demain.

Regardes le fichier joint, il cumule et ne double pas les montants

2ajoutclient2.xlsm (66.61 Ko)

Tu as raison... J'ai fais des essais qui ont fonctionner par pur hasard, après vérification ca ne fonctionne pas.

Le code corrigé que tu m'as envoyé aussi ne fonctionne pas je ne comprend pas trop pourquoi, j'ai l'impression que c'est peut etre l'ordre de commandbutton, ou les liaisons entre mes cellule en feuil revenus... puisque pour 1 abonnement ca renvoi bien 33.99 dans calendar, mais pour 2 102.03 (comme si il yavais 3 client) puis pour un 3eme client on passe à 206 (comme si 6 clients)...

Si tu as le temps de rejeter un oeil...

image

De mon coté avec ton nouveau fichier, ajout d'un client en janvier, ajout d'un client en mars me donne 101.98 au lieu de 67.98

@lydmilaivannick35 (erreur de post ou sosie ?)

Bonjour RomalN123456,

Dans les cellules que tu m'as indiquées (hier à 16h12), en B2 j'ai 203,95 et en E19 j'ai 342,17, à la place de B2 ce ne serait pas plutôt B19 qu'il faudrait prendre ?

Si oui, il suffit de modifier dans CommandButton1_Click la ligne ;

InsereAboDansCalendar CDate(Me.TextBox1.Value), ws.Cells(2, 2).Value, 1

par

InsereAboDansCalendar CDate(Me.TextBox1.Value), ws.Cells(19, 2).Value, 1

Ok effectivement c'était bien ca je ne comprend meme pas comment je ne l'ai pas vu...

Un immense merci pour ton temps et ta patience !!!!!!

Je vais encore te déranger mais je veux réutiliser un morceau de code que tu as fait :

'Sélectionne la feuille de calcul "Calendrier" du classeur "SUIVI GRAPH.xlsm"
Set extWs4 = extWb4.Sheets("Calendrier")

Dim dDtInit As Date
    Dim nIColCD As Long          ' colonne de currentdate
    Dim nICol As Long
    Dim nIColDepense As Long     ' colonne dépense (colonne revenus = +1)

Dim currentDate As Date
Dim val4() As Double ' déclarer val4 comme un tableau à deux dimensions de type Double

'Obtenir la date actuelle
currentDate = Date

' Calcul de la colonne de l'onglet "Calendrier" à partir de la 1ère date du calendrier et de la currentdate
dDtInit = extWs4.Range("A1").Value
nIColCD = Month(currentDate) + ((Year(currentDate) - Year(dDtInit)) * 12)

'Redimensionner le tableau "val4" pour correspondre au nombre de colonnes
ReDim val4(1 To nIColCD)

' Récupération des valeurs
For nICol = 1 To nIColCD
   val4(nICol) = extWs4.Cells(4, nICol).Value
Next

' Colle la valeur récupérer du tableau SUIVI selon supérieur ou inférieure à 0
' On commence à la colonne dépense 6 "F" et on va de 5 en 5 colonnes (6, 11, 16, ...)
' la colonne revenus est la colonne dépense + 1
   Set ws = ThisWorkbook.Worksheets("flux")
   nIColDepense = 6
   With ws
      For nICol = 1 To nIColCD
         .Cells(8, nIColDepense).Value = IIf(val4(nICol) < 0, val4(nICol), "")
         .Cells(8, nIColDepense + 1).Value = IIf(val4(nICol) >= 0, val4(nICol), "")
         nIColDepense = nIColDepense + 5
      Next
   End With

j'ai bien remis Dim extWs5 As Worksheet et Dim extWb5 As Worksheet

J'ai également modifier la cellule de destination (remplacer 8 par 7).

Mais je voudrais qu'elle se fasse dans la meme macro, j'ai modifier les dim mais j'ai une erreur vba code erreur &H800401A8 (-2147221080). Quand j'ouvre le classeur souhaité (le tableau de récupération des données a exactement le meme format, date et valeur à récup en ligne4 à partir de colonne A...

Que faut il changer ?

Rechercher des sujets similaires à "recuperer valeurs fonction date"