Somme avec des données sur une autre feuille, date, for each

Bonjour.

Il y a longtemps que je n'ai plus fait de visual basique, je m'y remets mais j'ai oublié pas mal de chose.

Pouvezvous m'aider à corriger et compléter mon script.

Merci de votre aide.

Alain.

Function total_mensuel_poste(ByVal plage_date As Range, plage_montant As Range, plage_utilisation As Range, _
mois As String, utilisation) As Double
'Renvoie la somme des montants affectés pour une utlisation et un mois donnés.
'prend pour arguments les cellules de la colonne Date (ColA) montant (colB) et utilisation (colC)
'prend pour arguments les cellules où se trouvent les mois et les utilisations cherchés
'les données à analyser se trouvent dans la feuille1
'les données mois et utilisation se trouvent dans la feuille3
'les résultats (l'appel de la fonction) se fait feuille3

Dim cell_utilisation As Range
Dim cell_date.value As Date
Dim somme As Double
somme = 0

For Each cell_utilisation In plage_utilisation
    If cell_utilisation = utilisation Then
        For Each cell_date In plage_date
            If cell_date = mois Then
                somme = somme + cell_date '+la case se trouvant 2 cases plus loin
            End If
        Next
    End If
Next

'renvoie la somme recherchée
somme

End Function

Bonjour

ton fichier serait utile

Bonjour.

Le voilà.

22budget-bis.zip (18.06 Ko)

Bonjour

A tester

Merci.

C'est génial, il y a plus qu'à rendre le mois unique en rajoutant l'année et c'est exactement ce que je voulais.

Je te poserai quelques questions demain sur ce que tu as fait.

Encore merci, Alain.

Bonjour,

j'ai ajouté "Annee As Integer" dans les arguments de la fonction qui est une case qui se trouve au-dessus de celle où il y a l'argument mois mais je je n'ai pas su l'intégrer dans la fonction "LeMois = Month("1/" & Mois & Annee)" car je comprends mal sa syntaxe.

A quoi sert le "Application.Volatile" ?

Merci.

Alain.

Function total_mensuel_poste(ByVal Plage_Date As Range, Plage_Montant As Range, Plage_Utilisation As Range, _
Mois As String, Annee As Integer, Utilisation As String) As Double
'Renvoie la somme des montants affectés pour une utlisation et un mois donnés.
'prend pour arguments les cellules de la colonne Date (ColA) montant (colB) et utilisation (colC)
'prend pour arguments les cellules où se trouvent le mois et l'utilisation cherchés
'les données à analyser se trouvent dans la feuille1
'les données mois, année et utilisation se trouvent dans la feuille3
'les résultats (l'appel de la fonction) se fait feuille3
Dim LeMois As Integer
Dim Somme As Double
Dim Cel As Range

  Application.Volatile
  LeMois = Month("1/" & Mois & Annee)
  For Each Cel In Plage_Date
    If Month(Cel) = LeMois And Plage_Utilisation.Cells(Cel.Row, 1) = Utilisation Then
      Somme = Somme + Plage_Montant.Cells(Cel.Row, 1)
    End If
  Next Cel
  total_mensuel_poste = Somme
End Function

Bonjour

Dans le tableau "Autre formule" il y à un calcul qui tient compte de l'année, et c'est un calcul sans VBA

A tester

Oui merci pour tout.

Et encore bravo de trouver aussi vite.

Bonne journée.

Re-bonjour.

Il y reste quelque chose que je n'arrive pas à résoudre, la fonction ne prend pas en compte la première et le dernière ligne de données.

Alain.

18budget-ter.zip (20.15 Ko)

Bonjour

Dans le fichier que je t'ai fourni la formule contient des $, ils ne sont pas là pour faire beau

Formule en C4 à tirer vers la droite et vers le bas

=total_mensuel_poste(Feuil1!$A$2:$A$998;Feuil1!$B$2:$B$998;Feuil1!$C$2:$C$998;C$2;C$1;$B4)

Oui.

Je m'excuse.

Mais pourquoi la ligne 2 de la feuille 1 n'est pas prise en compte et la ligne 35 est en décembre au lieu d'octobre ?

Pourquoi le recalcul se lance systématiquement maintenant et est long ?

Bonsoir

Testes cette version

Function total_mensuel_poste(ByVal Plage_Date As Range, Plage_Montant As Range, Plage_Utilisation As Range, _
Mois As String, Annee As Integer, Utilisation As String) As Double
'Renvoie la somme des montants affectés pour une utlisation et un mois donnés.
'prend pour arguments les cellules de la colonne Date (ColA) montant (colB) et utilisation (colC)
'prend pour arguments les cellules où se trouvent le mois et l'utilisation cherchés
'les données à analyser se trouvent dans la feuille1
'les données mois, année et utilisation se trouvent dans la feuille3
'les résultats (l'appel de la fonction) se fait feuille3
Dim LeMois As Integer
Dim Somme As Double
Dim Cel As Range
Dim Ligne As Long

  LeMois = Month("1/" & Mois)
  For Each Cel In Plage_Date
    Ligne = Ligne + 1
    If Month(Cel) = LeMois And Year(Cel) = Annee And Plage_Utilisation.Cells(Ligne, 1) = Utilisation Then
      Somme = Somme + Plage_Montant.Cells(Ligne, 1)
    End If
  Next Cel
  total_mensuel_poste = Somme
End Function

C'est nickel cette fois-ci. Je ne comprends pas pourquoi celle d'avant ne fonctionnait pas ni pourquoi à chaque saisie, Excel recalcule.

Bonsoir

Alain83 a écrit :

Je ne comprends pas pourquoi celle d'avant ne fonctionnait pas

Dans la boucle For Each .... Next je me servais de l'instruction Cel.Row pour connaître la ligne traitée, or celle-ci ne retourne pas la ligne dans la plage transmise (Plage_Date) mais la ligne dans la page Excel, d'ou le décalage de 1

Alain83 a écrit :

ni pourquoi à chaque saisie, Excel recalcule.

Regardes dans l'aide l'explication de Volatile dans Application.Volatile

Merci pour tout.

Bon week-end et à bientôt.

Alain.

Rechercher des sujets similaires à "somme donnees feuille date each"