question sur VBA EXCEL

caroline24

XLDnaute Nouveau
svp je suis debutante en vba excel et j'ai un exercice à faire , si quelqu'un peut m'aider c'est urgent

o Colonne A : Code PRODUIT
o Colonne B : Code VENDEUR
o Colonne C : N° de département géographique (français)
o Colonne A : Le Chiffre d'Affaires CA
La feuille SOUS_TOTAUX est initialement vierge.

• Question n°1
• Le traitement VBA Excel qui est demandé est une recopie des données de la feuille BASE vers la feuille SOUS_TOTAUX (titres de colonnes inclus) mais en ne prenant pas en compte les lignes de CA <=100.

• Question n°2
• Le traitement VBA Excel qui est demandé est l'application de l'assistant de sous-totalisation (Cf menu "Données/Sous-totaux..." sous Microsoft Excel) sur la feuille SOUS_TOTAUX.

La sous-totalisation demandée sommera les CA pour les différents produits (3 sous-totaux car 3 produits différents dans le jeu d'essai).

Pour cette question, le recours à l'enregistrement automatique est accepté mais il faudra toutefois veiller à ce que votre procédure puisse être utilisée sur une plage de données plus importante en nombre de lignes.


• Question n°3
• Le traitement VBA Excel qui est demandé ici est encore l'application de l'assistant de sous-totalisation sur la feuille SOUS_TOTAUX.

La sous-totalisation demandée sommera les CA pour les différents produits (3 sous-totaux car 3 produits différents dans le jeu d'essai) et pour les vendeurs (deuxième niveau de totalisation).

Pour cette question, le recours à l'enregistrement automatique est accepté mais il faudra toutefois veiller à ce que votre procédure puisse être utilisée sur une plage de données plus importante en nombre de lignes.


• Question n°4
• Le traitement VBA Excel demandé est identique à celui de la question n°2. Par contre, le recours à l'enregistrement automatique de la commande de menu "Données/Sous-totaux..." n'est pas autorisé.

Le traitement devra être effectué par une approche "algorithmique", c'est à dire qu'une fois que les données seront triées ( selon la colonne A), il faudra :
o parcourir verticalement les données et s'arrêter dès que l'on change de produit
o insérer une ligne blanche et y intégrer la totalisation (qui aura été préparée préalablement)
o ..

• Question n°5
• Le traitement VBA Excel demandé consiste à exporter le contenu de la feuille BASE sous la forme d'un fichier ASCII délimité par des points virgules. Le fichier généré sera nommé BASE.txt.

La procédure sera nommée QUESTION5.
• Question n°6
• Le traitement VBA Excel demandé assurera les opérations suivantes :
o Appel de la procédure QUESTION1
o Tri des données selon le code produit
o Mise en place de sous-totaux (par l'intermédiaire de l'assistant "Données/Sous-totaux...")
o Compression du plan
o Création d'un histogramme présentant le CA de chaque produit et le CA total
 

Pièces jointes

  • Sous_totaux(3).xls
    19 KB · Affichages: 93

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Re-bonsoir Caroline24,

Je profite de la remarque très judicieuse de Staple1600 :
Staple1600 à dit:
Faut dire à ma décharge, que 1 et l sont très proches visuellement dans VBA

Pour te dire (ou rappeler), qu'un code VBA clair est toujours préférable à un code court, mal présenté, non commenté. Car plus tard, quand tu reprendras ton code, tu devras te replonger dedans, le décortiquer longuement avant de retrouver ce que tu voulais faire.

Pour que ton code soit clair il faut :
-> ne pas avoir peur de mettre des retraits de lignes, des sauts de lignes (ça ne ralenti pas du tout l’exécution de la macro)
-> aligner les boucles. Par exemple si devant For... To... tu met 5 espaces. Sur la ligne ayant le code : Next... mettre devant le même nombre d'espaces.
-> utiliser des noms de variable clair et compréhensif ;)

Il faut savoir que pour les noms de variable il ne faut pas mettre d'espace. Donc si tu veux mettre plusieurs mots, tu les colles et met une majuscule au début de chaque mot.



Exemple concret, dans ton code tu utilise les variables suivantes :

i -> qui contient le compteur de ta boucle For... To... Next : seul cas où tu peux mettre une lettre qui veut rien dire

j -> variable qui contiendra le sous-total des produits P1. Tu aurais pu par exemple l'appeler : SousTotalP1 et non pas j

k -> variable qui contiendra le sous-total des produits P2. Tu aurais pu par exemple l'appeler : SousTotalP2 et non pas k

l -> variable qui contiendra le sous-total des produits P3. Tu aurais pu par exemple l'appeler : SousTotalP3 et non pas l

dl -> variable qui contiendra le nombre de ligne de ton tableau. C'est déjà un début : "dl" pour "DernièreLigne" mais si Staple1600 avait bien fait les choses, il aurait appelé sa variable : DernièreLigne et non pas dl :D

Mais bon, je ne lui jette pas la pierre ;) moi aussi il m'arrive parfois de prendre des raccourcis pour aller plus vite.

