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 :

Déclaration de variable (type)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut Déclaration de variable (type)
    Je ne suis pas vraiment un débutant (plutôt un autodidacte qui commence à se débrouiller sous VBA) mais ma question est digne d'un débutant. Mais bon il n'y a pas de question idiote, hein ?


    Voilà j'ai un bouton de type toggle sur ma feuille et je voudrais récupérer sa valeur dans une fonction pour le faire changer de couleur. Mais j'ignore comment je dois le déclarer dans ma fonction :
    en admettant que ce bouton se nomme "BOB" (ceci est un exemple minimaliste mais je crée des boutons par macro ainsi que leur code associé d'où lutilité de la fonction)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub BOB_Click() 'changement de couleur du bouton s'il est ou pas enfoncé
        Dim Nom_btn as ????
        Nom_btn = "BOB"
        FN_Btnclic Nom_btn
    End Sub
     
    Public Function FN_Btnclic(ByVal Nam As ?????)
        If Nam.Value = True Then
            Nam.BackColor = RGB(255, 0, 0)
        Else
            Nam.BackColor = RGB(0, 255, 0)
        End If
    End Function
    Du coup je ne sais pas comment je dois déclarer mes variable Nom_btn et Nam (string, OLEObject ????)
    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Mais bon il n'y a pas de question idiote, hein ?
    Il n'y en a en effet pas. Il y a par contre des titres qui ne sont pas intelligents (et ne correspondent pas non plus aux règles de ce forum).
    Le tien, par exemple, ne résume pas la difficulté rencontrée.
    J'attendrai donc personnellement que tu le modifies

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    Citation Envoyé par unparia Voir le message
    Il y a par contre des titres qui ne sont pas intelligents (et ne correspondent pas non plus aux règles de ce forum).
    Le tien, par exemple, ne résume pas la difficulté rencontrée.
    Ouch c'est dur !



    désolé pour ce manque de clarté et ce non respect des règles.

    (En tout cas je tiens à préciser, s'il était utile, que je ne méprise nullement les débutants et que je respecte entre autres TOUS les utilisateurs et contributeurs de ce forum. Je suis moi même très loin d'un niveau technique correct).

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    mais je crée des boutons par macro
    Montre ce code de création dynamique.
    Mais avant d'aller plus loin : il te faut prendre conscience d'un fait qui n'est pas, justement, à la portée d'un débutant.
    Si tu veux qu'un contrôle créé dynamiquement réponde à des procédures évènementielles, il te faut créer une classe pour en gérer les évènements. Ce que tu nous dis de ton niveau actuel et le bout de code que tu montres dans ton premier message me laissent assez dubitatif quant à un "solution" autre qu'un copier/coller pur et simple de ce qui te serait communiqué.
    Es-tu vraiment certain de ne pas avoir à commencer par des choses moins complexes ?

    EDIT : un contrôle activex est passé en paramètre comme le montre cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CommandButton3_Click()
       toto CommandButton1
    End Sub
     
    Private Sub toto(CT As msforms.CommandButton)
      CT.BackColor = vbRed
    End Sub
    Mais s'il est créé dynamiquement (ce que tu dis avoir fait) la première même des deux procédures ne saurait exister autrement que par ce que je t'ai dit plus haut.
    Ton premier problème n'est pas celui du passage d'un contrôle en paramètre d'une procédure mais d'affecter des procédures évènementielles au contrôle créé dynamiquement

    J'en profite pour t'inviter à apprendre ce qu'est une FONCTION (qui est une procédure retournant une valeur). Ta "fonction" devrait être une simple routine (une "Sub") et est abusive.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    Merci de ce retour.

    Alors voici ma création de bouton dynamique : (c'est une fonction appelée dans une sub )

    Code : 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
     
    Sub bibi()
        Dim lig As Integer, k As Integer
        Dim Bool As Boolean
        Dim Obj As OLEObject
        Dim WB As Workbook
        Set WB = ThisWorkbook
        k = 7
        For lig = 1 To Feuil1.Range("A1").End(xlDown).Row Step 1
            If lig > k And Feuil1.Range("C" & lig) <> "" Then
                For Each Obj In Feuil1.OLEObjects
                    If Obj.Name = "Check_" & lig Then Bool = True
                Next Obj
                If Bool = False Then FN_Crcbx lig, WB
            End If
        Next lig
        Set WB = Nothing
    End Sub
     
    Public Function FN_Crcbx(ByVal z As Integer, ByVal WKB As Workbook)
        Dim X As Integer
        WKB.Activate
        Set Obj = Feuil1.OLEObjects.Add("Forms.ToggleButton.1")
        Obj.Height = Feuil1.Range("A" & z).Height
        Obj.Width = Obj.Height
        Obj.Left = Feuil1.Range("B" & z).Left - Obj.Width
        Obj.Top = Feuil1.Range("A" & z).Top
        Obj.Object.BackColor = RGB(0, 255, 0)
        Obj.Object.Caption = ""
        Obj.Name = "Check_" & z
        Set Obj = Nothing
        With WKB.VBProject.VBComponents("Feuil1").CodeModule
            X = .CountOfLines
            .InsertLines X + 1, "Sub Check_" & z & "_Click()"
            .InsertLines X + 2, vbTab & "Dim WB As Workbook"
            .InsertLines X + 3, vbTab & "Set WB = ThisWorkbook"
            .InsertLines X + 4, vbTab & "Nom = ""Check_" & z & """"
            .InsertLines X + 5, vbTab & "FN_Btnclic Nom"
            .InsertLines X + 6, vbTab & "Feuil1.Select"
            .InsertLines X + 7, vbTab & "Set WB = Nothing"
            .InsertLines X + 8, "End Sub"
            .InsertLines X + 9, ""
        End With
    End Function
    Alors j'ai une alternative (je la trouve moins classe mais certainement plus adaptée vu la réponse apportée):

    Code : 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
     
    Public Function FN_Crcbx(ByVal z As Integer, ByVal WKB As Workbook)
        Dim X As Integer
        WKB.Activate
        Set Obj = Feuil1.OLEObjects.Add("Forms.ToggleButton.1")
        Obj.Height = Feuil1.Range("A" & z).Height
        Obj.Width = Obj.Height
        Obj.Left = Feuil1.Range("B" & z).Left - Obj.Width
        Obj.Top = Feuil1.Range("A" & z).Top
        Obj.Object.BackColor = RGB(0, 255, 0)
        Obj.Object.Caption = ""
        Obj.Name = "Check_" & z
        Set Obj = Nothing
        With WKB.VBProject.VBComponents("Feuil1").CodeModule
            X = .CountOfLines
            .InsertLines X + 1, "Sub Check_" & z & "_Click()"
            .InsertLines X + 2, vbTab & "Dim WB As Workbook"
            .InsertLines X + 3, vbTab & "Set WB = ThisWorkbook"
            .InsertLines X + 4, vbTab & "If Check_" & z & ".Value = True Then"
            .InsertLines X + 5, vbTab & vbTab & "Check_" & z & ".BackColor = RGB(255, 0, 0)"
            .InsertLines X + 6, vbTab & "Else"
            .InsertLines X + 7, vbTab & vbTab & "Check_" & z & ".BackColor = RGB(0, 255, 0)"
            .InsertLines X + 8, vbTab & "End If"
            .InsertLines X + 9, vbTab & "Feuil1.Select"
            .InsertLines X + 10, vbTab & "Set WB = Nothing"
            .InsertLines X + 11, "End Sub"
            .InsertLines X + 12, ""
        End With
    End Function

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Alors j'ai une alternative (je la trouve moins classe mais certainement plus adaptée vu la réponse apportée):
    La question que tu devrais te poser devrait plutôt être relative au nombre (qui risque d'être important) des boutons que tu vas ainsi créer sur ta feuille.
    Bonjour l'occupation en mémoire, les lourdeurs, la gestion des suppressions éventuelles de lignes, etc, etc ...
    Il est probable (presque certain) qu'une durée plus longue de réflexion devrait te conduire à une conception plus adéquate. Mais c'est là un autre aspect.
    Amitiés

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    une FONCTION (qui est une procédure retournant une valeur)
    Je te remercie pour cette définition, du coup je me rends compte dans mon code que j'ai un peu abusé (j'ai mis plusieurs fonctions alors que des sub auraient probablement suffit ... )

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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