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 :

Création d'une Fonction [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Par défaut Création d'une Fonction
    Bonjour à tous,
    J'ai un soucis dans la création d'une fonction.
    Je suis entrain d'écrire un projet où je dois remplir pas mal de combobox. Du coup, j'aimerais me lancer dans la rédaction d'une fonction pour alléger le code.
    J'ai donc écris la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function RemplissageCB(Feuille, ColonneNbLigne, ColonneSource, LigneDebut, NumeroCB)
    Set ctrl = UserForm1.Controls("ComboBox" & NumeroCB)
    DernLigne = Sheets(Feuille).Range(ColonneNbLigne & Rows.Count).End(xlUp).Row
    For i = LigneDebut To DernLigne
        ctrl = Sheets(Feuille).Range(ColonneSource & i)
            If ctrl.ListIndex = -1 And ctrl <> "" Then
                ctrl.AddItem Sheets(Feuille).Range(ColonneSource & i)
            End If
    Next i
    ctrl.ListIndex = -1
    End Function
    J'appelle la fonction de la manière suivante dans mon userform à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
     
    Call RemplissageCB("NumHCC", "A", "A", 2, 3)
     
    End Sub
    A l'exécution j'ai une erreur 424 Objet requis.
    Je ne comprends pas d'où ça peut venir
    Lorsque j'exécute le code "en dur" c'est à dire en remplaçant les variables par leur valeur, ça fonctionne.

    D'avance merci pour votre aide.

    Bonne journée

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Quelques remarques à la volée:
    - Vous n'avez pas besoin d'une fonction puisque vous ne retournez rien .... Une Sub est suffisante
    - Vous ne dimensionnez aucune de vos variables, aie aie: utilisez l'option explicit! Par défaut, tout est en variant
    - VBA ne fait pas les mêmes conversions implicites qu'Excel
    - sur quelle ligne votre code plante?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ctrl = UserForm1.Controls("ComboBox" & NumeroCB
    Vous faites de la concaténation entre une chaine et un nombre, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ctrl = UserForm1.Controls("ComboBox" & CStr(NumeroCB)
    me semble plus propre (non testé)

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' General options
        Option Explicit
    ' Global variables
        Public Subname      As String
     
    Sub show_wbk_share_mode()
    '=============================================================================
    ' Show this workbook shared mode
     
        Dim Sharedwbk As Boolean
        Dim MsgPrompt As String, usr_status As Variant, cnt_usr As Integer
     
        On Error GoTo Err_show_wbk_share_mode

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,
    je ne sais pas si j'ai bien compris!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function RemplissageCB(Feuille, ColonneNbLigne, ColonneSource, LigneDebut, NumeroCB)
    Set ctrl = Me.Controls("ComboBox" & NumeroCB)
    ctrl.Clear
    DernLigne = Sheets(Feuille).Cells(Rows.Count, ColonneNbLigne).End(xlUp).Row
    ctrl.List = Sheets(Feuille).Range(Sheets(Feuille).Cells(LigneDebut, ColonneSource), Sheets(Feuille).Cells(DernLigne, ColonneSource)).Value
    ctrl.ListIndex = -1
    End Function
     
    Private Sub UserForm_Initialize()
    RemplissageCB "Feuil1", 1, "A", 3, 1
    RemplissageCB "Feuil1", 1, 2, 3, 1
    End Sub

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Comme dit vinc_bilb :
    - Vous ne dimensionnez aucune de vos variables, aie aie: utilisez l'option explicit! Par défaut, tout est en variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Set ctrl = UserForm1.Controls("ComboBox" & NumeroCB) 'ctrl est une variable de type objet
     
    For i = LigneDebut To DernLigne
     
    ctrl = Sheets(Feuille).Range(ColonneSource & i) ' ctrl est devient une simple variable de type String ou Double. Ce n'est plus un objet
     
    If ctrl.ListIndex = -1  Then ' Erreur car ctrl n'a plus de propriete ListIndex
    Il faut écrire ctrl.Text pour éviter toute confusion en attribuant la valeur à la propriété TEXT et non à la variable elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ctrl.Text = Sheets(Feuille).Range(ColonneSource & i)

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Super!

    Mon commentaire sur le dimensionnement s'applique également aux paramètres de la sub ou de la fonction, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub RemplissageCB(Feuille As String, ColonneNbLigne As Integer, ColonneSource As Integer, LigneDebut As Single, NumeroCB As Integer)
    En plus, vous pouvez jouer avec les valeurs par défauts et les paramètres optionnels, comme ci-dessous, plus tester leur présence avec IsMissing

    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
    Sub RefCheckScript()
    ' Check the scripting runtime reference is active for this project
        Call ReferencesCheck(RefName:="Microsoft scripting", DisplLogMsg:=True)
    End Sub
     
    Sub ReferencesCheck(Optional Wbk As Workbook, Optional RefName As String, Optional DisplLogMsg As Boolean = False)
    ' List the references attached to a workbook (this Workbook by default)
     
     
    Dim RefInd As Integer, FoundRef As Boolean
    Dim MsgHead As String, Msgtype As Variant
     
    'Init
        If IsMissing(Wbk) Or (Wbk Is Nothing) Then Set Wbk = ThisWorkbook
     
    ' Parsding the project VBA references
        With Wbk.VBProject.References

  6. #6
    Invité
    Invité(e)
    Par défaut
    Par défaut les variable sont variant, il peut être intéressant ne ne pas les typer (ou préciser As Variant) comme dans mon exemple précédant, le typage lui ferait planter le code!

    mais pour l'obligation de déclarer ses variables oui!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RemplissageCB "Feuil1", 1, "A", 3, 1
    RemplissageCB "Feuil1", 1, 2, 3, 1

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 121
    Par défaut
    En procédant comme vous me l'avez indiqué (déclaration des variables), ça fonctionne parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub RemplissageCB(Feuille, ColonneNbLigne, ColonneSource, LigneDebut, NumeroCB)
    Dim ctrl As Object
    Dim Dernligne, i As Integer
    Set ctrl = UserForm1.Controls("ComboBox" & NumeroCB)
    Dernligne = Sheets(Feuille).Range(ColonneNbLigne & Rows.Count).End(xlUp).Row
    For i = LigneDebut To Dernligne
        ctrl = Sheets(Feuille).Range(ColonneSource & i)
            If ctrl.ListIndex = -1 And ctrl <> "" Then
                ctrl.AddItem Sheets(Feuille).Range(ColonneSource & i)
            End If
    Next i
    ctrl.ListIndex = -1
    End Sub
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2011, 11h54
  2. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  3. Réponses: 16
    Dernier message: 24/10/2006, 21h37
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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