PDA

Voir la version complète : Macro Excel



George Sable
09/07/2007, 11h27
Salut les minables !

Je dois réaliser une macro excel pour le boulot, et j'aimerais savoir si certains d'entre vous s'y connaisse suffisament pour m'aider :unsure:

J'ai différentes colonnes, présentées de la manière suivante (en vrai, il y en a plus, mais elles ne nous intéressent pas dans cet exemple) :

Région | Conditions | DCL (TMC 13 pb) | DCL (TMC 7 pb) | Ecart (avec TMC 7 pb)

Et il faut que je fasse une moyenne des Ecart (avec TMC 7 pb) par Région.

Pour l'instant, j'ai déjà codé ça :

Sub MacroGeorge()

Sheets("TAUX FIXE").Copy Before:=Sheets(1)
'on copie l'onglet "TAUX FIXE" et on le place en première position
Selection.AutoFilter
'on enleve le filtre automatique, pour désactiver la protection
'qui empeche de supprimer les colonnes
Range("A:A,C:J,O:U").Select
'on sélectionne les colonnes qui ne nous intéressent pas
Selection.Delete
'on les supprime
Columns("A:E").Select
'on sélectionne les colonnes restantes
Selection.AutoFilter
'on réactive le filtre automatique sur les colonnes sélectionnées


'On va maintenant filtrer les lignes avec des cases vides (qui normalement ne
'devraient pas exister mais on le fait par prévoyance)

'En revanche, on ne filtre pas les lignes sans TMC 7 pb,
'car sa présence n'est pas obligatoire

Selection.AutoFilter Field:=1, Criteria1:="<>"
&#39;on filtre les lignes sans région
Selection.AutoFilter Field:=2, Criteria1:="<>"
&#39;on filtre les lignes sans conditions
Selection.AutoFilter Field:=3, Criteria1:="<>"
&#39;on filtre les lignes sans TMC 13 pb
Selection.AutoFilter Field:=5, Criteria1:="<>"
&#39;on filtre les lignes sans écart


Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
&#39;On trie les lignes par ordre alphabétique des régions

End Sub


Donc maintenant je me retrouve avec une colonne "Région" triée par ordre alphabétique.
Ce que je voudrais faire, c&#39;est une boucle qui permet de calculer l&#39;"Ecart (avec TMC 7 pb)", région par région.

Pour ça, j&#39;avais pensé à 2 choses :

