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

Staple1600

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Re

Pour la question2, code obtenu avec l'enregistreur de macros (sauf les 2 premières lignes ajoutées )
Code:
Sub Question2()
'
' Macro1 Macro
' Macro enregistrée le 12/08/2012 par Staple1600
'

Dim MonTableau As Range
Set MonTableau = Range("A1").CurrentRegion
MonTableau.Subtotal _
    GroupBy:=1, _
    Function:=xlSum, _
    TotalList:=Array(4), _
    Replace:=True, _
    PageBreaks:=False, _
    SummaryBelowData:=True
End Sub

Avais-tu essayé de faire cela chez toi ?
Faire manuellement Données/Sous-Totaux (tout en faisant tourner l'enregistreur de macros)

Pour la question3, il faut juste un niveau de sous-total (vendeurs)

Je te laisse essayer sur ton PC.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Re

Toujours connectée au moment où je rédige ce message, mais absente dans ton fil ??

Comme je vais au dodo, je n'attends pas ta réponse...

Voici pour la question 3
Code:
Sub Question3()
' Macro enregistrée le 12/08/2012 par Staple1600
Dim MonTableau As Range
Set MonTableau = Range("A1").CurrentRegion
    MonTableau.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4), _
        Replace:=True, PageBreaks:=False, SummaryBelowData:=True
    MonTableau.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(4), _
        Replace:=False, PageBreaks:=False, SummaryBelowData:=True
ActiveSheet.Outline.ShowLevels RowLevels:=3
End Sub

Je suppose que tu n'as toujours pas de questions ? :rolleyes:
 

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonsoir Caroline24,


Surtout pas! Il est clairement indiqué dans ton ennoncé :
Caroline24 à dit:
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é.

Ton prof a été SUPER sympa, il vous a TOUT expliqué clairement et en DETAIL tout ce que tu dois faire :

Caroline24 à dit:
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 ..

1/ trier tes données selon la colonne A (en premier critère) et selon la colonne B (en second critère) en utilisant soit l'enregistreur de macro, soit l'écrire toi même si tu as assimilé les explications ci-dessus.

2/ a partir de là, il NE faut PAS utiliser la méthode "données/sous-totaux". Comme indiqué par ton prof :
-> regarder le contenu de la première ligne de ton tableau (en dessous-de la ligne de titre).
-> regarder le contenu de la seconde ligne :
-----> si le produit est différent : insérer une ligne vierge + ajouter un total
-----> si le produit est identique : passer à la ligne suivante et comparer avec la ligne juste au-dessus, et ainsi de suite. Et cela jusqu'à la dernière ligne de ton tableau (chose que tu sais déjà faire, car utilisé ci-dessus par mes amis, et compris par toi).

En clair : tu peux par exemple utiliser la fameuse boucle : For ... To ... Next (la plus simple à comprendre et à utiliser).

Essaye de faire quelque chose en suivant cela, en regardant sur ton bouquin comment fonctionne la boucle ci-dessus. Ensuite reviens vers nous pour nous montrer ta solution et si besoin nous poser des questions.

PS. : désolé si je ne te donne pas la solution toute faite, mais en faisant ainsi je ne te rendrais pas service. De plus :

1/ lorsque ton prof regardera ta macro il comprendra très vite que tu n'as pas fait l'exercice toi même. Alors si en plus il gratte en te posant des questions, il n'aura plus aucun doute sur le fait que tu as triché.

2/ ton prof peut également tomber sur ce forum ;) A moins qu'il le fréquente régulièrement - comme beaucoup de passionnés d'Excel (car ce forum est très connu et réputé). Alors comme en plus tu as, semble-t-il, utilisé ton prénom pour pseudo, il va vite te retrouver ;)
 

caroline24

XLDnaute Nouveau
Re : question sur VBA EXCEL

Oui mais quand même j'avoue que j'ai appris beaucoup de choses avec vous , mon prof n'en serait que fier on me voyant faisant des recherches , et c'est le but , en plus il est sympa il comprendra ,
je vais m'informer sur la boucle "For To Next" et l'essayer ,et je te tient au courant
Merci encore pour ton temps
 

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonjour Caroline24,

Pour t'aider et gagner du temps, voici ci-joint un exemple concret avec la boucle "For... To... Next"

De plus tu pourras voir dans la macro comment analyser les cellules une par une.

Dans l'exemple la variable "i" va de la valeur 1 à 10 car il faut gérer les lignes 1 à 10, mais si tu dois gérer les lignes 5 à 20, il te suffit d'écrire :
VB:
For i = 5 to 20
'...
Next i

A tout à l'heure
 

Pièces jointes

  • Exemple pour la boucle for to next.xls
    18.5 KB · Affichages: 55

caroline24

XLDnaute Nouveau
Re : question sur VBA EXCEL

Bonjour Excel-lent , Bonjour Forum,
Voilà j'ai commencé par ajouter des chiffres dans la colonne C pour essayé de faire une somme sur votre exemple mais je bloque sur l’affichage de la valeur d'une variable voila ce que j'ai tapé :
Sub TestBoucle()

For i = 1 To 10

j = 0
If Range("A" & i) = "Coucou1" Then
j = Range("C" & i) + j
Range("C" & 11) = j

End If

Mais ça affiche toujours la lettre j
Et merci :)
 

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonjour Caroline24,

Tu as fais une petite erreur. Tu as mis la ligne de code :

à l'intérieur de la boucle For... To... Next

Donc à chaque fois qu'il exécute la boucle, il remet ta variable "J" à zéro.

