Bienvenue sur les forums conseil & création · S'enregistrer

Se connecter automatiquement

Forums » Tableurs et logiciels de gestion (Money, Excel, Open Office...) » fonction dans macro · Envoyer le lien

Par Véronique Sarrot, le 17 Sep 2008, 15:44 Revenir en haut de page Répondre en citant

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 Répondre en citant

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 Répondre en citant

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 Répondre en citant

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 Répondre en citant

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 ! Very Happy

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 Razz

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 Répondre en citant

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 Répondre en citant

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 ! Laughing

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 Smile )

Citation:
Bon, sérieusement, maintenant ça marche parfaitement, merci de ton aide et de tes conseils.


Pas de problème, reviens quand tu veux Wink

@+++
Par Cédric, le 21 Sep 2008, 15:39 Revenir en haut de page Répondre en citant

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 Wink . 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.

Arrow 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 Very Happy . Le mystère est dévoilé Wink . 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 Répondre en citant

Merci pour ce complément d'info, je me coucherai moins bête ce soir Smile
Par Véronique Sarrot, le 23 Sep 2008, 08:55 Revenir en haut de page Répondre en citant

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 Répondre en citant

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!

Laughing c'est pas gentil de se moquer de moi aussi Rolling Eyes 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 Répondre en citant

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 Répondre en citant

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) Rolling Eyes

@+++
Par Cédric, le 23 Sep 2008, 18:10 Revenir en haut de page Répondre en citant

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... Wink 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 Smile 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 Répondre en citant

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! Laughing

Forums » Tableurs et logiciels de gestion (Money, Excel, Open Office...) » fonction dans macro · Envoyer le lien