Voili voilou pour le dernier cours du WE.

A bientôt
 
Dernière édition:

caroline24

XLDnaute Nouveau
Re : question sur VBA EXCEL

Bonjour Excel-lent ,
Bonjour Staple 1600,
Bonjour Forum,

Merci bien pour votre intérêt et soutien
le premier code a réussi a vider les lignes , mais les Totaux restais toujours dans la colonne E
pourtant le dernier les a mis sur les lignes vides dans la colonne D
et j'ai pu grace à vos explications ajouter l’écriture "total" sur la même ligne avec le code :

Code:
Range("A" & 10) = "Total"
    Range("A" & 17) = "Total"
    Range("A" & 25) = "Total"

et voilà le code final :
Code:
Sub
Dim DebutLig As Long, ii As Long

Dim i 'as integer
Dim j 'as integer
Dim k 'as integer
Dim l
Dim dl As Long

 dl = Sheets("SOUS_TOTAUX").Cells(Application.Rows.Count, 1).End(xlUp).Row

  For i = 1 To dl
   Select Case Range("A" & i).Value
   Case Is = "P1"
   j = Range("D" & i) + j
   Case Is = "P2"
   k = Range("D" & i) + k
   Case Is = "P3"
   l = Range("D" & i) + l
   End Select
   Next i
MsgBox j
MsgBox k
MsgBox l

DebutLig = 2
ii = DebutLig + 1
    While Cells(ii, "A") <> ""
        If Cells(ii, "A") <> Cells(ii - 1, "A") Then
        Rows(ii).EntireRow.Insert
        ii = ii + 1
        End If
    ii = ii + 1

    Wend
    Range("A" & 10) = "Total"
    Range("A" & 17) = "Total"
    Range("A" & 25) = "Total"
    Range("D" & 10) = j
    Range("D" & 17) = k
    Range("D" & 25) = l
End Sub

Est ce que c'est juste ?
Attendant votre reponse cordialement
 

Staple1600

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonjour caroline

Le principal est que tu comprennes ton code VBA.
C'est le cas ?