Il faut le faire au début, AVANT ta boucle ;)

Concernant ta ligne de code suivante :
Range("C" & 11) = j

Comme elle est à l'intérieur de ta boucle, il met à jour le total à CHAQUE exécution de la boucle, c'est à dire 10 fois dans ton cas.

Tu peux très bien le faire qu'une fois, juste avant la fin de ta macro (APRES ta boucle) ;)

Bref, tu n'as pas faux, mais ta macro sera plus lente (en temps d’exécution).

Voici ci-dessous ta macro corrigé.

VB:
Sub TestBoucle()

j = 0

For i = 1 To 10
    If Range("A" & i) = "Coucou1" Then
        j = Range("C" & i) + j
    End If
Next i

Range("C" & 11) = j

End Sub


Tu es sûr la bonne voie :) continue ainsi et n'hésite pas à revenir vers nous si tu as d'autres questions/soucis.

Tu as exactement la bonne attitude. Tu fais ta macro petit à petit et la complique au fur et à mesure.

C'est je trouve la meilleure méthode car :
-> c'est plus facile à écrire et à comprendre
-> permet de voir très rapidement d'où vient le problème

Bonne continuation

PS 1. : j'en ai profité pour te montrer comment présenter ton code. Ne pas hésiter à faire des sauts de ligne pour scinder les différents bloc. Ne pas lésiner sur les retraits de ligne, cela permet de voir d'un simple coup d'oeil :
-> le début et la fin des boucles
-> le début et la fin des conditions If... Then... End If

PS 2. : attention, même si tu fais la présentation correctement sur Excel et colle ta macro, les retraits de lignes vont disparaître :( Pour éviter cela :
-> mettre au début de ton code : highlight=vba (à mettre entre crochet)
-> mettre à la fin de ton code : /highlight (à mettre entre crochet)

Comme indiqué dans la signature de Staple1600
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bonsoir Caroline
Bonsoir Excel (trop rapide lol)
Bonsoir le Forum

ci dessous ce que j'ai mis et qui fonctionne
VB:
Sub test()

J = 0
  With Worksheets("Feuil1")
              For i = 1 To 10
                            If .Range("A" & i) = "Coucou1" Then
                                                   J = J + Range("C" & i) 'ici j'ai inversé
             .Range("C" & 11) = J 'ici on pourrait mettre .Range("C11")
                      'ou
              '  .Range("C11") = .Range("C11") + .Range("C" & i) 'idem C11
                            End If
               Next i
   End With
End Sub
[/CODE]

Important la déclaration des Variables
Bonne fin de Soirée
Amicalement
Jean Marie
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Jean Marie, Caroline,

Comme très justement indiqué par Jean-Marie, au début de la macro, il faut toujours (c'est pas une obligation, mais c'est mieux) déclarer les variables utilisées dans la macro.

C'est à dire qu'il faut dire à excel ce que chaque variable va contenir!

Voici un lien bien fait qui te donne la liste de tous les types de variables

Concrètement, dans ton cas ta macro contient deux variables : i et j

La variable i te sert de compteur. Elle contiendra un nombre entier compris entre 1 et 10. Donc le type de variable le plus adapté est : byte

La variable j contiendra le total de tes différentes cellules CA. Donc il pourra s'agir de chiffres à virgule, et le nombre peut-être négatif ou positif. Donc le type de variable le plus adapté est Double

Donc juste après la ligne de code :

Il faut écrire :
Dim i as Byte
Dim j as Double

Bonne continuation
 

ChTi160

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Re pour un nouveau test Lol
[highlight=Vba]Sub test()

J = 0
With Worksheets("Feuil1")
For i = 1 To 10


If .Range("A" & i) = "Coucou1" Then

J = J + Range("C" & i)

.Range("C" & 11) = J
'ou
' .Range("C" & 11) = .Range("C" & 11) + .Range("C" & i)
End If
Next i
End With
End Sub [/code]
excuse pour cette incrust
Bonne fin de Soirée
Amicalement
Jean Marie
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Bon la je pense avoir compris
il faut aller dans "Mode Avancé" puis code Vba et on rajoute les balises
Merci encore
ça rend vraiment mieux
Bonne fin de Soirée
Amicalement
Jean Marie
 
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : question sur VBA EXCEL

Salut Jean Marie,

Dans ton post n°24, la seule erreur qu'il y a : c'est la balise [/code] que tu as oublié d'enlever.

Sinon le reste est parfait, c'est juste qu'il y a trop d'espace au début de chaque ligne.

Mais comme tu l'as remarqué, cela est parfaitement rentré dans l'ordre dans ton message n° 27 ;)

Personnellement, j'écris les balises à la main (manuellement). Aussi bien en mode "réponse rapide" que "mode avancé".

Regarde ce lien, nos grands manitous nous explique tous les tenant et les aboutissants.

Pour information :
-> lorsqu'on utilise les balises :
coucou à dit:
on peut mettre à l'intérieur des couleurs, italiques, gras,... mais les espaces sont automatiquement effacé.

-> lorsqu'on utilise les balises :
VB:
 les espaces sont conservés, mais l'on ne peut pas mettre de couleurs, italiques, gras. Et si on le fait quand même, au lieu de mettre en gras par exemple, il écrit les balises aux lieux de les exécuter.
Les couleurs se mettent automatiquement (vert pour les commentaires, ...)

Amicalement
Frédéric
 
Dernière édition:

Discussions similaires

Réponses
9
Affichages
153

Statistiques des forums

Discussions
312 176
Messages
2 085 962
Membres
103 067
dernier inscrit
el_privach