| Par Véronique Sarrot, le 17 Sep 2008, 15:44 |
Revenir en haut de page |
|
Bonjour!
Comme beaucoup de monde sur ce forum, je suis une débutante complet en macro, et donc je rame un peu.
j'ai réussi à créer une macro qui effectue ce que je veux, mais sur une ligne déterminée et dans une case déterminée.
Je voudrais pouvoir le faire pour toutes les lignes, sans avoir à créer une macro par ligne.
pour être plus claire, voici la macro que j'ai créee :
Sub mod1()
Dim x As Integer, i As Integer
x = 0
For i = 3 To 17
Select Case Cells(2, i).Value
Case 1
x = x + 10
Case 2
x = x + 8
Case 3
x = x + 5
Case 4
x = x + 2
Case 5
x = x + 1
End Select
Next
Range("U2").Value = x
End Sub
là, j'effectue les calculs sur la ligne 2 uniquement
je voudrais donc pouvoir lui préciser sur quelle ligne faire le calcul, c'est-à-dire la ligne de la cellule active, et dans laquelle je veux le résultat.
j'espère avoir été claire
merci[/quote] |
|
 |
| Par Véronique Sarrot, le 17 Sep 2008, 16:29 |
Revenir en haut de page |
|
j'ai trouvé toute seule, comme une grande !! En fait, la réponse était dans la question : j'ai utilisé ActiveCell.row
mais il me reste une question : ma boucle for va de 3 à 18 . Si dans une autre feuille elle doit aller de 3 à 20 par exemple, commen faire sans avoir à créer une autre macro ? Autrement dit, comment intégrer la possibilité que les itérations changent ?
merci de m'aider |
|
 |
| Par Horny, le 18 Sep 2008, 05:07 |
Revenir en haut de page |
|
Salut,
| Citation: | | mais il me reste une question : ma boucle for va de 3 à 18 . Si dans une autre feuille elle doit aller de 3 à 20 par exemple, commen faire sans avoir à créer une autre macro ? |
Je suppose que le 18 ou le 20 en question représente la dernière colonne qui contient des données ?
Dans ce cas, utilise une variable pour stocker le numéro de la dernière colonne:
| Code: |
Dim last_Column As Byte
last_Column = Range("IV1").End(xlToLeft).Column |
Le Range("IV1").End(xlToLeft) signifie que tu te place en IV1 (la dernière colonne, première ligne) et que tu fais ctrl+gauche (tu atterrit donc à la première colonne avec des données, soit la dernière colonne de ton tableau), et tu récupère son numéro de colonne (.Column)
Ensuite, tu met simplement
| Code: |
For i = 3 to last_Column
[...]
Next
|
Si on résume, ton code devrait ressembler à ça
| Code: |
Sub mod1()
Dim x As Integer, i As Integer
Dim last_Column As Byte 'ligne ajoutée
x = 0
last_Column = Range("IV1").End(xlToLeft).Column 'ligne ajoutée
For i = 3 To last_Column 'ligne modifiée
Select Case Cells(2, i).Value
Case 1
x = x + 10
Case 2
x = x + 8
Case 3
x = x + 5
Case 4
x = x + 2
Case 5
x = x + 1
End Select
Next
Range("U2").Value = x
End Sub
|
Et voilà !
@+++ |
|
 |
