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 :

Faire fonctionner des commandButton en rendant la main avec le N° de ligne sélectionnée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité, ex programmeur
    Inscrit en
    Février 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : retraité, ex programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2018
    Messages : 25
    Par défaut Faire fonctionner des commandButton en rendant la main avec le N° de ligne sélectionnée
    Bonjour,

    Cela va vous paraître simple, mais pour moi qui ai connu le tout début de la micro en 1973, ça bloque. Il y a/aura plusieurs autres feuilles interactives dont une pour les différentes interventions, il faut déjà que la première fonctionne.

    Pour expliquer la macro ci-après (les Dim du début sont des reprises de vieilles macros) le problème:
    - nbre de lignes qui va augmenter, je n'en suis pas encore à cette belle gestion du style "fenêtre automatique" vue sur le site, et bien loin de là
    - nbre de colonnes qui pourrait augmenter
    - une userform où doivent s'afficher 8 à 10 items de noms
    - un commandButton1 Ok qui devrait me rendre la main pour savoir quelle ligne et quel nom a été sélectionné (topindes, text, ou value ?)
    - un commandButton2 Annuler pour sortir si rien

    Dans le commandButton1_click() il y a un tas de lignes ajoutées pour tester comme en fin de source, ne serait-ce que wtest pour savoir si cela passe par là en débogage, rien de rien.
    Ne riez pas, ce n'est pas drôle, ayez pitié d'un vieux, merci.

    J'ajoute que je n'ai jamais vu un site comme celui là, chapeau à vous contibuteurs, car en plus cela vous demande beaucoup de temps, et je serai bien incapabable de conseiller quelqu'un, merci encore,
    bernard

    p.s.
    je viens de me rendre compte que le code une fois copié n'est pas indenté, tout aligné à gauche à l'affichage, pas facile à lire.
    J'ai réindenté avec word, même résultat.

    Nom : patients_xls.jpg
