Microsoft 365 souci de macro avec plusieurs else

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,

Je m'adresse à nos ténors préférés car je ne sais pas bien faire un code avec plusieurs "else".

Voici le code que j'ai fait :

VB:
Private Sub Label1_Click()
Sheets("Appels").Range("n1") = 2
    'met 2 à cellule N
 
    If Cells(ActiveCell.Row, 26) = "RdV" Then
    ActiveCell.Offset(0, 15) = "RdV" 'ActiveCell est la cellule col "K"
   'si ligne active col "Z" = "RdV" - laisse "RDV" ligne active col Z

    Else
    If ActiveCell.Offset(0, 15) <> "" And ActiveCell.Offset(0, 15) <> "RdV" _
    And ActiveCell.Offset(0, 15) <> "n/c" And ActiveCell.Offset(0, 15) > 0 Then
    ' si condition ok, ajoute 1 à col "Z" ligne active
    ActiveCell.Offset(0, 15).Value = ActiveCell.Offset(0, 15).Value + 1

    Else
    'si les 2 condtions NON Ok, met 1 à col "Z" ligne active
    ActiveCell.Offset(0, 15) = 1

    End If
    End If
Unload Rep_Entr ' ferme UserForm ouvert
'CalendarX.Show
End Sub
Je l'ai testé et il semble bien fonctionner.

Mais je pense que le code n'est pas bon.

J'ai fait des recherches mais je ne m'y retrouve pas.
Voudriez-vous me corriger ?

Un grand merci par avance,
lion el :)
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Marcel32, Bonjour soan, Bonjour patricktoulon, le fil, le Forum,

@Marcel32
"Donc pour résumer, il faut qu'on corrige un code qui n'est peut-être pas bon (d'après... ton intuition !), sans savoir ce qu'il doit faire, alors qu'il fonctionne déjà !..."
Je pensais que mes commentaires dans le code étaient suffisantes pour qu'un ténor comprenne lol.

Merci Marcel pour ton code génial .... qui fonctionne bien :)

@soan
Effectivement, impossible de joindre ma "z'usine à gaz", car fichier trop gros.

@ Patrick
defaut conceptuel!!!!!
VB:
ActiveCell.Offset(0, 15) = "RdV" 'ActiveCell est la cellule col "K"
Quel défaut puisque je suis en cellule active colonne K
K = n° de col 11 soit 11+15 = 26 et col 26 = colonne Z

Merci pour vos réponses sympas :)
lionel,
 

soan

XLDnaute Barbatruc
Inactif
@Lionel

oui, mais c'que patrick a voulu dire, c'est que si ta cellule active est par exemple D15, alors : 4 + 15 = 19 = colonne SS15 ; si c'est bien c'que tu voulais : parfait ! 😊 sinon : tu t'es planté sur ce coup-là ! 😭

c'est pourquoi ça peut souvent être aléatoire de faire une macro à partir de la cellule active ! faut vraiment faire très attention à toutes les conséquences possibles ! ;)

soan
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
@Lionel

oui, mais c'que patrick a voulu dire, c'est que si ta cellule active est par exemple D15, alors : 4 + 15 = 19 = colonne SS15 ; si c'est bien c'que tu voulais : parfait ! 😊 sinon : tu t'es planté sur ce coup-là ! 😭

c'est pourquoi ça peut souvent être aléatoire de faire une macro à partir de la cellule active ! faut vraiment faire très attention à toutes les conséquences possibles ! ;)

soan
Re Soan :
ActiveCell.Offset(0, 15) = ma cellule active ne peut être autre de col K NON ?
 

soan

XLDnaute Barbatruc
Inactif
ActiveCell.Offset(0, 15) = ma cellule active ne peut être autre que col K NON ?

non, car ça dit seulement : à partir de la cellule active (n'importe laquelle), prendre la cellule pour laquelle on fait un décalage de 0 ligne (donc même ligne), et 15 colonnes (donc 15 colonnes à droite).

de plus, la colonne K est la colonne n° 11 ; c'est ni 0, ni 15 ! 😜 même si tu avais utilisé la référence ActiveCell.Offset(0, 11) comme il s'agit d'un décalage, ça aurait signifié 11 colonnes à droite, ce qui n'est pas pareil que colonne n° 11 ! :)

soan
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
non, car ça dit seulement : à partir de la cellule active (n'importe laquelle), prendre la cellule pour laquelle on fait un décalage de 0 ligne (donc même ligne), et 15 colonnes (donc 15 colonnes à droite).

de plus, la colonne K est la colonne n° 11 ; c'est ni 0, ni 15 ! 😜 même si tu avais utilisé la référence ActiveCell.Offset(0, 11) comme il s'agit d'un décalage, ça aurait signifié 11 colonnes à droite, ce qui n'est pas pareil que colonne n° 11 ! :)