- Soit afficher, grace aux filtres que je peux choisir dans les titres (et que j&#39;utilise déjà pour masquer les lignes ayant des cellules vides), chaque région une par une, puis selectionner toutes les lignes affichées et faire la moyenne des écarts.
Mais ça me paraît compliqué, parce que je ne vois pas comment gérer ça simplement avec une boucle, vu que la commande de filtre ressemblerait à ça :
Selection.AutoFilter Field:=2, Criteria1:="Alsace"
Le critère n&#39;est pas facilement changeable avec une variable qu&#39;on incrémente (on doit se taper d&#39;écrire "Alsace, Limousin, etc")

- Soit laisser tout afficher, mais comparer le texte des cellules de la colonne région avec le texte de la cellule du dessous. Si le texte est identique, on continue, sinon on arrette et on fait la moyenne de toutes les lignes précédentes.
Ca me paraît mieux, mais je ne sais pas comment comparer du texte entre 2 cellules.

Sinon, si vous avez un bon bouquin là dessus, je suis preneur :wacko:

kanji
09/07/2007, 11h29
put** j&#39;ai vu ça il ya longtemps et j&#39;ai tout oublié :rolleyes: j&#39;vais voir si j&#39;ai encore mes cours de bureautique

George Sable
09/07/2007, 11h46
Voyageuse Yeuse....

You must be the one the prophesy fortold.

Please, come in.

coutud
09/07/2007, 11h47
Eh gros, regarde un peu les pivot table.

Tu sélectionne tout, données, pivot table (ou tableau croisé dynamique).

Tu ajoute les champs régions à gauche, puis le champ écart dans la case données. Tu double clique en haut à gauche et tu remplace count par avg (nombre par moyenne) et t&#39;as ton résultat tout beau... Tu peux même aller plus loin dans l&#39;analyse, en rajoutant des critères à afficher en colonne (par exemple des dates) ou des sous régions etc etc...

Google donque Pivot Table, et loue le seigneur et moi même pour notre mansuétude.

George Sable
09/07/2007, 12h02
Okay, loué soit tu :lol:

Mais, j&#39;arrive pas à faire en sorte qu&#39;il m&#39;affiche des moyennes, je me retrouve obligatoirement avec la somme :sad:

Mars2
09/07/2007, 12h02
Ou sinon au lieu d&#39;utiliser Excel, utilise un vrai logiciel hein :ninja:

coutud
09/07/2007, 12h05
Tu double clique en haut à gauche et tu remplace count par avg (nombre par moyenne) et t&#39;as ton résultat tout beau...

Je vais pas répéter, ma salive est précieuse et les hordes attendent déjà mes reliques.
Tu uses mes doigts sur le clavier, chien infidèle. Va donc voir cette putain de case en haut à gauche de ton tableau.
Et implore ma clémence.

George Sable
09/07/2007, 12h06
Je vais pas répéter, ma salive est précieuse et les hordes attendent déjà mes reliques.
Tu uses mes doigts sur le clavier, chien infidèle. Va donc voir cette putain de case en haut à gauche de ton tableau.
Et implore ma clémence.
Biiien maaître...

Mars2
09/07/2007, 12h07
Say pas comme si javay le choix :sad:

On a toujours le choix :unsure:

George Sable
09/07/2007, 12h09
On a toujours le choix :unsure:
Entreprise, patron, ordre, toussa <_<

Mars2
09/07/2007, 12h11
Entreprise, patron, ordre, toussa <_<

Entreprise => Canardpc :unsure:
Patron ==> O.Boulon :ninja:
Ordre ==> :ninja: :ninja:

sans commentaire hein!!!
Et sinon tu as reussi, tu as reussi a cocher cette case?

George Sable
09/07/2007, 12h13
Et sinon tu as reussi, tu as reussi a cocher cette case?
NON §

J&#39;y arrive pas :sad:

Mars2
09/07/2007, 12h15
Salut les minables !

C&#39;est toi le minable :rolleyes:

George Sable
09/07/2007, 12h25
C&#39;est toi le minable :rolleyes:
BAN §

Bon, vous éloignez pas, je déjeune et puis je reviens vous emmerder :ninja:

Mars2
09/07/2007, 12h34
Autre solution fait un programme en C, ou en JAVA ou en PHP avec une base SQL... :ninja:

Fleuriste
09/07/2007, 12h46
Hello tout le monde,

La main sur le coeur, je m&#39;inscris juste pour venir en aide :rolleyes:

=>Pour comparer les valeurs de cellule c&#39;est :

Cellule1.value [test] cellule2.value


ce qui donne par exemple : If cellule1.value = cellule2.value then....

=>Pour éviter de trier par ordre alphabétique:

Ca reste une idée, mais je ferais sans doute comme ca si je ne pouvais trier.
Donc tu listes dans un autre onglet, ou sur une partie cachée de la feuille toutes les régions (nombre limité donc c&#39;est faisable) sur une seule colonne. Dans la colonne d&#39;a coté tu as le nombre de fois où est apparue cette region dans ta liste initiale (que tu parcoureras par la suite) et enfin dans la colonne encore au dessus tu as par exemple la somme des valeurs pour lesquelles tu veux faire la moyenne.
Tu parcours ta liste initiale (non triée ou triée) et pour chaque ligne tu vas chercher dans ton nouveau petit tableau (voir ci dessus) quelle ligne il faut remplir (en comparant les valeurs de cellules). Quand tu as la ligne, tu incrémentes le nb de fois que tu as trouvé cette région ainsi que la valeur de la troisieme colone.


Dans tous les cas, des conseils utiles :

=> definir une cellule comme variable :

dim ma_cellule as range

=> donner une cellule à un nom de cellule défini :

set ma_cellule = application.activeworkbook.activesheet.cell(n° ligne, n° colone)

=> pour etre propre :

dim classeur as workbook
dim feuille as worksheet
dim ma_cellule as range

set classeur = application.activeworkbook (classeur courant)
set feuille = classeur.activesheet ou set feuille = classeur.sheet("nom de la feuille")
set ma_cellule = feuille.range (ligne, colone)

=> pour les boucles c&#39;est tout simple. Exemple pour parcourir ton tableau:

dim cellule as range
dim i as integer

set cellule = feuille.cell(1,1)

for i = 1 to cellule.currenregion.rows.count

set cellule = feuille.cell(i,1)
msgbox("la région est :" & cellule.value)

next i

=> ca normalement ca va parcourir le tableau ligne par ligne (en supposant que tes regions soient dans la colonne A et commencent à la premiere ligne) et afficher le nom de la région à chaque fois.

Tu peux jouer avec les offset sur les cellules pour récupérer la valeur de la cellule à coté par exemple :

set cellule2 = cellule1.offset(1,0) (cellule de la colone à droite)
Set cellule3 = cellule1.offset(0,1) (cellule de la ligne en dessous)
ect.

voilà :rolleyes:

George Sable
09/07/2007, 14h01
Merci beaucoup pour tes conseils, je vais regarder tout ça ;)

Mars2
09/07/2007, 14h21
Merci beaucoup pour tes conseils, je vais regarder tout ça ;)

Parce que c&#39;est pas encore fini...??? :ninja:

francou008
09/07/2007, 14h45
Dans la colonne CMBDTC, mets "Invoc b0b0 +6500 damage" et ça devrait passer sans problèmes.

George Sable
10/07/2007, 17h36
Bon, j&#39;ai finalement réussi à obtenir un truc pas trop mal avec un tableau dynamique, mais je voudrais que les données soient listées par ordre croissant (histoire que le graph qui se base sur le tableau ressemble à quelque chose de correct).

Dans ma macro, j&#39;ai le code suivant :

Pour selectionner uniquement les données du tableau que je désire :

Sheets("Tableau Taux fixe").PivotTables("Tableau croisé dynamique").PivotSelect "", xlDataOnly

Pour les trier :

Selection.Sort Key1:="R5C2:R25C2", Order1:=xlAscending, Type:= _
xlSortValues, OrderCustom:=1, Orientation:=xlTopToBottom

La sélection se passe bien, mais le tri ne s&#39;effectue pas (et Excel ne me renvoi aucune erreur).

J&#39;avais pensé à quelque chose du genre (avec, en gras, la sélection)

Selection.Sort Key1:=Sheets("Tableau Taux fixe").PivotTables("Tableau croisé dynamique").PivotSelect "", xlDataOnly _
Order1:=xlAscending, Type:=xlSortValues, OrderCustom:=1, Orientation:=xlTopToBottom

Mais ça n&#39;a pas l&#39;air de marcher (faut dire que c&#39;est plus fait au petit bonheur la chance que d&#39;une vraie manière pro...)

Any idea ?