Tu peux supprimer ces trois lignes (qui n'étaient là (comme indiqué) que pour tester)
MsgBox j
MsgBox k
MsgBox l

et tu peux simplifier comme cela

Range("A17,A25") = "Total"
Range("D10") = j
Je te laisse modifier le reste.

Tu as cherché la réponse à ce que te disais Excel-Lent ?
' je te laisse rajouter après le "as" le type de variable approprié ;)

EDITION: Tu sembles ne pas avoir vu le code final d'Excel-Lent qui à mon avis colle mieux que le mien à l'énoncé du problème
http://www.excel-downloads.com/forum/190220-question-sur-vba-excel.html#post1180806
(Il manque juste dans son code Dim l 'As ... tout comme lui je te laisse compléter ;) )
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonjour tout le monde, Caroline,

Je confirme, le dernier code que je t'ai donné fonctionne (si tu complète les lignes Dim...). Je l'ai testé avant de te l'envoyer et ça collé parfaitement avec la question et en plus le résultat obtenu était juste.

Si tu le souhaite, bien que pas demandé dans l'exercice, tu peux rajouter le mot "Total" dans la colonne A.

Pour cela il te suffit de compléter la seconde boucle For... To... Next...

Pourquoi as-tu rajouté ces lignes de code????
Range("D" & 10) = j
Range("D" & 17) = k
Range("D" & 25) = l

dans un de mes précédents commentaire, je t'ai déjà dit que c'était juste pour l'exemple de l'exercice mais FAUX par rapport à l'ennoncé de ton problème :
votre procédure puisse être utilisée sur une plage de données plus importante en nombre de lignes

Ce qui signifie que tes sous-totaux ne seront pas tout le temps sur les lignes : 10, 17 et 25 ;)

Idem pour l'insertion du mot "Total"
Range("A" & 10) = "Total"
Range("A" & 17) = "Total"
Range("A" & 25) = "Total"

Pourquoi as-tu fais ces erreurs? Je t'avais tout expliqué dans l'un de mes précédents commentaire.
Or comme tu n'as posé aucune question dessus, cela sous-entendait que tu avais compris :( :( :(

Comme écrit à mainte reprise par JM (Staple1600), n'hésite pas à poser des questions ;)

C'est pour quand ton exercice?

A bientôt
 

Staple1600

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Excel-Lent, caroline (si jamais tu repasses par ici ;) )


Toi aussi tu as l'humeur chafouine ;)
Pourtant tu as vu que je te recommande l'emploi de ton code plutôt que le mien (cf EDITION de mon précédent message)

Mais peut-être caroline est simplement timide et non pas avare de questions ;)

Mais horreur, nous sommes lundi aprés-midi, et nous ne savons toujours pas si caroline a su répondre à ses questions, ni même les commentaires du prof.

PS: caroline24:
Par curiosité j'aimerai bien savoir dans quel cursus on suit ce genre de formation sur VBA ?
 

ChTi160

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonjour Caroline
Bonjour le Fil
Bonjour le Forum
VB:
Option Explicit

Sub test_Caroline()

Dim DebutLig As Long, ii As Long

Dim i As Integer
Dim jP1 As Currency
Dim kP2 As Currency
Dim lP3 As Currency
Dim Derlgn As Long

With Sheets("SOUS_TOTAUX") 'avec cette feuille
 Derlgn = .Cells(.Rows.Count, 1).End(xlUp).Row 'on détermine la derniere ligne non vide de la colonne 1 en partant du bas

  For i = 2 To Derlgn 'pour chaque ligne de la ligne 2 a Derlgn
     Select Case .Range("A" & i).Value 'on verifie la valeur de la Colonne 1 de cette ligne
            Case Is = "P1" 'si egale à P1
                jP1 = jP1 + .Range("D" & i) 'on additionne en ajoutan a la variable jP1
            Case Is = "P2" 'si egale à P2
                kP2 = kP2 + .Range("D" & i) 'on additionne en ajoutan a la variable kP2
            Case Is = "P3" 'si egale à P3
                lP3 = lP3 + .Range("D" & i) 'on additionne en ajoutan a la variable lP3
     End Select
   Next i 'autre ligne "i"
   
ii = 3 'on incremente la variable a trois afin de compare la troisieme et la deuxiame qui est la premiere ligne du tableau

    While .Cells(ii, "A") <> "" 'tant que la cellule ainsi definie n'est pas vide
        If .Cells(ii, "A") <> .Cells(ii - 1, "A") Then 'et que les valeurs de ces deux cellules ainsi définies sont différentes
        .Cells(ii, 1).EntireRow.Insert 'on insere une ligne entre ces deux lignes différentes
        .Cells(ii, "A") = "Sous total" 'sur cette nouvelle ligne en Colonne A on ajoute "Sous Total"
        .Cells(ii, "D") = IIf(.Cells(ii - 1, "A") = "P1", jP1, IIf(.Cells(ii - 1, "A") = "P2", kP2, lP3)) 'ici on ajoute la valeur de la variable qui est déterminée en fonction du résultat de la double Condition "IIf" voir l'aide
        
        ii = ii + 2 'on ajoute 2 pour ne pas prendre en compte la ligne "Sous Total"
        
        End If 'fin de Condition
  ii = ii + 1
    Wend
        .Cells(ii, "A") = "Sous Total" 'ici on colle la valeur de la Variable
        .Cells(ii, "D") = lP3 'ici on colle la valeur de la Variable
 End With
