Macro ne s'exécute pas

Bonsoir,

Le code ci-dessous fonctionne avec F8 ou F5 (si point d'arrêt ciblé sur le code). Il remplit deux textbox (Taille et âge), mais il ne s'exécute pas sans points d'arrêt.

Private Sub UserForm_Activate()
    Set WsH = ThisWorkbook.Sheets("BD Homme")
    LigneH = WsH.Range("A65000").End(xlUp).Row    ' Dernière ligne

If CBSexe = "Homme" Then
    TBTaille = WsH.Cells(LigneH, 2).Value
    TBAge = WsH.Cells(LigneH, 4).Value
End If

    Set WsF = ThisWorkbook.Sheets("BD Femme")
    LigneF = WsF.Range("A65000").End(xlUp).Row    ' Dernière ligne

If CBSexe = "Femme" Then
    TBTaille = WsF.Cells(LigneF, 2).Value
    TBAge = WsF.Cells(LigneF, 4).Value
End If

End Sub

Ci-joint le fichier

8imc.zip (1.19 Mo)

Une explication au problème ?

Salut,

Il semble que ton évènement UserForm_Activate n'est pas celui que tu souhaites, puisqu'il fait logiquement suite à l'évènement UserForm_Initialize (il se déclenche à sa suite, avant que tu aies pu choisir le sexe).

Je pense donc que tu devrais utiliser l'évènement CBSexe_Change, comme dans le fichier ci-joint.

Si ce n'est pas ça, décrit étape par étape ce que tu souhaites.

8imc-v1.zip (1.19 Mo)

Cordialement.

Bonsoir,

il y a aussi depuis 2007 pour trouver la dernière ligne :

LigneH = WsH.Range("A" & Rows.Count).End(xlUp).Row

Enfin je crois...

@ bientôt

LouReeD

Salut LouReeD,

Je pense qu’il y a bien encore 3 ou 4 améliorations possibles dans ce bout de code et 36 dans l’ensemble du fichier.

Mais je pensais déjà attendre que le membre s’exprime sur la première partie traitée avant d’aller plus loin.

Amicalement.

Merci Yvouille pour ta réponse.

Ça fonctionne comme souhaité.

Ce qui m'étonne, c'est que jusqu'à avant hier, mon fichier fonctionnait parfaitement avec l'évènement activate, et que le problème n'est apparu qu'hier.

Je suis toujours preneur d'amélioration. Merci de me mettre sur la voie.

Dan

Salut,

Sans être un très grand spécialiste, je te montre deux manières de simplifier ton code. Je pense que l'on peut bien entendu encore faire mieux.

Sur les deux variantes du fichier, j'en montre une ici.

Private Sub CBSexe_Change()

    If CBSexe = "Homme" Then
        With Sheets("BD Homme")
            TBTaille = .Cells(.Range("A" & Rows.Count).End(xlUp).Row, 2)
            TBAge = .Cells(.Range("A" & Rows.Count).End(xlUp).Row, 4)
        End With
    Else
        With Sheets("BD Femme")
            TBTaille = .Cells(.Range("A" & Rows.Count).End(xlUp).Row, 2)
            TBAge = .Cells(.Range("A" & Rows.Count).End(xlUp).Row, 4)
        End With
    End If

End Sub

Entre autres commentaires possibles :

- Set WsH : je préfère personnellement l'instruction With / End with, mais je pense que ça ne change pas grand chose.

- ThisWorkbook : cette instruction est inutile ici puisque ThisWorkbook est, en ce cas, la valeur par défaut.

- Range("A65000").End(xlUp).Row : cette instruction est correcte, mais peut être améliorée - comme te la indiqué LouReeD - en utilisant rows.count qui a les avantages 1) de tenir compte absolument de toutes les lignes de ta feuille et 2) de s'adapter à toutes les versions Excel.

- Value : je n'ai encore jamais rencontré de situations où cette instruction apporte quelque chose. La valeur Value est également prise en compte pas défaut. Tu pourrais pousser l'inutilité plus loin et écrire par exemple TBTaille.Value = Cells(3, 2).Value au lieu de TBTaille = Cells(3, 2)

Je n'ai pas poussé plus loin mes investigations. Il faudrait des heures afin de contrôler ce qui est déjà possible d'améliorer dans tes autres codes.

Amicales salutations.

9imc-v2.zip (1.19 Mo)

Bonjour Yvouille, Lou Reed

il y a aussi depuis 2007 pour trouver la dernière ligne :
LigneH = WsH.Range("A" & Rows.Count).End(xlUp).Row
Enfin je crois...

@Lou Reed. Comme tu le précises, le Rows.count a commencé a être utilisé quand on est passé à une feuille excel contenant 1048xxx lignes (excel 2007 et +) mais cette manière de coder existait bien avant. C'est juste qu'avant excel 2007 une feuille excel ne disposait que de 65536 lignes et que bien souvent on verra des codes réalisés début des années 2000 qui utilisent Range("A65xxxx") pour trouver la dernière ligne. Peu importe la version d'excel, la ligne de code que tu mentionnes est la meilleure car quelque soit la version excel et comme précisé par Yvouille on laisse le choix à excel.

Par contre pour bien préciser sur quelle feuille on se trouve, je fais plutot ceci en cherchant la dernière ligne --> LigneH = WsH.Range("A" & WsH.Rows.Count).End(xlUp).Row

Cordialement

Bonjour,

très bonne précision, mais ma connaissance n'est pas si élevée que cela, alors pardonnez moi mes maladresse de langage...
Mais comme avant il n'y avait pas d'histoire de 1 048xxx lignes, je comprend que le Rows.Count ne devait pas si souvent être utilisé car on connaissait la taille maxi d'une feuille avec ses 256 colonnes dans l'autre axe.

Et vous avez raison, il est utile de préciser la feuille, c'est plus propre et plus sur ! Mais hélas je ne suis pas assez perfectionniste pour le faire systématiquement !
C'est comme pour la référence du classeur, comme je ne fait que des applications "autonome" je ne m'en préoccupe pas et du coup cela peut engendrer des problème lors d'ouvertures multiple de fichier excel...

@ bientôt

LouReeD

Bonjour tout le monde,

@ Dan :

Tu m'avais déjà dit il y a bien longtemps que tu précisais la référence de la feuille devant .Rows.Count, mais je ne comprends toujours pas pourquoi. Tu cherches en réalité le nombre de lignes du fichier, quelle que soit la feuille sur laquelle tu te trouves, tu ne peux pas avoir deux feuilles avec un nombre différents de lignes dans le même fichier, non ?

@LouReeD :

Je ne pense pas que ce soit utile de préciser la feuille si c'est inutile ce n'est pas nécessaire. Autrement, si vraiment c'était plus sur, pourquoi ne pas préciser également le classeur et l'application, pendant qu'on y est, des fois que tu serais sur Word lorsque tu lances la macro !

Cordiales salutations.

Bonjour,

@ Dan :

Tu m'avais déjà dit il y a bien longtemps que tu précisais la référence de la feuille devant .Rows.Count, mais je ne comprends toujours pas pourquoi. Tu cherches en réalité le nombre de lignes du fichier, quelle que soit la feuille sur laquelle tu te trouves, tu ne peux pas avoir deux feuilles avec un nombre différents de lignes dans le même fichier, non ?

@Yvouille : Exact on en avait discuté. C'est plutôt une règle que j'applique pour m'éviter des soucis au cas où on passe d'un fichier à une autre et surtout à la suite de discussions il y a une quinzaine d'années avec d'autres personnes sur les forums qui avaient justement relevé cette manière plus juste (donc avec point devant). Cela m'est également arrivé de voir cette ajout du point sur des sites de référence tel que Walkenbach ou cpearson ou stack overflow. In fine, le problème reste toujours de savoir toujours ce qu'excel voit et ici entre les deux (avec ou sans le point) pour s'éviter des problème. Mais comme tu le mentionnes le résultat est bon aussi sans le point.

Lorsque tu sites pour Autrement, si vraiment c'était plus sur, pourquoi ne pas préciser également le classeur et l'application, pendant qu'on y est, des fois que tu serais sur Word lorsque tu lances la macro !. Ben tiens c'est marrant parce que j'ai justement eu une conversation avec un grand pro de la programmation qui m'avait fait remarqué que l'on devrait tous coder de cette manière là pour éviter les erreurs notamment lorsque l'on passe d'une application à l'autre

Amicalement

Salut Dan, merci pour tes précisions.

on devrait tous coder de cette manière là pour éviter les erreurs

Tu t'imagines la complication que seraient alors les codes

Bien à toi.

@Yvouille : ah ben oui ! de la folie mais je peux imaginer. Heureusement on en est pas là mais si je me souviens bien, il m'avait dit on en arriverait à cette situation.

Amicalement

Salut Dan67,

On peut avoir un petit retour sur l'aide fournie ?

Amicalement.

Merci à vous pour vos posts

Depuis vos commentaires, j'utilise : Range("A" & Rows.Count).End(xlUp).Row à la place de Range("A65000").End(xlUp).Row
- J'avais placé mon code dans "private CbSexe_Change". ça fonctionnait parfaitement.
- J'ai remplacé set par With .... End with et supprimé ThisWorkbook

- Mais depuis mon projet a évolué:

- J'ai créé une autre USF2 me permettant de saisir les données d'un nouvel utilisateur et d'envoyer ces données dans une nouvelle feuille ayant pour nom celui du nouvel utilisateur
- Pour cela, j'ai écrit une macro me permettant de récupérer le nom de tous les onglets des utilisateurs dans une Combobox1 située dans une USF1 et ainsi afficher les données des feuilles choisies de chaque utilisateur avec combobox_change et If ComboBox1 = "Nom1" ou "Nom2", ... Then ... les données s''écrivent dans la nouvelle feuille. Ça fonctionne très bien.

J'ai à résoudre le problème suivant : Pour afficher le nouvel utilisateur dans la combobox1, je dois d'abord fermer l'USF1puis relancer l'USF1 pour avoir le nouvel utilisateur dans la combobox1. Je trouve ça trop lourd. L'idéal serait d'avoir le nouveau nom immédiatement dans la combobox1, sans fermer l'USF1.

J'en suis là pour l'instant.

Bonjour,

Comme votre projet à évolué, ce serait bien de mettre votre fichier en ligne.

Cordialement

Bonjour

Ci-joint le fichier

Plutôt satisfait jusque là, même si j'ai pas encore terminé le projet.

Ça serait plus élégant de pouvoir afficher tout de suite les nouvelles données dans l'USF principale, que ce soit suite à l'actualisation du poids ou à l'ajout d'un nouvel utilisateur, mais pour l'instant je ne trouve pas comment faire.

6imcv2.xlsm (64.75 Ko)

Bonjour

Je suis désolé mais je viens de voir que je ne vous ai plus répondu sur le sujet. Est-ce qu'il est toujours d'actualité ?

Cordialement

Rechercher des sujets similaires à "macro execute pas"