sommer données semaine en cours

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Par curiosité et gout de la nouveauté
d'autres solutions plus 'esthétiques' pour réaliser cela?

Code:
 =SOMMEPROD(($B$1:$B$29)*($A$1:$A$29<=(AUJOURDHUI()-MOD(AUJOURDHUI()-2;7)+4)*($A$1:$A$29>=(AUJOURDHUI()-MOD(AUJOURDHUI()-2;7)))))

(formules ou VBA)
j'ai une préférence pour le VBA

Bon week-en à tous
 
Dernière édition:

JeanMarie

XLDnaute Barbatruc
Bonjour

Pour te venir en aide, il serait bon de placer un fichier, en montrant les données des deux plages.

Plusieurs solutions existent pour simplifier ta formule, mais cela dépend de ces données :
- Les dates dans la plages A1:A29, ont-elles des trous ?
- Les données de la plage B1:B29, sont-elles saisies journalièrement ?

@+Jean-Marie

PS : j'ai oublié, je te déconseille d'utiliser la partie ci-dessous
AUJOURDHUI()-MOD(AUJOURDHUI()-2;7)+4
mais
AUJOURDHUI()-JOURSEM(AUJOURDHUI();3))
celle-ci fonctionne quelque soit l'état de l'option 'Calendrier 1904' d'Excel.

Message édité par: JeanMarie, à: 16/07/2005 13:05
 

Monique

Nous a quitté
Repose en paix
Bonjour,

SommeProd n'accepte pas les colonnes entières du genre A:A

Tes 2 plages sont nommées de façon dynamique,
la fonction Aujourdhui() est nommée 'CeJr'
la formule te donnant le lundi est nommée 'Lundi'
puis la formule entière est nommée :
ou bien avec la fonction et le petit bout de formule déjà nommés,
ou bien avec seulement les 2 plages nommées.

Reste à savoir si c'est plus esthétique

Pour donner des noms, tu regardes le fil de Marion :
Lien supprimé

ou bien le message d'Antoine, à 23:43 ici :
Lien supprimé
[file name=SommeProdStaple.zip size=3947]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/SommeProdStaple.zip[/file]
 

Pièces jointes

  • SommeProdStaple.zip
    3.9 KB · Affichages: 12

Staple1600

XLDnaute Barbatruc
Pour le VBA

j'en suis là:

Sub test()
x = Date - Weekday(Date, 3)
y = x + 4
MsgBox 'Semaine en cours' & Chr(13) & 'Début: ' & x & Chr(13) & 'Fin: ' & y
End Sub


Le reste c'est déjà plus dur.


Faut-il en rester au SOMMEPROD

(je n'ai rien contre)
Mais juste pour le fun
j'aimerais une version VBA

Si quelqu'un ici a un bout de code qui sait faire...

Bon week-end
 

JeanMarie

XLDnaute Barbatruc
Bonsoir

Excel dispose en standard d'une fonction qui renvoie le N° de semaine pour une cellule, mais cette fonction n'est pas fonctionnelle pour une matrice.

Place ce code dans un module.
Code:
Option Explicit
Option Base 0

Public Function MatriceSemaine(vPlage As Range, Comparateur As Date) As Variant
Dim vMatrice() As Byte
Dim vCell As Range
Dim EgaleSemaine As Byte
Dim J As Double

   ReDim vMatrice(vPlage.Rows.Count - 1)
   EgaleSemaine = DatePart('ww', Comparateur, 2)
   J = 0
   For Each vCell In vPlage
      If DatePart('ww', vCell, 2) = EgaleSemaine Then
         vMatrice(J) = 1
      Else
         vMatrice(J) = 0
      End If
      J = J + 1
   Next vCell
   MatriceSemaine = Application.WorksheetFunction.Transpose(vMatrice)
End Function

Pour utiliser cette function dans une cellule, dans ton cas
=SOMMEPROD(B2:B101*(MatriceSemaine(A2:A101;AUJOURDHUI())))
avec les plages nommées de Monique
=SOMMEPROD(Mtts*(MatriceSemaine(Jrs;AUJOURDHUI())))

@+Jean-Marie
 

JeanMarie

XLDnaute Barbatruc
Bonjour

Voici la function modifiée
Code:
Public Function MatriceSemaine(vPlage As Range, Comparateur As Date) As Variant
Dim vMatrice() As Byte
Dim vCell As Range
Dim EgaleSemaine As Byte
Dim J As Double

   ReDim vMatrice(vPlage.Rows.Count - 1)
   EgaleSemaine = DatePart('ww', Comparateur, 2)
   J = 0
   For Each vCell In vPlage
      If DatePart('ww', vCell, 2) = EgaleSemaine And WeekDay(vCell, 2) < 6 Then
         vMatrice(J) = 1
      Else
         vMatrice(J) = 0
      End If
      J = J + 1
   Next vCell
   MatriceSemaine = Application.WorksheetFunction.Transpose(vMatrice)
End Function

Si j'ai un conseil à te donner sur l'utilisation d'une méthode par rapport à l'autre, c'est de prendre celle qui te donnera le plus de souplesse dans l'évolution de ton tableau.

@+Jean-Marie
 

Gael

XLDnaute Barbatruc
Bonjour Staple, Bonjour à tous,

J'ai regardé ta formule et il me semble que c'est tout simplement le premier EQUIV qui pose problème car comme tu n'a pas spécifié d'argument type de recherche, il prend 1 par défaut soit :

'la valeur la plus élevée qui est inférieure ou égale à celle de l'argument valeur_cherchée'

Si tu ajoutes ;0, ça marche très bien car il cherche la première exactement équivalente.

@+

Gael
 

Discussions similaires

Réponses
6
Affichages
375
Réponses
6
Affichages
1 K

Statistiques des forums

Discussions
312 482
Messages
2 088 765
Membres
103 954
dernier inscrit
SirJah