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 :

Est ce possible de simplifier ce code ?


Sujet :

Macros et VBA Excel

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    oui ce code la c'est ce que j'avais fait auparavant mais c'est tres lourd et beaucoup de plantage

    donc je viens de remplacer les Options buttons par des Combobox avec choix comme ca je sélectionne la valeur soit liege ou jemeppe et cette valeur va s'inscrire dans une colonne

    donc maintenant j'aimerai introduire ces combobox ( toute nommées en CB1,CB2, etc ) dans mon code de vérification pour la visibilité de mon bouton comme pour les textbox donc le bouton apparaitra uniquement si textbox et combobox sont remplies
    et puis ajouter ses combobox au code de minik pour enregistrer les données des textbox et combobox dans ma feuille excel et en colonne

    voila

    merci pour ton aide

  2. #22
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai lu qu'on t'avait conseillé de numéroter tes contrôles selon le N° de colonne. L'as-tu fait ?
    Si txtbox3 correspond à la colonne 5, change son N°
    Et comme tu n'auras pas de Combo ds la colonne 5, puisqu'il y aura déjà un txtbox, tu peux le numéroter selon la colonne correspondante.
    Ceci fait, tu modifies le code en conséquence. Pour ça tu as deux méthodes, la première identifiant le type de contrôle, la seconde s'en dispensant mais impliquant la vérification du nom du contrôle. Et puisque les noms des uns ou des autres comportent tous les deux trois caractères, c'est facile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Ctr as control, p as integer, NomCtr as string
    For each ctr in Userform1.controls
         NomCtr = Left(ctr.name,3)
         if NomCtr = "OPM" or NomCtr ="VDS" then
              p = p + 1
              Select Case NomCtr
                   Case "OPM"
                         Sheets("soir").Cells(65536, p).End(xlUp).Offset(1, 0).Value = CStr(Controls("OPM" & p))
                   Case "VDS"
                         Sheets("soir").Cells(65536, p).End(xlUp).Offset(1, 0).Value = CStr(Controls("VDS" & p))
              End select
         endif
    Next
    Tu peux tester ça pour moi ?

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    merci pour ton code
    mais j'ai une erreur

    erreur d'execution 451

    la procedure proprerty let n'est pas définie et la procédure property get n a pas renvoye d'objet
    moi j'ai mis mon code dans mon bouton validé

    bien toi

  4. #24
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Sur quelle ligne, l'erreur ?
    Où est ton bouton ? Dans l'userform ? As-tu adapté le nom de l'userform ?
    Montre ton code ds ton bouton
    A+

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    ca plante à ce niveau

    oui j'ai bien renomer mon formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton1_Click() 'bouton valider
    ' validation des données vers la feuille données
    Dim ctr As Control, p As Integer, NomCtr As String
    For Each ctr In UserForm2.Controls
    NomCtr = Left(ctr.Name, 3)
    If NomCtr = "VDM" Or NomCtr = "Cbm" Then
       p = p + 1
       Select Case NomCtr
      Case "VDM"
       Sheets("données").Cells(65536, p).End(xlUp).Offset(1, 0).Value = ctr(Controls("VDM" & p))   Case "Cbm"
      Sheets("données").Cells(65536, p).End(xlUp).Offset(1, 0).Value = ctr(Controls("Cbm" & p))
    End Select
    End If
    Next

  6. #26
    Membre expérimenté
    Inscrit en
    Août 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2009
    Messages : 284
    Par défaut
    Je pense que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ctr(controls("VDM" & p))
    qui ne va pas
    Essai de mettre Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cstr(controls("VDM" & p))

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    re

    voici mon fichier pour mieu comprendre

    http://www.megaupload.com/?d=OJ7ZI2AD

    explication

    dans mon multipage nomé menu fluide
    j'ai besoin de toute les valeurs des textbox et des combobox des sous multipage

    dans le menu cave
    j'ai besoin de toute les valeurs des textbox et combobox des sous multipages

    dans le menu index eau demine
    j'ai besoin des valeurs des textbox que j'ai mis en jaune

    dans le menu centrifugeuse
    j'ai besoin des valeurs des combobox


    j'aimerai que c'est valeur soient enregistrée dans la feuille données
    j'ai nommé mes textbox de 1 à ..... sous la forme de VDM1 , etc et mes combobox sous la forme Cbm, etc

    en plus pour ne pas oublier d'encoder une donnée je souhaite faire apparaitre mon bouton uniquement quand toutes les textbox et combobox des page citée au dessus sons remplie

    voila

    merci d'avance pour votre aide

  8. #28
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par revemane
    j'ai nommé mes textbox de 1 à ..... sous la forme de VDM1 , etc et mes combobox sous la forme Cbm, etc
    Citation Envoyé par ousk'
    J'ai lu qu'on t'avait conseillé de numéroter tes contrôles selon le N° de colonne. L'as-tu fait ?
    Pour numéroter tes contrôles, donne à chacun le N° de la colonne correspondante, textbox, combos ou listes.
    Tu peux avoir ainsi
    Txtbox1 puis Combo2 puis List3 puis txtbox4, txtbox5, combo6
    Et ensuite utilise mon code corrigé par diude (en utilisant Cstr(ctr) ) et en adaptant la ligne
    If NomCtr = "VDM" Or NomCtr = "Cbm" Then
    ATTENTION : Je crois bien qu'ici la case du nom du contrôle est importante.
    A+

    PS - Pour plus de sûreté, écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Ucase(NomCtr) = "VDM" Or Ucase(NomCtr) = "CBM" Then
    pour autant que les noms des textbox commencent tous par VBM et ceux des combobox par CBM...

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    merci pour l'info

    et maintenant que j'ai renommé mes txtbox et combobox pa n° de colone

    comment doisje faire pour rendre mon vouton vible avec le code suivant
    que l'on ma donner sur le forum

    code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'vérification du contenu des texbox pour rendre visible le bouton valider
    For Each ctrl In Controls
    If TypeOf ctrl Is MSForms.TextBox Then
    x = x + 1
    ReDim Preserve M(1 To x): Set M(x).txt = ctrl
    End If: Next
    End Sub

    module de classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub txt_Change()
    For Each ctrl In UserForm2.Controls
    If TypeOf ctrl Is MSForms.TextBox Then
    If ctrl <> "" Then x = x + 1
     End If: Next ctrl
    If x = 56 Then 'ne pas oublier de modifier
    UserForm2.CommandButton1.Visible = True
    Else
    UserForm2.CommandButton1.Visible = False
    End If: x = 0
    End Sub

    le 56 correspond au nombre total de combobox et textbox
    mais cela ne fonctionne pas
    merci

  10. #30
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    56 correspond-il au nombre de colonnes utilisées ?
    Ce code sert-il à gèrer l'apparition d'un bouton "Validation" ?
    Les textbox dont il est question dans ton code sont-ils les mêmes que ceux qui servent à renseigner ta feuille de calculs ?

    Si oui aux trois quesitons,alors il est facile de tester le nom du dernier contrôle (qui est ctrl.name) et de simplifier ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm2.CommandButton1.Visible = Ctrl.name = "Textbox" & 56
    Et tu remplaces "Textbox" par le nom du contrôle que tu concatènes avec le N°.
    Si non, précise ton problème (à quoi sert le bouton ? Quelles conditions sont-elles nécessaire pour le faire apparaître ? Etc.)
    A+
    Bonne nuit

  11. #31
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    salut oui le 56 correspond au nombres de colonne de ma feuille de calcul

    ce que je cherche à faire c'est de faire apparaitre mon bouton validation uniquement si toutes mes textbox ou combobox sont remplient pour eviter des enregistrement incomplet

    donc pour ton code , fonctionne til uniquement la vérification sur le dernier control ou bien tient il compte de tout les controls

    question : pour ton code ci dessus ou dois je le mettre ?
    dois je supprimer mon module de classe et mon code de mon precedent post ?

    merci

  12. #32
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello,
    Là tu nous donnes les infos par petit bout. Pour te répondre il nous en faut plus.
    Comment déclares-tu "txt" ? Une collection ? Dans quel module ? Quel code.

    La vérification suivante utilise la macro txt_Change du module de classe (donc indispensables tous les deux) mais ne vérifie que les textbox, pas des combobox.
    'vérification du contenu des texbox pour rendre visible le bouton valider
    En outre, tu dois modifier le module de classe puisque sur les 56 contrôles tous ne sont pas des Textbox (tu me corriges si je me trompe)
    Si le dernier contrôle à remplir est un textbox, tu peux le modifier ainsi mais si les contrôles sont remplis de manière aléatoire (un combo étant le dernier contrôle sélectionné) le bouton n'apparaîtra pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub txt_Change()
         For Each ctrl In UserForm2.Controls
              If TypeOf ctrl Is MSForms.TextBox or _
                 TypeOf ctrl Is MSForms.ComboBox Then
                 If ctrl <> "" Then x = x + 1
              End If
         Next ctrl
         UserForm2.CommandButton1.Visible = x = 56
         x = 0
    End Sub
    On peut néanmoins le faire fonctionner mais pour cela tu devras imposer le dernier contrôle à renseigner qui devra être un Textbox (auquel cas il faudra modifier la procédure txt_Change ds le module de classe)

    Mais pour le moment, teste le code "comme ça", on verra pour imposer le dernier contrôle à renseigner. En attendant je regarde une autre solution.
    A+

    En utilisant une autre méthode on peut vérifier à la fois les combo et les textbox mais tu as plusieurs modifs à faire
    Dans le module standard, en tête de module, ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Collect As Collection
    Dans userform_initialize d'userform2, ajoute
    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
    Private Sub UserForm_Initialize() 'De l'userform2
    'Au code existant tu ajoutes... *************
    Dim Cbx As Control
    Dim Cl1 As Classe1
        Set Collect = New Collection
        For Each Cbx In Me.Controls
            If TypeOf Cbx Is MSForms.ComboBox Then
                Set Cl1 = New Classe1
                Set Cl1.Liste = Cbx
                Collect.Add Cl1
            End If
        Next Cbx
    '... tout ça ******************************
     
    End Sub
    Dans le module de classe, en plus de la macro de mon message précédent, ajoute en tête de module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public WithEvents Liste As MSForms.ListBox
    et ensuite la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Liste_Click()
    Dim ctrl As Control, x As Integer
         For Each ctrl In UserForm1.Controls
              If TypeOf ctrl Is MSForms.TextBox Or _
                 TypeOf ctrl Is MSForms.ComboBox Then
                 If ctrl <> "" Then x = x + 1
              End If
         Next ctrl
         UserForm1.CommandButton1.Visible = x = 56
         x = 0
    End Sub
    Ainsi, que l'utilisateur termine sa saisie par un combo ou un textbox, la vérification se fera.
    Par contre, si tu créais un tableau des cellules renseignées, tu pourrais renvoyer l'utilisateur pile poil sur le prochain contrôle non renseigné. Mais c'est une autre histoire qui, si elle t'intéresse, te sera racontée plus tard
    En attendant, parle-nous de tes avancées
    Bonne journée

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    re et merci pour ton code


    mais la je soince un peu et je ne sait pas ou metre les codes que tu me propose pour la macro

    dans le userform initialyse pas de prob
    pour le module de classe aussi pas de prob
    et pour la macro la je vois pas

    merci

  14. #34
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je me suis donné la peine de décrire ce que tu dois faire, je ne vais donc pas me répéter. Lis ce que j'ai mis, je n'ai rien à ajouter.
    Concerne les messages 46 et suivant.
    Dans le module de classe tu dois laisser le code du message 46 et... lis ce que j'ai mis dans le message 47 pour la suite.
    Bon courage

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 173
    Par défaut
    voila j'ai revu tous les post que tu m'a écrit mais dsl je n'y arrive pas

    j'ai creer un formulaire de test avec 4 textbox et 3 combobox

    et un bouton validé

    donc pour les txtbox nommée comme suit VDM1, VDM2, VDM3,VDM6
    et les combobox comme suit : CB4, CB5, CB7

    les nombre correspondent au collonne de la feuille de calcul

    et voici mon code de mon userform

    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
    Option Explicit
    Dim M() As New UserForm1, x As Byte, ctrl As Control
    Public collect As Collection
     
     
    Private Sub CommandButton1_Click()
    'code
    End Sub
     
    Private Sub UserForm1_Initialize()
    'vérification du contenu des texbox pour rendre visible le bouton valider
    For Each ctrl In Controls
    If TypeOf ctrl Is MSForms.TextBox Then
    x = x + 1
    ReDim Preserve M(1 To x): Set M(x).txt = ctrl
    End If
    Next
    Dim cbx As Control
    Dim cl1 As Classe1
    Set collect = New Collection
        For Each cbx In Me.Controls
            If TypeOf cbx Is MSForms.ComboBox Then
                Set cl1 = New Classe1
                Set cl1.Liste = cbx
                collect.Add cl1
            End If
        Next cbx
     
     
     
    End Sub
     
    Private Sub UserForm_Click()
     
    End Sub
    et voici mon module de classe

    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
    Option Explicit
    Public WithEvents txt As MSForms.TextBox, x As Byte, ctrl As Control
    Public WithEvents Liste As MSForms.ListBox
    Private Sub txt_Change()
    For Each ctrl In UserForm1.Controls
    If TypeOf ctrl Is MSForms.TextBox Or TypeOf ctrl Is MSForms.ComboBox Then
    If ctrl <> "" Then x = x + 1
     End If
     Next ctrl
    UserForm1.CommandButton1.Visible = x = 7
    x = 0
     
     
    End Sub
    Private Sub Liste_Click()
    Dim ctrl As Control, x As Integer
         For Each ctrl In UserForm1.Controls
              If TypeOf ctrl Is MSForms.TextBox Or _
                 TypeOf ctrl Is MSForms.ComboBox Then
                 If ctrl <> "" Then x = x + 1
              End If
         Next ctrl
         UserForm1.CommandButton1.Visible = x = 7
         x = 0
    End Sub
    voila quand je lance mon formulaire le bouton reste visble

    je pense que je m'en mele les pinceaux quelque part $merci pour votre aide

  16. #36
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    en mettant un point d'arrêt dans ta fonction d'initialisation, vérifie que tu passes bien par toutes les boucles que tu souhaites mettre en place.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. Réponses: 15
    Dernier message: 09/05/2008, 17h11
  2. [PHP-JS] Est il possible d'intégrer du code PHP dans du code javacript ?
    Par bilou95 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/07/2007, 09h05
  3. Réponses: 2
    Dernier message: 12/07/2007, 15h07
  4. Réponses: 6
    Dernier message: 07/08/2006, 11h26
  5. Réponses: 4
    Dernier message: 03/02/2006, 10h08

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