IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Afficher un calcul dans le StatusBar de façon dynamique. (nombre de cellules vides)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut Afficher un calcul dans le StatusBar de façon dynamique. (nombre de cellules vides)
    Bonjour,
    j'ai fait une petite macro qui me permet d'afficher le nombre de cellules vides sélectionnées dans le "statusbar".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
    Public cellVide As Long
    Public rng As Range
     
    Sub NbrBlanc()
    cellVide = Application.WorksheetFunction.CountBlank(rng)
    Application.DisplayStatusBar = True
    Application.statusBar = "Nbr de cellules vides : " & cellVide
    End Sub
    et sur la feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set rng = Target
    Call NbrBlanc
    End Sub

    La macro remplie sa fonction.

    Avec le clavier (maj+flêches), le résultat s'incrémente au fur et à mesure de la sélection de la plage, ce qui est parfait.

    A la souris, il faut attendre d'avoir relaché le bouton pour que le résultat apparaisse.

    Y-aurait t'il une façon de faire en sorte que, comme pour le clavier ou l'affichage par défaut de la somme, moyenne... le calcul se fasse progressivement à chaque sélection de cellule avec la souris et non pas à la fin ?

    Merci pour vos lumières.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour,

    voici une solution qui passe par un clic droit sur la première cellule. C'est le seul événement clic "simple" en natif dans excel.

    Le principe de ma méthode est d'utiliser la fonction "GetCursorPos" de la librairie "user32" afin de récupérer les coordonnées x,y du curseur de souris.
    Puis j'utilise la méthode "RangeFromPoint" pour déterminer la cellule survolé par le curseur.
    Enfin je créer une sélection de façon artificielle.

    Pourquoi ? et bien comme seul l’événement clic du bouton droit existe dans excel alors que les sélections ce font par le bouton gauche il me fallait recréer le principe de base a partir de ce bouton.
    Ceci afin de répondre à ton besoin qui est d'avoir une info dynamique lors de la selection.

    Comment cela s'utilise ?
    on commence par maintenir une touche contrôle du clavier, faire un clic droit dans une cellule puis de déplacer la souris. La sélection est validée par le relâchement de la touche Contrôle

    Code à mettre dans un module : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Option Explicit
     
    'permet de récupérer la position en x,y du pointeur de souris
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Type POINTAPI
        x As Long
        y As Long
    End Type
     
    'permet de détecter l'état des touches du clavier
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
     
    'Private Const VK_LCtrl As Long = &HA0 'ici la touche Ctrl de Gauche
    Const VK_CONTROL As Long = &H11
     
    Public PositionCursor As POINTAPI, KeyTest As Boolean
    Sub demo()
    Dim MaPlageDeSableFin As Range, BungalowDeDepart As Range
    Dim cellVide As Long
     
        If CtrlKeyState() = True Then 'une touche controle est enfoncée on peu démmarer
            KeyTest = CtrlKeyState()
            If Not Application.DisplayStatusBar Then Application.DisplayStatusBar = True
            Do Until (KeyTest = False)
                DoEvents 'redonne la main au system
                GetCursorPos PositionCursor 'on recupere la position du curseur en x,y
                If BungalowDeDepart Is Nothing Then 'on note la premiere cellule
                    Set BungalowDeDepart = ActiveWindow.RangeFromPoint(PositionCursor.x, PositionCursor.y)
                Else 'on creer la selection depuis la premiere cellule vers la cellule sous le cursseur de souris
                    Set MaPlageDeSableFin = Range(BungalowDeDepart.Address, ActiveWindow.RangeFromPoint(PositionCursor.x, PositionCursor.y).Address)
                    MaPlageDeSableFin.Select 'on selectionne la plage
                End If
                On Local Error Resume Next
                cellVide = Application.WorksheetFunction.CountBlank(MaPlageDeSableFin)
     
     
                Application.StatusBar = "Nbr de cellules vides : " & cellVide
     
                'Range("B1").Value = MaPlageDeSableFin.Cells.Count 'affiche le nombre de cellule de la selection
                'Range("B2").Value = MaPlageDeSableFin.Address(False, False) 'affiche l'adresse de la selection
     
                ' si la touche Ctrl est relachée on sort de la boucle en changeant l'etat de la variable KeyTest
                If CtrlKeyState() = False Then KeyTest = False
            Loop
        End If
    End Sub
    Function CtrlKeyState() As Boolean
        'permet de détecter si une touches Ctrl est enfoncée
        CtrlKeyState = False 'remise a false avant vérif.
        If GetKeyState(VK_CONTROL) < 0 Then CtrlKeyState = True
    End Function

    Code à mettre dans le code de la feuille afin d'utiliser l’événement avant clic droit : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
        If CtrlKeyState() = True Then
                Cancel = True
                demo
        End If
    End Sub

    je te conseil de tester dans un nouveau classeur avant de tenter de l’intégrer

    Même si j'ai fait ça à l'arrache pendant une réunion j'ai testé et cela fonctionne.

    A+

    PS: j'ai oublié de préciser que : le bouton contrôle du clavier est la pour dire : je change de méthode de sélection et d'annuler l'affichage du menu(cells) qui apparaît normalement lors d'un clic droit sur une cellule.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Bonsoir,

    réponse tardive, merci infiniment, c'est parfait !!
    C'est très astucieux et cela va au delà de mes connaissances.

    MERCI !!!

Discussions similaires

  1. [XL-2003] Formulaire - afficher un calcul dans celui-ci
    Par BtjpsspgrW dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/01/2015, 17h34
  2. Réponses: 1
    Dernier message: 05/04/2013, 10h56
  3. Image et texte dans une listbox de façon dynamique
    Par banban56 dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 16/07/2010, 12h02
  4. Afficher valeur calculer dans PropertyGrid
    Par champomy62 dans le forum VB.NET
    Réponses: 0
    Dernier message: 25/03/2010, 20h31
  5. Réponses: 10
    Dernier message: 13/06/2006, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo