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 05/09/2011, 15h40   #1
Invité de passage
 
Homme
Développeur informatique
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 4
Points : 4
Par défaut Totaux et remises conditionnelles sur colonnes

Bonjour à toutes et à tous !

J'ai un petit soucis pour programmer ma petite macro et je viens à vous pour me dépanner si cela et possible.

Situation / le contexte:
J'entame tout fraîchement mon premier stage au sein d'une entreprise et déjà un premier projet est tombé, je suis tout seul dans un box et mon maitre de stage est absent, j'ai 1 mois pour le faire, ah oui et le VBA c'est tout nouveau pour moi .

Explication du problème:

...A(Date).............B(Prix)
......
1.21/09/2008........25
2.22/09/2008........56
......

La macro doit être capable de d'additionner toute une colonne (dans l'exemple ci-dessus, la colonne B) et de donner le résultat dans une nouvelle cellule quelconque...
Jusque la, même ma grand-mère, avec un peu d'entrainement pourrait y arriver.
Mais la suite devient "tricky" : En fonction de la date (dans l'exemple ci-dessus: A1 par exemple), on appliquerait sur la cellule d’à côté (donc B1)
50% du chiffre si nous sommes entre le 25 du mois et le 05 du mois suivant.

Total: Mon boss -> et moi ->

J'entame des tutos (site du zéro et autres) et je suis motivé pour finir ce projet. Je me tourne donc vers vous pour récupérer de bon liens (tutos, tips, trucs et astuces) ou même un petit coup de pouce (les cheat codes ne sont pas de refus ! ).

PS: pour mon niveau de développeur, je connais le C, un petit peu d'Objective-C et accessoirement je connais le Kung-fu !
mindhavok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 16h11   #2
Expert Confirmé
 
Homme Philippe
ex Observeur CGG / Analyste prog.
Inscription : juin 2006
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Finistère (Bretagne)

Informations professionnelles :
Activité : ex Observeur CGG / Analyste prog.

Informations forums :
Inscription : juin 2006
Messages : 1 703
Points : 3 624
Points : 3 624
Salut, voir sur http://didier-gonard.developpez.com/...-excel-et-vba/
__________________
Pensez à Voter, d'avance merci. ( Pouces en bas à la droite de Citer )
Balisez votre code après l'avoir indenté sous Excel via Smart Indenter
Autre utilitaire : MZ Tools 3.0 VBA

Contribution : Excel / Word / PDF avec Adobe Acrobat Pro / PDFCreator 1 2
kiki29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 17h11   #3
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Une piste :
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
 
Sub Totaliser()
 
    Dim Plage As Range
    Dim Cel As Range
    Dim Total As Double
 
    'défini la plage, adapter le nom de la feuille
    With Worksheets("Feuil1")
 
        Set Plage = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp))
 
    End With
 
    'parcour les cellules de la plage en vérifiant le jour dans la colonne d'à coté
    For Each Cel In Plage
 
        If Day(Cel.Offset(0, -1)) >= 25 Or Day(Cel.Offset(0, -1)) <= 5 Then
 
           Total = Total + Cel * 0.5 'totalise en ajoutant la moitié de la valeur
 
        Else
 
           Total = Total + Cel 'sinon, toute la valeur
 
        End If
 
    Next Cel
 
    'indique le résultat dans une boite de message, à adapter pour la récup du résultat
    MsgBox Total
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 05/09/2011, 22h53   #4
Membre habitué
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 121
Points : 121
Envoyer un message via MSN à issoram
Est-ce vraiment nécessaire de passer par du code VBA (artillerie lourde)?
Une bonne vieille formule matricielle dans ta cellule ferait l'affaire.

Pour l'exemple ci dessous:

------   A (Date) ----  B (Prix)
  1. 21/09/2008 -- 10,00 €
  2. 22/09/2008 -- 10,00 €
  3. 23/09/2008 -- 10,00 €
  4. 24/09/2008 -- 10,00 €
  5. 25/09/2008 -- 10,00 €
  6. 26/09/2008 -- 10,00 €
  7. 27/09/2008 -- 10,00 €
  8. 28/09/2008 -- 10,00 €
  9. 29/09/2008 -- 10,00 €
  10. 30/09/2008 -- 10,00 €
  11. 01/10/2008 -- 10,00 €
  12. 02/10/2008 -- 10,00 €
  13. 03/10/2008 -- 10,00 €
La formule:
Code :
=SOMME(B1:B13)-SOMME((JOUR(A1:A13)<=5)*B1:B13 + (JOUR(A1:A13)>=25)*B1:B13)/2
donnera le résultat cherché (ici 85,00 €)