soan
Ha Bon : ça ne veut pas dire que je décale de 15 colonnes à droite de la cellule 0 ?
Et quand je dis colonne 0, je suis en col K quand j'exécute le code (Oouupppsss ! c'est vrai, je ne l'avais pas précisé lol).
:)
 

soan

XLDnaute Barbatruc
Inactif
@Lionel

Ha Bon : ça ne veut pas dire que je décale de 15 colonnes à droite de la cellule 0 ?

ben non ! la cellule 0 n'existe tout simplement pas ! la cellule 1 est la 1ère cellule d'une feuille de calcul, donc c'est forcément A1.


Et quand je dis colonne 0, je suis en col K quand j'exécute le code (Oouupppsss ! c'est vrai, je ne l'avais pas précisé lol).
:)

si tu es en colonne K, et par exemple en ligne 20, alors : à partir de K20, le décalage de 0 ligne en dessous et 15 colonnes à droite mène en ... Z20 ! regarde l'Aide VBA sur Offset() pour plus d'infos ! 😉

d'ailleurs, pour la colonne Z, tu l'avais bien vu dans ton post #16 car tu avais écrit :
« K = n° de col 11 soit 11+15 = 26 et col 26 = colonne Z »


rappel : si les paramètres de l'offset sont négatifs, par exemple ActiveCell.Offset(-3, -5) ça signifie : à partir de la cellule active, prendre en compte la cellule qui est 3 lignes au dessus et 5 colonnes à gauche ; donc si ta cellule active est par exemple K20, ça mène en F17 ; et là, ça te fait un bon entraînement pour des styles de déplacements de chevaux aux échecs ! 😁 😄 🤣

accessoirement, tu peux aussi voir que comme les paramètres peuvent être négatifs, ça ne peut pas être une cellule dont les coordonnées seraient ligne n° -3 et colonne n° -5 vu qu'un de ligne minimum est 1 et qu'un n° de colonne minimum est aussi 1 ; même avec 0 ça ne marcherait pas, car il n'y a pas de ligne 0, et il n'y a pas non plus de colonne 0 ; un code VBA qui référencerait de telles cellules planterait inévitablement ! 😭


pour éviter le problème décrit dans mon post #18, et à supposer que ton décalage de 15 colonnes à droite est valable au minimum pour la colonne K, tu peux faire :​

VB:
If ActiveCell.Column >= 11 Then 'colonne minimum : K
  'ici, ton traitement qui utilise ActiveCell.Offset(0, 15) :
  ActiveCell.Offset(0, 15) = "RdV"
End If

OU

VB:
If ActiveCell.Column > 10 Then 'colonne minimum : K
  'ici, ton traitement qui utilise ActiveCell.Offset(0, 15) :
  ActiveCell.Offset(0, 15) = "RdV"
End If

note que si ton traitement est valable uniquement pour la colonne K, alors c'est inutile de faire un .Offset() : autant désigner la cellule directement, donc ici Z20 si on était en K20 : [Z20] = "RdV"

soan
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
@Lionel



ben non ! la cellule 0 n'existe tout simplement pas ! la cellule 1 est la 1ère cellule d'une feuille de calcul, donc c'est forcément A1.




si tu es en colonne K, et par exemple en ligne 20, alors : à partir de K20, le décalage de 0 ligne en dessous et 15 colonnes à droite mène en ... Z20 ! regarde l'Aide VBA sur Offset() pour plus d'infos ! 😉

d'ailleurs, pour la colonne Z, tu l'avais bien vu dans ton post #16 car tu avais écrit :
« K = n° de col 11 soit 11+15 = 26 et col 26 = colonne Z »


rappel : si les paramètres de l'offset sont négatifs, par exemple ActiveCell.Offset(-3, -5) ça signifie : à partir de la cellule active, prendre en compte la cellule qui est 3 lignes au dessus et 5 colonnes à gauche ; donc si ta cellule active est par exemple K20, ça mène en F17 ; et là, ça te fait un bon entraînement pour des styles de déplacements de chevaux aux échecs ! 😁 😄 🤣

accessoirement, tu peux aussi voir que comme les paramètres peuvent être négatifs, ça ne peut pas être une cellule dont les coordonnées seraient ligne n° -3 et colonne n° -5 vu qu'un de ligne minimum est 1 et qu'un n° de colonne minimum est aussi 1 ; même avec 0 ça ne marcherait pas, car il n'y a pas de ligne 0, et il n'y a pas non plus de colonne 0 ; un code VBA qui référencerait de telles cellules planterait inévitablement ! 😭


