Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2011, 19h16   #1
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
Par défaut Somme en fonction de deux critères

Bonjour
Je débute en vba et la je me heurte à un problème
Je n'arrive pas à effectuer une somme en fonction de deux critères de sélection.
Le pire c'est que la formule fonctionne sur un autre fichier alors je sèche. Pouvez vous m'aider ? Merci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public Sub CommandButton5RecetteChequeJour_Click()
 
TextBox17 = Format(Now(), "dd/mm/yyyy")
TextBox15.Value = ""
 
' Définit variable DateChequeJourEntier     date sous forme nombre
Dim DateChequeJour As Date
Dim DateChequeJourEntier As Variant
DateChequeJour = Format(Now(), "dd/mm/yyyy")     ' TextBox17.Value
DateChequeJourEntier = (CDbl(DateChequeJour))
TextBox15.Value = (CDbl(DateChequeJour))
 
' Définit la variable SommeCJ et l'initialise à "0"
Dim SommeCJ As Double
SommeCJ = "0"
 
 
' Utilisation de l'onglet liste afin de calculer la somme perçue
' en chèque en fonction de la date sous forme de chiffre
 
' La colonne Z contient la date sous forme de chiffre
' La colonne F contient le type de paiement soit Chèque soit Espèces
' La colonne T contient la somme payée par le client
 
With Worksheets("Liste")
 
Dim i As Long
 
    For i = 3 To 65535
        If .Range("Z" & i) = DateChequeJourEntier And .Range("F" & i) = "Chèque" Then
            SommeCJ = SommeCJ + Val(.Range("T" & i))
        End If
    Next i
 
End With
 
'Le userform2 est le masque de saisie du contrôle de caisse du soir
' doit afficher la somme perçue par chèque en fonction du jour
With UserForm2
 
    Label25.Caption = SommeCJ
 
End With
 
 
End Sub
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 19h53   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Dans un premier temps, afin de lever tout qui propos, je te conseil de spécifier la propriété Value
Code :
If .Range("Z" & i).Value = DateChequeJourEntier And .Range("F" & i).Value = "Chèque" Then

La variable DateChequeJourEntier est de type variant, mais prend un type entier après ce code.
Code :
DateChequeJourEntier = (CDbl(DateChequeJour))
Si la colonne Z contient une date, il est normal de ne pas avoir égalité.
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 17/09/2011, 20h33   #3
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Une autre proposition (sans boucler inutilement sur plus de 60 milles lignes)

La fonction suivante fait la somme de tous les montants de la la colonne T dont la colonne F contient Chèque et la colonne Z la date d'aujourd'hui
Une seule restriction est obligatoire: Toutes les données de la plage T3:Txx doivent être numériques (ou vides)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function SommeChequesAujourdhui() As Double
Dim DateChequeJourEntier As Long, LastLig As Long
Dim SommeCJ As Double
 
DateChequeJourEntier = CLng(Date)
With Worksheets("Liste")
    LastLig = .Cells(.Rows.Count, "Z").End(xlUp).Row
    SommeCJ = Evaluate("SUMPRODUCT((Z3:Z" & LastLig & "=" & DateChequeJourEntier & ")*(F3:F" & LastLig & "=""Chèque"")*(T3:T" & LastLig & "))")
End With
SommeChequesAujourdhui = SommeCJ
End Function
 
Public Sub TREST()
 
MsgBox SommeChequesAujourdhui
End Sub
A tester comme ceci
Code :
1
2
3
4
Sub TEST()
 
MsgBox SommeChequesAujourdhui
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/09/2011, 10h58   #4
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
bonjour,

merci pour vos réponses



merci Mercatog pour tes lignes de code.

j'avais bien vu que je testais sur 65000 lignes et que cela était inutile et que cela ralentissait aussi l'exécution du prog. je contais résoudre ce pb par la suite, une chose a la fois.

dans ce code vous dites " la colonne Z la date d'aujourd'hui" sous quel forme entendez vous cela ? 17/09/2011 ou 40803