Affichages : 1081
Taille : 136,7 Ko

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     Public nocellule, noligne, nocolonn, nb_ligne, nb_colonn, windex, i As Long
      Public numeros_lignes(), rang_trouve As Long
      Public cellulfin_tableau, lignfin_tableau, wmessage, wcr, wlf, wcrlf As String
      Public search_nom, alphabet, wsP, wbP, nom_trouve, wtest, wtrace As String
      Public myobjet, mysheet, myform As Object
      Public CommandButton1 As Control
      Public CommandButton2 As Control
    __________________________________________
    Private Sub CommandButton1_Click()
        wtest = "1"
        If Form_choix_patient.CommandButton1.Caption = "OK" Then 'Check caption, then change it.
           With Form_choix_patient.CommandButton1
              .Caption = "Clicked"
              .Accelerator = "C"
           End With
         Else
           With Form_choix_patient.CommandButton1
            .Caption = "OK"
            .Accelerator = "O"
             'Set Accelerator key to COMMAND + O
           End With
         End If
     
         With Form_choix_patient.ListBox1
           nom_trouve = .Text
           rang_trouve = .TopIndex
           '-nom_trouve = .Value
         End With
         Unload Form_choix_patient  '-ou .Show False
      End Sub
      Private Sub CommandButton2_Click()
        MsgBox ("bouton2")  '-, vbDefaultButton2) = vbCancel
        wtest = "2"
        Unload Form_choix_patient
    End Sub
    _______________________________________
    Private Sub Form_choix_patient_initialize()
        wtest = "0"
        '---si X colonnes
        '- ListBox1.ColumnCount = plage.Columns.Count
        Form_choix_patient.ListBox1.List() = Range("A2:A" + Trim(Str(nb_ligne - 1))).Value
        For i = 1 To nb_ligne  '--numérotage lignes pour l'instant ne sert à rien
          If Cells(i, 1) <> vbNullString Then
            ReDim Preserve numeros_lignes(1 To i): numeros_lignes(i) = i
          End If
        Next i
        i = i - 1
    End Sub
    _________________________________________
    Sub Choix_du_patient()
     
        wtest = "d"
        wcr = Chr(13): wlf = Chr(10): wcrlf = wcr + wlf
        alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        wbP = "Patients.xlsm"
        wsP = "Patients"
        wtrace = "Gestion_traçabilité.xlsm"
        Workbooks(wbP).Activate
        Worksheets(wsP).Activate
     
        '-nb_colonn = Range("A1").SpecialCells(xlCellTypeLastCell).Column '--avec vides
        nb_colonn = ActiveSheet.Cells(1, Application.Columns.Count).End(xlToLeft).Column '-avec vides
        dern_colonn = Mid(alphabet, nb_colonn, 1)
        nb_ligne = Range("A1").SpecialCells(xlCellTypeLastCell).Row  '--avec vides
     
        '---tri croissant
        ActiveWorkbook.Worksheets(wsP).Sort.SortFields.Clear
        ActiveWorkbook.Worksheets(wsP).Sort.SortFields.Add Key:=Range("A2"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets(wsP).Sort
              .SetRange Range("A2:" + dern_colonn + Trim(Str(nb_ligne)))
              .Header = xlNo
              .MatchCase = False
              .Orientation = xlTopToBottom
              .SortMethod = xlPinYin
              .Apply
           End With
     
         '---coloriage doublons
          Columns("A:A").Select
          Selection.FormatConditions.Delete
          Selection.FormatConditions.AddUniqueValues
          Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
          Selection.FormatConditions(1).DupeUnique = xlDuplicate
          With Selection.FormatConditions(1).Interior
              .PatternColorIndex = xlAutomatic
              .Color = 10092441
              .TintAndShade = 0
          End With
          Selection.FormatConditions(1).StopIfTrue = False
     
        '--recalcul une fois vides supprimés
        nb_ligne = Application.CountA(Sheets("Patients").Range("A:A"))
     
        '-Range("a2").Select
        '-CommandButton1_Click
        '-CommandButton2_Click
        Form_choix_patient_initialize
        Form_choix_patient.Show
     
        With Form_choix_patient.ListBox1
          rang_trouve = .ListIndex
        End With   'Form_choix_patient.Hide
    suite:
        If Form_choix_patient.ListBox1.ListIndex = -1 Then
          Form_choix_patient.Show False
          '-Exit Sub
        End If
     
    sortie:
        Workbooks(wtrace).Activate

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, Il est souhaitable de baliser son code On verra ensuite pour le reste.

  3. #3
    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
    Trop de choses à corriger.
    Je vais me contenter d'appeler ton attention sur l'erreur la plus manifeste :
    Lorsque tu quittes un userform, comme ici :
    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
    Public nocellule, noligne, nocolonn, nb_ligne, nb_colonn, windex, i As Long
      Public numeros_lignes(), rang_trouve As Long
      Public cellulfin_tableau, lignfin_tableau, wmessage, wcr, wlf, wcrlf As String
      Public search_nom, alphabet, wsP, wbP, nom_trouve, wtest, wtrace As String
      Public myobjet, mysheet, myform As Object
      Public CommandButton1 As Control
      Public CommandButton2 As Control
    __________________________________________
    Private Sub CommandButton1_Click()
        wtest = "1"
        If Form_choix_patient.CommandButton1.Caption = "OK" Then 'Check caption, then change it.
           With Form_choix_patient.CommandButton1
              .Caption = "Clicked"
              .Accelerator = "C"
           End With
         Else
           With Form_choix_patient.CommandButton1
            .Caption = "OK"
            .Accelerator = "O"
             'Set Accelerator key to COMMAND + O
           End With
         End If
     
         With Form_choix_patient.ListBox1
           nom_trouve = .Text
           rang_trouve = .TopIndex
           '-nom_trouve = .Value
         End With
       Unload Form_choix_patient ' ----->> là, tu quittes ton userform
      End Sub
    1) toutes ses propriétés sont réinitialisées à la valeur qu'elles avaient en mode création (même, donc, le caption et l'accelerator)
    2) toutes les variables dont la portée est limitée à ce userform (toutes celles que j'ai coloriées en bleu) sont réinitialisées/effacées de la mémoire. Déclarer publiques ces variables ne les conserverait en mémoire que si cette déclaration en Public était faite non dans le module de code de l'userform, mais dans un module standard.
    Pire : même sans fermer ton userform, la portée des variables qui y sont déclarées est limitée à cet userform et ces variables ne sont donc pas accessibles ailleurs dans ton application.

    Je répète : je me suis contenté là de signaler ce seul aspect. Je ne veux pas faire une liste exhaustive de toutes les autres remarques à faire (ce serait s'éloigner de la vocation de ce forum, à savoir traiter une seule difficulté spécifique, parfaitement isolée).

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Petite correction dans ce que dit Jacques :
    Pire : même sans fermer ton userform, la portée des variables qui y sont déclarées est limitée à cet userform et ces variables ne sont donc pas accessibles ailleurs dans ton application.
    Il est tout à fait possible de faire appel à une variable déclarée Public dans un UserForm ou même un module de feuille et celui du classeur du moment qu'on la considère comme une propriété donc, précédée du point. Particularité pour un UserForm, il faut qu'il soit en ShowModal=False afin qu'il puisse passer la main. Petit exemple :
    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
     
    'dans un module standard :
    Sub Test()
     
        UserForm1.Show False
        MsgBox UserForm1.MaVariable
     
    End Sub
    'dans le module de la Form :
    Public MaVariable As Date
     
    Private Sub UserForm_Initialize()
     
        MaVariable = Date
     
    End Sub
    J'oubliai, le module de classe est dans le même cas :
    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
     
    'dans le module de classe :
    Public MaVariable As Date
     
    Private Sub Class_Initialize()
     
        MaVariable = Date
     
    End Sub
    'dans le module standard :
    Sub Test()
     
        Dim Cls As New Classe1
        MsgBox Cls.MaVariable
     
    End Sub

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Que de questions pour une discussion.
    Je répondrai à une seule
    p.s.
    je viens de me rendre compte que le code une fois copié n'est pas indenté, tout aligné à gauche à l'affichage, pas facile à lire.
    J'ai réindenté avec word, même résultat.
    A lire Vos premiers pas dans l'éditeur de macros Excel et tout particulièrement le chapitre V. Conseils et astuces
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre averti
    Homme Profil pro
    retraité, ex programmeur
    Inscrit en
    Février 2018
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : retraité, ex programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2018
    Messages : 25
    Par défaut
    Bonjour à tous,
    La source que j'avais incluse comportait un certain nombre de lignes parasites ajoutées pour voir ce qui se passait.
    je vais donc supprimer tout ce qui ne sert à rien, a fortiori le unload form_choix_patient, et remettre ce qui me semble être au strict minimum. (voir nouvelle source ci-après)
    Je sais bien que l'on peut faire plus court, mais je viens de remettre le nez dans Excel que je n'avais que mal utilisé, jamais de USF et .... de plus pas depuis 12 ans, c'est long.

    Le problème, c'est que je ne sais pas ce qu'il se passe lorsque l'on clique sur un bouton, rien ne se passe, ni avec ok ni avec Annuler, ni Esc ni "Enter", rien ne se poursuit.

    Quelle action fait-il, rend-il la main pour tester la propriété modifiée par le choix dans la liste ou l'abandon avec le bouton Annuler. Je suis obligé de cliquer sur la croix pour fermer la box et je me retrouve en mode pas-à-pas.
    Ne riez pas, je suis C.N ! Mais si vous me dites ce que je dois faire, je mourrai moins c.n. J'ai laissé la Sub CommandButton2 complètement vide exprès.
    Merci à vous,

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    Public nocellule, noligne, nocolonn, nb_ligne, nb_colonn, windex, i As Long
      Public numeros_lignes(), rang_trouve As Long
      Public cellulfin_tableau, lignfin_tableau, wmessage, wcr, wlf, wcrlf As String
      Public search_nom, alphabet, wsP, wbP, nom_trouve, wtest, wtrace As String
      Public myobjet, mysheet, myform As Object
      Public CommandButton1 As Control
      Public CommandButton2 As Control
    Private Sub CommandButton1_Click()
      If Form_choix_patient.CommandButton1.Caption = "OK" Then
        If Form_choix_patient.ListBox1.Text <> "" Then
          With Form_choix_patient.ListBox1
            nom_trouve = .Text
            '--rang_trouve =   '-? à rechercher, listIndex n'existe pas dans ma version
          End With
        Else
          nom_trouve = ""  '--si besoin par la suite
          rang_trouve = -1
        End If
      End If
    End Sub
    Private Sub CommandButton2_Click()
      '--- ? exit sub
    End Sub
     
    Private Sub Form_choix_patient_initialize()
        '- ListBox1.ColumnCount = plage.Columns.Count
        '--Form_choix_patient.ListBox1.List() = Range("A2:A" + Trim(Str(nb_ligne - 1))).Value
        With Form_choix_patient.ListBox1.List
          Form_choix_patient.ListBox1.RowSource = "A2:A" + Trim(Str(nb_ligne - 1))
        End With
     
    End Sub
     
    Sub Choix_du_patient()
      wcr = Chr(13): wlf = Chr(10): wcrlf = wcr + wlf
      alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      wbP = "Patients_macro_courte.xlsm"
      wsP = "Patients"
      wtrace = "Gestion_traçabilité.xlsm"
      Workbooks(wbP).Activate
      Worksheets(wsP).Activate
     
      '-nb_colonn = Range("A1").SpecialCells(xlCellTypeLastCell).Column '--avec vides
      nb_colonn = ActiveSheet.Cells(1, Application.Columns.Count).End(xlToLeft).Column '-avec vides
      dern_colonn = Mid(alphabet, nb_colonn, 1)
      nb_ligne = Range("A1").SpecialCells(xlCellTypeLastCell).Row  '--avec vides
     
      '---tri croissant
      ActiveWorkbook.Worksheets(wsP).Sort.SortFields.Clear
      ActiveWorkbook.Worksheets(wsP).Sort.SortFields.Add Key:=Range("A2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets(wsP).Sort
            .SetRange Range("A2:" + dern_colonn + Trim(Str(nb_ligne)))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
       End With
     
       '---coloriage doublons
        Columns("A:A").Select
        Selection.FormatConditions.Delete
        Selection.FormatConditions.AddUniqueValues
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        Selection.FormatConditions(1).DupeUnique = xlDuplicate
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 10092441
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
     
      '--recalcul une fois vides supprimés
      nb_ligne = Application.CountA(Sheets("Patients").Range("A:A"))
     
      Form_choix_patient_initialize
      Form_choix_patient.Show
     
      If Form_choix_patient.ListBox1.ListIndex = -1 Then
        '--Form_choix_patient.Show False
        Exit Sub   '----vers différents choix feuille principale, à faire..
      Else
        rang_trouve = Form_choix_patient.ListBox1.ListIndex
      End If
      Workbooks(wtrace).Activate '-- autres choix à suivre
    End Sub

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/06/2015, 07h27
  2. Réponses: 5
    Dernier message: 09/04/2014, 22h53
  3. Faire fonctionner des objets d'Excel 2007 sur Excel 2003 ?
    Par brunoperel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/12/2006, 20h52
  4. Faire fonctionner des programmes sous Linux
    Par vviivvii dans le forum Mandriva / Mageia
    Réponses: 14
    Dernier message: 29/08/2006, 19h41

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