pour éviter le problème décrit dans mon post #18, et à supposer que ton décalage de 15 colonnes à droite est valable au minimum pour la colonne K, tu peux faire :​

VB:
If ActiveCell.Column >= 11 Then 'colonne minimum : K
  'ici, ton traitement qui utilise ActiveCell.Offset(0, 15) :
  ActiveCell.Offset(0, 15) = "RdV"
End If

OU

VB:
If ActiveCell.Column > 10 Then 'colonne minimum : K
  'ici, ton traitement qui utilise ActiveCell.Offset(0, 15) :
  ActiveCell.Offset(0, 15) = "RdV"
End If

note que si ton traitement est valable uniquement pour la colonne K, alors c'est inutile de faire un .Offset() : autant désigner la cellule directement, donc ici Z20 si on était en K20 : [Z20] = "RdV"

soan
Merci à toi pour tes explications :)
 

Phil69970

XLDnaute Barbatruc
Bonjour à tous

Lionel

En complément de tous les messages précédents entre autre de Soan sur ActiveCell

Tu peux récupérer facilement le N° de la ligne active avec :
Ligne = ActiveCell.Row ' Maintenant j'ai le N° de la ligne active
Si tu es sur la ligne 20 alors Ligne = 20

Après si tu connais la colonne que tu veux travailler exemple la colonne K (ou une autre)
Tu fais :
MaValeur = Range("K" & Ligne).Value ' Tu as la valeur de la cellule K & de la ligne active donc K20 dans MaValeur
Range("K" & Ligne) = 15 ' ici c'est le contraire tu mets la valeur 15 à la cellule K & de la ligne active donc K20

Et le tout donne ceci :
VB:
Ligne = ActiveCell.Row                  ' Maintenant j'ai le N° de la ligne active
'Si tu es sur la ligne 20 alors Ligne = 20

MaValeur = Range("K" & Ligne).Value     ' Tu as la valeur de la cellule K & de la ligne active donc K20 dans MaValeur
Range("K" & Ligne) = 15                 ' ici c'est le contraire tu mets la valeur 15 à la cellule K & de la ligne active donc K20

@Phil69970
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous

Lionel

En complément de tous les message précédents entre autre de Soan sur ActiveCell

Tu peux récupérer facilement le N° de la ligne active avec :

Si tu es sur la ligne 20 alors Ligne = 20

Après si tu connais la colonne que tu veux travailler exemple la colonne K (ou une autre)
Tu fais :


Et le tout donne ceci :
VB:
Ligne = ActiveCell.Row                  ' Maintenant j'ai le N° de la ligne active
'Si tu es sur la ligne 20 alors Ligne = 20

MaValeur = Range("K" & Ligne).Value     ' Tu as la valeur de la cellule K & de la ligne active donc K20
Range("K" & Ligne) = 15                 ' ici c'est le contraire tu mets la valeur 15 à la cellule K & de la ligne active donc K20

@Phil69970
Bonjour et merci à toi :)
 

soan

XLDnaute Barbatruc
Inactif
@Lionel

en condensé : Cells(ActiveCell.Row, "K") = "RDV" ou Cells(ActiveCell.Row, 11) = "RDV"

ça fait que ça modifie la cellule dont la ligne est celle de la cellule active, et dont la colonne est K ; cette fois, il n'y a plus d'offset, donc il n'y a pas de décalage par rapport à une référence de cellule.

note aussi que la cellule active étant forcément une cellule valide, ActiveCell.Row retourne forcément un numéro de ligne valide.

mais si tu dois stocker ce numéro de ligne active dans une variable ligne, cette variable doit forcément avoir le type Long : Dim ligne As Long ou Dim Ligne& ; car avec le type Integer
(caractère de type %), y'aura un plantage si numéro ligne active > 32767 !

soan
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Re Soan :
ActiveCell.Offset(0, 15) = ma cellule active ne peut être autre de col K NON ?
Non, pas du tout : ActiveCell.Offset(0,15) ne veut absolument pas dire que la cellule active est dans la colonne K.
Ça veut dire qu'on fait référence à la cellule qui est, par rapport à la cellule active, sur la même ligne, 15 colonnes à droite.
Je pense que tu n'as pas parfaitement compris le principe de "ActiveCell".

ActiveCell, c'est la cellule (on va supposer qu'il n'y en a qu'une) qui est actuellement sélectionnée dans ta feuille active.