dans mon prog la colonne Z contient la date sous la forme de chiffre
ex 17/09/2011 ---> 40803
et c'est bien cette valeur "40803" qui est présente en colonne Z
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h07   #5
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Citation:
et c'est bien cette valeur "40803" qui est présente en colonne Z
pour moi, .Value retourne 17/09/2011 et .Value2 retourne 40803.
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/09/2011, 13h17   #6
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Citation:
Envoyé par arthur83fr Voir le message
dans ce code vous dites " la colonne Z la date d'aujourd'hui" sous quel forme entendez vous cela ? 17/09/2011 ou 40803
As-tu testé le code proposé!
Une date dans une feuille excel est 40803 (mais l'affichage peut être 17/09/2011, 17 septembre 2011 ou 17.9.11) n'imprte, c'est seulement un format.
Cherches des tutos dans ce sens. Notamment celui-ci
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/09/2011, 14h02   #7
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
re bonjour

le code proposé me donne 0 alors qu'il devrait me donner 6+8=14
mais c'est certain c'est xxxx fois plus rapide


alors je sais bien que je debute en vba mais j'y comprends vraiment de moins en moins
d'autant plus que le code pour cette appli est un copier coller d'un premier soft qui lui me donne la reponse. dans la deuxieme version j'ai juste enlevé qq boite qui n'etaient pas necessaires : boite entrée de date du jour remplacée par now

voila mon casse tête
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 14h06   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
J'ai bien mis Date à la place de Now

Date donne la date d'aujourd'hui (sans les décimales des heures)
Code :
DateChequeJourEntier = CLng(Date)
[EDIT]
Sinon, si dans ta colonne Z tu as des dates avec les heures, la fonction serait
Code :
1
2
3
4
5
6
7
8
9
10
11
Function SommeChequesAujourdhui() As Double
Dim DateChequeJourEntier As Long, LastLig As Long
Dim SommeCJ As Double
 
DateChequeJourEntier = CLng(Date)
With Worksheets("Liste")
    LastLig = .Cells(.Rows.Count, "Z").End(xlUp).Row
    SommeCJ = Evaluate("SUMPRODUCT((INT(Z3:Z" & LastLig & ")=" & DateChequeJourEntier & ")*(F3:F" & LastLig & "=""Chèque"")*(T3:T" & LastLig & "))")
End With
SommeChequesAujourdhui = SommeCJ
End Function
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/09/2011, 14h16   #9
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
voila je joint le code du projet
je sais qu'il est pas tres propre et qu' il y a certainement des incoherences ainsi que des betises de debutant merci d'etre clement
Fichiers attachés
Type de fichier : zip Projet dev 17_11_2011.zip (225,0 Ko, 14 affichages)
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 14h39   #10
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Comme ça ça l'aire de fonctionner proprement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function SommeChequesAujourdhui() As Double
Dim DateChequeJourEntier As Long, LastLig As Long
Dim SommeCJ As Double
 
DateChequeJourEntier = CLng(Date)
With Worksheets("Liste")
    LastLig = .Cells(.Rows.Count, "Z").End(xlUp).Row
    SommeCJ = Evaluate("SUMPRODUCT((INT(Liste!Z3:Z" & LastLig & ")=" & DateChequeJourEntier & ")*(Liste!F3:F" & LastLig & "=""Chèque"")*(Liste!T3:T" & LastLig & "))")
End With
SommeChequesAujourdhui = SommeCJ
End Function
 
Private Sub CommandButton5RecetteChequeJour_Click()
 
Me.TextBox17 = Format(Now, "dd/mm/yyyy")
Me.TextBox15.Value = SommeChequesAujourdhui
Me.Label25.Caption = SommeChequesAujourdhui
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/09/2011, 17h53   #11
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
merci Mercatog

cela fonctionne super bien

je vais essayer de decortiquer ce bout de code afin de le comprendre
et de bien sur evoluer en vba

je pense que je vais venir souvent sur ce site

merci encore
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h16.


 
 
 
 
Partenaires

Hébergement Web