| Par Véronique Sarrot, le 18 Sep 2008, 14:47 |
Revenir en haut de page |
|
merci !!
en fait, j'avais trouvé une autre solution :
| Code: | Sub CalculClassementF1_ter()
Dim x As Integer, i As Integer
x = 0
For i = 3 To ActiveCell.Column - 4
Select Case Cells(ActiveCell.Row, i).Value
Case 1
x = x + 10
Case 2
x = x + 8
Case 3
x = x + 5
Case 4
x = x + 2
Case 5
x = x + 1
End Select
Next
ActiveCell.Value = x
End Sub |
mais ça m'oblige à chaque fois à sélectionner la cellule dans laquelle je voudrais le résultat.
ta réponse m'a donné une idée pour améliorer le code, et l'automatiser au maximum, seulement je ne connais pas la fonction équivalente à "Range("IV1").End(xlToLeft).Column" pour trouver la dernière ligne écrite.
voilà ce que ça donnerais :
| Code: | Sub CalculClassementF1_4()
Dim x As Integer, i As Integer, j As Integer
Dim last_Column As Byte, last_Ligne As Byte
x = 0
last_Column = Range("IV1").End(xlToLeft).Column
last_Ligne = Range("A500").End(xlToUp).Row ' ???????
last_Column = last_Column - 4
For i = 2 To last_Ligne
For j = 3 To last_Column
Select Case Cells(i, j).Value
Case 1
x = x + 10
Case 2
x = x + 8
Case 3
x = x + 5
Case 4
x = x + 2
Case 5
x = x + 1
End Select
Next j
Cells(i, last_Column).Value = x
Next i
End Sub
|
qu'en penses-tu ? |
|
 |
| Par Horny, le 18 Sep 2008, 19:10 |
Revenir en haut de page |
|
| Citation: | | ta réponse m'a donné une idée pour améliorer le code, et l'automatiser au maximum, seulement je ne connais pas la fonction équivalente à "Range("IV1").End(xlToLeft).Column" pour trouver la dernière ligne écrite. |
Automatiser au maximum, c'est le but même des macros !
Déjà, pour la méthode End, c'est l'équivalent du raccourci clavier ctrl+flèche de direction: tu part donc d'une cellule (dans ton cas A500, si tu veut être sûre qu'il n'y ait pas de bug si jamais tu dépassait les 500 lignes, part de la dernière ligne: A65536). J'ai un gros doute sur le xlToUp, de mémoire les choix possibles sont xlUp, xlDown, xlToLeft et xlToRight.
| Citation: | | qu'en penses-tu ? |
Ce que j'en pense ? Très simple: as-tu essayé de lancer ta macro ? Au moins tu sera fixée
Pour résumer, et si tu fait la modification au niveau de ta ligne qui détecte la dernière ligne de ton tableau, pour chaque ligne de ton tableau, tu va appliquer le "barême" en commençant à la colonne B (2), et en finissant à la 4ème colonne en partant de la dernière colonne de ton tableau (last_Column = last_Column - 4).
Un petit conseil au passage: si j représente tes colonnes, déclare-la comme Byte (il n'y a pas plus de 255 colonnes au total), mais déclare tout ce qui concerne un numéro de ligne en Long (Integer s'arrête à 32 000 et quelques, or il y a 65536 lignes dans une feuille).
@+++ |
|
 |