Tu peux nommer tes plages (date et prix) par exemple pour plus de lisibilité dans la formule.

PS: La validation des formules matricielles s'effectue avec CTRL+MAJ+Entrée; des accolades apparaissent alors autour de la formule:
Code :
{=SOMME(B1:B13)-SOMME((JOUR(A1:A13)<=5)*B1:B13 + (JOUR(A1:A13)>=25)*B1:B13)/2}
issoram est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2011, 09h28   #5
Invité de passage
 
Homme
Développeur informatique
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 4
Points : 4
Kiki29:
Pour ce tuto sur les dates, c'est parfait, je te remercie

Theze:
J’étais habitué aux accolades quand je codais en C, c'est vrai que c'est perturbant. Mais ça devrait aller, d'autant plus que je comprend la structure generale du code. Merci !

issoram:
Ton alternative est intéressante, mais je dois automatiser la tâche sur plusieures fiches, d’où l’intérêt d'une macro et donc le VBA (arrêtez moi tout de suite si me trompe ). Mais peut-être est-il possible d’intégrer la formule matricielle dans une macro justement ?

J'ai bien avancé grâce a vous tous et je vous en remercie grandement !
Mais il me reste un problème de taille:

On est obligé de designer le nom du Worksheet
Code :
With Worksheet("Nom_du_worksheet")
Or, dans ma macro, est-il possible de dire: "je veux faire les calcules dans l'actuel Worksheet où je travaille" ?

Du style :
Merci encore
mindhavok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 17h07   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

voir l'aide VBA à : Workbook.ActiveSheet, propriété ?

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 16h32   #7
Invité de passage
 
Homme
Développeur informatique
Inscription : septembre 2011
Messages : 14
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : septembre 2011
Messages : 14
Points : 4
Points : 4
Bon et bien voila, j'ai fini mon projet et je vous remercie a tous.
Je drop le code si jamais ça peut dépanner (bon c'est peut être pas très très propre mais ça marche :p)

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Sub totalizor()
 
Dim c As Range
Dim Err As Range
Dim Nocol As Integer
Dim Plage As Range
Dim Cel As Range
Dim Check As Integer
Dim Total As Double
 
Check = 0
Total = 0
 
With Worksheets(1).Rows(1)
    Set Err = .Find("Nouveau Prix")
    If Err Is Nothing Then
        With Worksheets(1).Rows(1)
            Set c = .Find("Nom Collaborateur")
            If Not c Is Nothing Then
                Nocol = c.Column
                Columns(Nocol - 1).Select
                Columns(Nocol).Insert Shift:=xlToRight
                Selection.Copy
            End If
        End With
 
        With Application.Worksheets(1)
            Set Plage = .Range(.Cells(2, 7), .Cells(.Rows.Count, 7).End(xlUp))
        End With
        For Each Cel In Plage
            If Check = 0 Then
                Cel.Offset(-1, 1) = "Nouveau Prix"
                Check = 42
            End If
            If Cel.Offset(0, -6) Then
                If Day(Cel.Offset(0, -6)) >= 25 Or Day(Cel.Offset(0, -6)) <= 5 Then
                    Cel.Offset(0, 1) = (Cel * 0.5)
                Else
                    Cel.Offset(0, 1) = Cel
                End If
            End If
        Next Cel
 
        With Application.Worksheets(1)
            Set Plage = .Range(.Cells(2, 8), .Cells(.Rows.Count, 8).End(xlUp))
        End With
        For Each Cel In Plage
            If Cel.Offset(1, -7) Then
                Total = Total + Cel
            Else
                Total = Total + Cel
                Cel.Offset(1, 0) = Total
            End If
        Next Cel
 
        With Application.Worksheets(1)
            Set Plage = .Range(.Cells(2, 7), .Cells(.Rows.Count, 7).End(xlUp))
        End With
        Check = 0
        For Each Cel In Plage
            If Cel.Offset(0, -6) Then
                If Day(Cel.Offset(0, -6)) >= 25 Or Day(Cel.Offset(0, -6)) <= 5 Then
                    If Check = 0 Then
                        Cel.EntireRow.Interior.Color = RGB(255, 246, 143)
                        Check = 1
                    Else
                        Cel.EntireRow.Interior.Color = RGB(275, 266, 163)
                        Check = 0
                    End If
                End If
            End If
        Next Cel
    Else
        MsgBox ("deja fait!")
    End If
End With
 
End Sub
mindhavok 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 17h10.


 
 
 
 
Partenaires

Hébergement Web