End Sub
j'ai essaye de tenir compte des recommandations de Frédéric et JM
je n'ai pas inclus ce qui est pourtant indispensable le tri des données
Bonne continuation
Amicalement
Jean marie
 

Staple1600

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Jean-Marie

C'est pas / mais \ dans ta balise de fin

PS: Ca fait drôle de se dire Bonjour ;)

EDITION: Tu as édité en même temps que j'écrivais, du coup mon message ne veut plus rien dire ;)
Heureusement cela aura au mois servi à un JM de saluer un autre JM ;)
 

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Re-bonjour,

Concernant ton code une petite remarque sur cette partie :
VB:
Dim i 'as integer
Dim j 'as integer
Dim k 'as integer
Dim l
Dim dl As Long

Comme tu peux le remarquer dans ton code, et ici : "integer" est en vert ;)
Cela signifie qu'Excel considère cela comme un commentaire. La raison est toute simple, tu as mis devant le symbole '

Pour régler le problème, il te suffit d'effacer ce symbole ;)
De plus, tes variables "sous-totaux" peuvent contenir tes nombres à virgules ;) Or la variable integer est utilisé uniquement pour les nombres entier.

Donc dans l'exemple de ton prof, ça fonctionne, puisqu'il n'y a que des nombres entier, mais dans la vrai vie ça ne fonctionnera pas.

Pour la variable l tu as oublié de mettre as...

Bon courage, tu es sur la bonne voie.

A bientôt
 

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Staple1600,

Staple1600 à dit:
Toi aussi tu as l'humeur chafouine ;)
Pourtant tu as vu que je te recommande l'emploi de ton code plutôt que le mien (cf EDITION de mon précédent message)

LOL

Oui, j'ai vu. Un grand merci. Et t'as vu? Pour ma part j'ai indiqué que ta condition while était mieux adapté que If...Then...ElseIf...End If "chapeau bas"!

Mais que veux-tu, je lui ai donné déjà tellement d’éléments à ingurgiter, comme c'était pas faux, j'ai préférais ne rien dire (d'autant plus que le prof à mon avis de lui diras rien si elle utilise l'une ou l'autre méthode).

Et oui, c'est vrai, moi aussi je suis un peu chafouine lol
J'aurais préféré plus de questions.

Mais bon, on est tous différent. Caroline est autodidacte, d'autres préfère poser des tonnes de questions.

C'est la vie! ;)

A bientôt toute le monde.

PS. : en tout cas, ce sujet est très vivant! Les conseils/astuces/réponses n'arrêtent pas de pleuvoir! On se croise sans cesse :)
Très formateur pour Caroline. Espérons juste qu'elle ne va pas se perdre au milieu de tout ça. Caroline, si tu es perdu, n'hésite surtout pas : pose deS questionSSSSS ;)
 

nat54

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Excel-Lent, caroline (si jamais tu repasses par ici ;) )

PS: caroline24:
Par curiosité j'aimerai bien savoir dans quel cursus on suit ce genre de formation sur VBA ?
Moi j'aurai bien aimé en faire lors de mon cursus gestion..
Je n'ai pas les bases donc à chaque fois je perds un temps fou (heureusement qu'il y a XLD d'ailleurs !)

ps : j'ai d'ailleurs un sujet en cours :d (Staple1600, EricS t'avait missionné pendat ses vacances, LOL je rigole)
 

Discussions similaires

Réponses
9
Affichages
155

Statistiques des forums

Discussions
312 193
Messages
2 086 058
Membres
103 110
dernier inscrit
Privé