| Par Véronique Sarrot, le 19 Sep 2008, 08:21 |
Revenir en haut de page |
|
Dis donc, tu serais pas en train de te moquer (gentiment) de moi ? Car j'étais bien au courant du but des macros, et oui, j'avais essayé de la lancer avant de poster le message !!!
Et même que j'ai trouvé toute seule les deux bugs qu'il restait encore !! Non mais !!! (j'avais oublié notamment de réinitialiser x par exemple !!!)
Bon, sérieusement, maintenant ça marche parfaitement, merci de ton aide et de tes conseils. |
|
 |
| Par Horny, le 19 Sep 2008, 16:03 |
Revenir en haut de page |
|
| Citation: | | Dis donc, tu serais pas en train de te moquer (gentiment) de moi ? Car j'étais bien au courant du but des macros, et oui, j'avais essayé de la lancer avant de poster le message !!! |
Enfer, je suis découvert !
Mais c'est vrai que le meilleur moyen de savoir si une macro fait ce que l'on souhaite (gardons à l'esprit le fameux : "Un ordinateur fais ce que tu lui dit de faire, pas ce que tu voudrais qu'il fasse" !), c'est de la lancer... et de voir ! Il n'y a pas une seule et unique manière d'arriver au résultat voulu (voir mon indémodable signature )
| Citation: | | Bon, sérieusement, maintenant ça marche parfaitement, merci de ton aide et de tes conseils. |
Pas de problème, reviens quand tu veux
@+++ |
|
 |
| Par Cédric, le 21 Sep 2008, 15:39 |
Revenir en haut de page |
|
Salut,
Je m'incruste juste dans la conversation pour apporter un complément d'information
| Citation: | | déclare-la comme Byte (il n'y a pas plus de 255 colonnes au total), mais déclare tout ce qui concerne un numéro de ligne en Long (Integer s'arrête à 32 000 et quelques, or il y a 65536 lignes dans une feuille). |
Un integer suffit pour les lignes d'excel... d'ailleurs puisqu'on en parle, savez-vous pourquoi Excel dispose de 65536 lignes ? Pas parce que Microsoft n'aime pas les comptes ronds . Un integer peut stocker des nombres plus grands que de 32000, seulement sa plage de valeur est différente selon qu'on souhaite ou non utiliser des nombre négatifs.
si on a besoin des nombres négatifs, on peut stocker de -32768 à 32767. Sinon, la partie "négative" peut servir à stocker des nombres positifs soit (32768 + 32767)... 65536 . Le mystère est dévoilé . Les lignes du tableur excel sont en fait limitées à cause des limitations du type Integer Unsigned
Cédric |
|
 |
| Par Horny, le 21 Sep 2008, 17:15 |
Revenir en haut de page |
|
Merci pour ce complément d'info, je me coucherai moins bête ce soir  |
|
 |
| Par Véronique Sarrot, le 23 Sep 2008, 08:55 |
Revenir en haut de page |
|
et dire qu'il y en a qui se moquait de moi...
en tous cas, qu'est-ce qu'on en apprend, des choses sur ce forum ! nous venons d'être initiés à l'un des grands mystères du monde de l'informatique!
à la prochaine ! |
|
 |
| Par Cédric, le 23 Sep 2008, 15:02 |
Revenir en haut de page |
|
| Horny a écrit: | | Merci pour ce complément d'info, je me coucherai moins bête ce soir |
| Véronique a écrit: | | nous venons d'être initiés à l'un des grands mystères du monde de l'informatique! |
c'est pas gentil de se moquer de moi aussi Allez je ne suis pas à ça près:
| Horny a écrit: | | déclare-la comme Byte (il n'y a pas plus de 255 colonnes au total) |
il y a exactement 256 colonnes... le maximum que peut supporter le type Byte ( 2^8 )
 |
|
 |
| Par Véronique Sarrot, le 23 Sep 2008, 15:39 |
Revenir en haut de page |
|
mais, je ne me moquais pas, je trouve ça très intéressant de savoir d'où ça vient le nombre de lignes et colonnes, que c'est pas juste du hasard!! je m'étais déjà posé la question, et ça restait un mystère ...
bon, c'est sûr, la façon dont je l'ai dit portait à confusion!
J'espère que je me suis rattrapée ... |
|
 |
| Par Horny, le 23 Sep 2008, 17:39 |
Revenir en haut de page |
|
Salut,
| Citation: | | il y a exactement 256 colonnes... le maximum que peut supporter le type Byte ( 2^8 ) |
Oui c'est vrai, j'ai parfois la sale tendance à partir de 0 (soit 0 à 255 = 256 au total)
@+++ |
|
 |
| Par Cédric, le 23 Sep 2008, 18:10 |
Revenir en haut de page |
|
| Véronique a écrit: | | J'espère que je me suis rattrapée ... |
Y'a pas de raisons, je ne t'en tiendrai pas rigueur... C'était juste un rappel du
| Véronique a écrit: | | Dis donc, tu serais pas en train de te moquer (gentiment) de moi ? |
| Horny a écrit: | | Oui c'est vrai, j'ai parfois la sale tendance à partir de 0 |
C'est logique en même temps Mais tu travailles dans l'informatique au fait? Ou tu fais de la programmation pour le plaisir ? |
|
 |
| Par Horny, le 23 Sep 2008, 18:13 |
Revenir en haut de page |
|
| Citation: | | Mais tu travailles dans l'informatique au fait? Ou tu fais de la programmation pour le plaisir ? |
Réponse B. Moi, j'ai juste un DUT de chimie!  |
|
 |