Excel VBA : programmer une valeur en cliquant une cellule

G

Guest

Invité
Bonjour,
Je suis un débutant dans l'utilisation de VBA dans Excel (2010).
J'aimerai pouvoir faire apparaitre la valeur "1", lorsqu'on sélectionne une cellule vide en cliquant dessus.
Est ce réalisable ?
Par avance, je vous remercie pour votre aide.
 

zeb

Modérateur
Salut,

Mais oui, c'est possible. Mais c'est un peu trop simple. Alors je vais te laisser réfléchir un peu.
Si tu veux, tu peux exprimer ici tes réflexions, on en discutera.

Pour jouer un peu (*), voici un petit exercice en VBA pour Excel :
Code:
Sub Worksheet_SelectionChange(ByVal Target As Range)
    Range("A1").Value = Range("A1").Value + 1
End Sub

Allez, maintenant clique.


_________________
(*) Y aurait-il un rapport, même lointain entre ce que je te propose et une solution à ton problème ?
 

posilippo

Nouveau membre


 

posilippo

Nouveau membre
Monsieur,
D'abord un grand merci pour vous pencher sur un problème si humble;
J'avais bien une grosse part de termes dans ma formule, mais i me manque les bases; Pourriez vous me conseiller un manuel de débutant ? Même si je ne suis pas un informaticien, j'apprécie depuis longtemps Excel; Mais pour ce qui est du VBA...J'aimerais vraiment m'y lancer.
Pour votre solution, deux remarques :
Quand je sélectionne A1, il apparait effectivement 1 dans a case A1 comme demandé. Mais si je clique n'importe quelle autre case, les "1" s'additionnent en A1. Il me faudra donc améliorer cela. Chaque case sélectionnée doit faire apparaitre un 1 unique et dans cette case uniquement.
De plus je voudrais faire cette manipulation dans des cases précises; Mettons dans la "surface " C4 à T27. Cela aussi doit être reprogrammé.
Il me faut donc :
- limiter l'apparition du 1 dans la case sélectionnée
- limiter dans la feuille Excel, la zone de fonctionnement de cette macro
Merci par avance de l'élève à son enseignant !
 

drul

Obscur pro du hardware
Staff
Salut, si tu regardes bien, dans les paramètre de la fonction, tu verras : (ByVal Target As Range)

Target.Row et Target.Column (Plus target.rowcount et target.columncount) te permettront de faire ton filtre.

Pour le point n°1, le même paramètre te donne directement la cible (remplace Range("A1").Value = Range("A1").Value + 1 par Target.Value = 1 dans le code de zeb).
Attention, il faut gérer le cas d'une sélelection multiple !

P.S. je t'invite à lire l'aide sur la fonction intersect(), elle pourrait t'être utile...
 

zeb

Modérateur
Eh, eh !
Merci pour lui, mon cher Drul ! :hello:

Je te donnais comme piste le fait que c'est avec Worksheet_SelectionChange() et Range.Value qu'il faut jouer.
Drul précise Target.Value.

As-tu une idée ?

Voici un autre élément :
Code:
Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Text = "" Then
        Range("A1").Value = Target.Address(0, 0) & " est vide"
    Else
        Range("A1").Value = "Dans " & Target.Address(0, 0) & ", il y a : """ & Target.Text & """"
    End If
End Sub

Tu as presque tout.
Proposes-nous quelque chose, qu'en en discute. ;)
 

posilippo

Nouveau membre
Messieurs,
Tout d'abord merci pour votre aide et votre patience.
Je suis arrivé à quelque chose qui fonctionne et qui correspond même à ce que je recherche :))

Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Value = 1
End Sub

Toutefois je ne trouve pas la clef de vos énigmes concernant ma question de limiter l'action de cette fonction dans une zone déterminée de la feuille.
Je ne suis qu'un tout, tout débutant.
Mais je me suis commandé une livre d'initiation ....

Puis je avoir encore un peu d'aide ?

Merci beaucoup.
 

drul

Obscur pro du hardware
Staff
Essaie de faire qqch avec ce que l'on t'a donné !
Un if, un traget .row un "and", un target.column et deux constantes sont suffisant ...
 

posilippo

Nouveau membre
Messieurs,
J'arrive à ceci :
Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 2 And Target.Row < 6 And Target.Column > 3 And Target.Column < 8 Then Target.Value = 1
End Sub
Cela semble fonctionner.
Est ce encore améliorable de façon simple ?
Un grand merci.
 

drul

Obscur pro du hardware
Staff
Oui, car cette fonction pourait poser probleme en cas de selection multiple ...
Intersect pourait aussi permettre de simplifier le if, mais c'est vraiment facultatif ;)
 

posilippo

Nouveau membre
Encore merci pour votre aide.
Je vais poursuivre dans cet apprentissage.
Salutations amicales.
 

posilippo

Nouveau membre
Re-Bonjour à Messieurs-mes-aides !
Voilà grâce à vous ce à quoi je suis arrivé, et qui de plus marche presque très bien :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Row > 15 And Target.Column > 3 And Target.Column < 17 Then If UCase(Target) = "1" Then Target = "" Else Target = "1"
Cancel = True
End Sub

Mais il doit y avoir une erreur que je ne trouve pas :Dans la colonne A d'Excel, j'ai des dates format jj/mm/aa; Tant que j'avais la formule suivante, aucun problème. Depuis que je suis passé au double clic, j'ai du mal à corriger les dates par clic sur la case.

Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 15 And Target.Column > 3 And Target.Column < 17 Then Target.Value = 1
End Sub

De plus je n'arrive pas à formuler correctement le code complémentaire mettant en majuscule systématiquement la colonne B (format texte). J'ai inséré avant "End Sub", la phrase suivante qui ne marche pas; Mais où se trouve donc mon erreur ?
If Target.Row > 15 And Target.Column = 2 Then
Target = UCase(Target)
End If

Merci encore pour votre aide.
Le livre que j'étudie à ce sujet m'aide mais je ne suis pas ore à ce genre de questions;

Salutations amicales.
 

drul

Obscur pro du hardware
Staff
Re-Salut,

Alors une première erreur est de faire cancel=true sur CHAQUE double click ! Tu devrais l'inclure dans ton if:
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Row > 15 And Target.Column > 3 And Target.Column < 17 Then
    If UCase(Target.Value) = "1" Then Target = "" Else Target.Value = "1"
    Cancel = True
End If
End Sub

Pour le 2eme point, stp utilise .value, ou encore .text Taget est un objet, pas une valeur, etmême si le vba permet parfois abusivement de l'utiliser en tant que valeur, cela conduit souvent a de gros bug. Précise toujours quelle propriété de l'objet t'intéresse.
Code:
If Target.Row > 15 And Target.Column = 2 Then
Target.Text= UCase(Target.Text)
End If
 

posilippo

Nouveau membre
Je vous remercie pour votre aide bien précieuse.
J'ai amélioré en effet la première partie, mais n'arrive toujours pas à faire fonctionner la mise d'office en majuscule de la colonne B

Salutations respectueuses
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 131
Messages
6 717 954
Membres
1 586 382
Dernier membre
alejandrooo
Partager cette page
Haut