Quand tu es sur ta feuille et que tu cliques sur une cellule, c'est alors elle la cellule active.
Quand dans une macro tu passes par une instruction Cells(ligne,colonne).Select, c'est alors cette cellule qui est active.

Donc ce que veulent dire nos camarades ci-dessus c'est que, la cellule active dépend de ce qu'a fait l'utilisateur, ou de ce qu'a fait le code, avant de passer par l'instruction utilisant ActiveCell.

On suppose ici que la cellule active est dans la colonne K parce que c'est écrit dans les commentaires du code de #1, mais vu qu'on n'a pas l'ensemble du projet rien ne nous le garanti.

D'autre part, si tu es sûr que la cellule active est dans la colonne K, pourquoi utiliser un offset ???
Plutôt que d'utiliser un décalage, de 15 colonnes vers la droite, de la colonne de la cellule active, il vaut mieux taper directement dans la colonne Z ; ainsi, dans tous les cas, tu n'affecteras qu'une cellule de la colonne Z, même si ta cellule active n'était pas vraiment dans la colonne K... 😉
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Non, pas du tout : ActiveCell.Offset(0,15) ne veut absolument pas dire que la cellule active est dans la colonne K.
Ça veut dire qu'on fait référence à la cellule qui est, par rapport à la cellule active, sur la même ligne, 15 colonnes à droite.
Je pense que tu n'as pas parfaitement compris le principe de "ActiveCell".

ActiveCell, c'est la cellule (on va supposer qu'il n'y en a qu'une) qui est actuellement sélectionnée dans ta feuille active.

Quand tu es sur ta feuille et que tu cliques sur une cellule, c'est alors elle la cellule active.
Quand dans une macro tu passes par une instruction Cells(ligne,colonne).Select, c'est alors cette cellule qui est active.

Donc ce que veulent dire nos camarades ci-dessus c'est que, la cellule active dépend de ce qu'a fait l'utilisateur, ou de ce qu'a fait le code, avant de passer par l'instruction utilisant ActiveCell.

On suppose ici que la cellule active est dans la colonne K parce que c'est écrit dans les commentaires du code de #1, mais vu qu'on n'a pas l'ensemble du projet rien ne nous le garanti.

D'autre part, si tu es sûr que la cellule active est dans la colonne K, pourquoi utiliser un offset ???
Plutôt que d'utiliser un décalage, de 15 colonnes vers la droite, de la colonne de la cellule active, il vaut mieux taper directement dans la colonne Z ; ainsi, dans tous les cas, tu n'affecteras qu'une cellule de la colonne Z, même si ta cellule active n'était pas vraiment dans la colonne K... 😉
AH ! Marcel, merci d'être tjrs là :)
J'ai bien tout compris ce que m'ont dit nos "petits" lol je dirais plutôt "GRANDS" camarades et ce que tu me dis :)

"On suppose ici que la cellule active est dans la colonne K parce que c'est écrit dans les commentaires du code de #1, mais vu qu'on n'a pas l'ensemble du projet rien ne nous le garanti."

Mais si, mais si lol : Je ne peux pas mettre tout mon grand code sur le fil mais l'exécution du code m'amène sur la colonne K de la ligne active et c'est moi qui le garanti lol 🤣🤣.
Merci encore une fois Marcelius :)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
AH ! Marcel, merci d'être tjrs là :)
J'ai bien tout compris ce que m'ont dit nos "petits" lol je dirais plutôt "GRANDS" camarades et ce que tu me dis :)

"On suppose ici que la cellule active est dans la colonne K parce que c'est écrit dans les commentaires du code de #1, mais vu qu'on n'a pas l'ensemble du projet rien ne nous le garanti."

Mais si, mais si lol : Je ne peux pas mettre tout mon grand code sur le fil mais l'exécution du code m'amène sur la colonne K de la ligne active et c'est moi qui le garanti lol 🤣🤣.
Merci encore une fois Marcelius :)
J'ajouterai : lol c'est pas beau de douter de moi 🤣 ...... quoi que, j'fais tellement d'erreurs lol :)
 

TooFatBoy

XLDnaute Barbatruc
Soit !

Mais n'oublie pas le reste : tu garantis être dans la colonne 11 et tu effectues un décalage fixe de 15 colonnes vers la droite, donc autant adresser directement la colonne 26 ; comme ça si tu n'étais pas vraiment en colonne 11, tu ne détruiras pas une cellule d'une autre colonne que la Z. 😉
 

Discussions similaires

Réponses
2
Affichages
123
Réponses
21
Affichages
961

Statistiques des forums

Discussions
312 084
Messages
2 085 192
Membres
102 809
dernier inscrit
Sandrine83