XL 2019 Probleme de Checkbox et OptionBoutton.

Flnte

XLDnaute Junior
Bonjour,
Je créer un fichier excel pour calculer le tarif d'un monument. En fonction des options je peux polir ou non une pièce qui le compose. Ainsi lorsque l'on ouvre l'Userform1 si on double clic sur le label Semelle Avanton peut choisir les cotés que l'on souhaite polir. Sauf qu'en faite ce que j'ai dans mon userform2 c'est 6 checkbox qui se nomment CheckBoxDessus CheckBoxDerriere CheckBoxAvant CheckBoxDessous CheckBoxGauche CheckBoxDroit. Et pour chacun de ces checkbox j'ai des bouton option qui sont liés au CheckBox. Ainsi pour CheckBoxDessus j'ai OptionDessus100 OptionDessus75 OptionDessus50 et OptionDessus25. Pour CheckBoxAvant j'ai OptionAvant100 OptionAvant75 OptionAvant50 et OptionAvant25. Donc Pour chaque CheckBox je ne peux ensuite choisir que 1 optionbutton qui est lié. Par contre je peux choisir un OptionAvant liés à CheckBoxAvant mais aussi un OptionDessus liés à CheckboxDessus. E Or là dès que je selectionne un optionbutton si je sélectionne un autre liés à un autre checkbox cela annule le premier. Est-ce que quelqu'un sait résoudre cela car je bloque et je ne trouve pas de réponse?
 

Pièces jointes

  • test.xlsm
    161.6 KB · Affichages: 9
Solution
Voici en pièce jointe une proposition.
Normalement ça marche pour les quatre semelles.

J'ai désactivé la boucle d'attente de fermeture du UserForm2.
J'ai supprimé le "clic souris" qui ne me semblait pas utile et qui provoquait un "cling" assez agaçant.
J'ai laissé en commentaire les anciens morceaux de code qui ne sont pas utilisés.

Pour le code de polissage, j'ai ajouté des espaces entre les faces.
On peut les supprimer si tu veux un code en un seul morceau.

Je n'utilise pas la fonction GetTargetCell.


Remarque : dans l'appel de la macro OpenUserForm2 le deuxième argument n'est plus utile.
J'ai laissé OpenUserForm2 "Semelle Gauche", "Q2" mais OpenUserForm2 "Semelle Gauche" suffit.

Flnte

XLDnaute Junior
Quel label ?

Il n'y a pas de cellule nommée dans le classeur.


ps : je n'ai pas compris à quoi servent les tests sur l'ouverture du UserForm2.
Pas compris non plus ce que tu veux faire avec UserForm2.targetCell = targetCell.
Et pas compris non plus pourquoi la boucle "d'attente de fermeture" du UserForm2.
Les tests sur l'ouverture du UserForm2 sont là pour etre sur que UserForm2 n'est pas déjà ouvert avant de l'ouvrir à nouveau

UserForm2.targetCell = targetCell sert à transmettre la valeur de targetCell à l'UserForm2 afin que celui-ci sache dans quelle cellule en feuille "Calcul" il doit mettre à jour.

La boucle "d'attente de fermeture" du UserForm2 sert à empêcher l'exécution du code dans le UserForm1 tout le temps que UserForm2 est ouvert et afin que l'Userform2 soit en modal.
 

TooFatBoy

XLDnaute Barbatruc
UserForm2.targetCell = targetCell sert à transmettre la valeur de targetCell à l'UserForm2 afin que celui-ci sache dans quelle cellule en feuille "Calcul" il doit mettre à jour.
Ce que je ne comprends pas, c'est ce qu'est UserForm2.targetCell.

Ce n'est pas un objet genre Label ou autre.
Ce n'est pas une variable VBA.
C'est quoi donc ??? 🤔



La boucle "d'attente de fermeture" du UserForm2 sert à empêcher l'exécution du code dans le UserForm1 tout le temps que UserForm2 est ouvert et afin que l'Userform2 soit en modal.
Ok, mais :
Microsoft à dit:
Lorsqu’un objet UserForm est modal, l’utilisateur doit fournir des informations ou fermer l’objet UserForm pour pouvoir utiliser toute autre partie de l’application. Aucun code suivant n’est exécuté tant que l’objet UserForm n’est pas masqué ou déchargé.
Du coup je me demande si ta boucle d'attente est vraiment utile.
 

TooFatBoy

XLDnaute Barbatruc
J'ai un peu modifié ton UserForm2 auquel j'ai ajouté un Label.
Label qui du coup sert à mémoriser la semelle sur laquelle on travaille. ;)

UserForm2.png
 

TooFatBoy

XLDnaute Barbatruc
Voici en pièce jointe une proposition.
Normalement ça marche pour les quatre semelles.

J'ai désactivé la boucle d'attente de fermeture du UserForm2.
J'ai supprimé le "clic souris" qui ne me semblait pas utile et qui provoquait un "cling" assez agaçant.
J'ai laissé en commentaire les anciens morceaux de code qui ne sont pas utilisés.

Pour le code de polissage, j'ai ajouté des espaces entre les faces.
On peut les supprimer si tu veux un code en un seul morceau.

Je n'utilise pas la fonction GetTargetCell.


Remarque : dans l'appel de la macro OpenUserForm2 le deuxième argument n'est plus utile.
J'ai laissé OpenUserForm2 "Semelle Gauche", "Q2" mais OpenUserForm2 "Semelle Gauche" suffit.
 

Pièces jointes

  • test-(TooFatBoy-v01).xlsm
    174.2 KB · Affichages: 1
Dernière édition:

Flnte

XLDnaute Junior
c'est très propre et très beau ! merci. Alors j'ai encore juste deux dernières demandes. En premier lieux quand le code de polissage s'inscrit en colonne Q j'ai un espace entre par exemple H100 et A100, où je peux modifier ce.
La dernière chose c'est qu'ici j'ai fais mettre en colonne Q pour le test, en réalité cela ira en I. Mais là en réfléchissant je me demande si je ne peux pas ajouter un bouton dans userform2 pour réinitialiser le code par défault. Je m'explique, très généralement la semelle avant ne va être polie que sur le champs avant et le haut donc le code défault est H100A100. Je me dis que si j'inscrit dans une colonne par exemple R le code par défault ligne par ligne et que j'utilise un bouton commande réinitialisation qui va simplement copier le contenu de R vers I cela fera le travail. Cela me semble etre le plus simple du moins
 

TooFatBoy

XLDnaute Barbatruc
En premier lieux quand le code de polissage s'inscrit en colonne Q j'ai un espace entre par exemple H100 et A100, où je peux modifier ce.
J'ai édité mon message pendant que tu remplissais le tien : on peut supprimer les espaces si tu veux, un code en un seul morceau.

On peut aussi changer l'ordre des faces, si tu veux un ordre précis dans le code de polissage.
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
J'ai modifié le fichier pour que tu n'aies plus d'espace dans le code de polissage.

Pour ne pas surcharger le serveur XLD pour rien j'ai mis le nouveau fichier à la place de l'ancien dans le message #22.



Ta nouvelle question étant... une nouvelle question ;), il serait probablement mieux d'ouvrir un autre fil de discussion.
 

Flnte

XLDnaute Junior
J'ai modifié le fichier pour que tu n'aies plus d'espace dans le code de polissage.

Pour ne pas surcharger le serveur XLD pour rien j'ai mis le nouveau fichier à la place de l'ancien dans le message #22.



Ta nouvelle question étant... une nouvelle question ;), il serait probablement mieux d'ouvrir un autre fil de discussion.
C'est pas faux. Je peux mettre en résolu pour ici !
 

Flnte

XLDnaute Junior
@TooFatBoy , je reviens vers toi pour quelchose de très bête.. en faite je veux faire la même chose que tu as fais pour les semelle avec les plinthes, l'entourage, le socle, la stèle et la dalle mais lorsque j'essaie de faire des rajouts je me plante de toute part. As-tu moyen de m'indiquer où je dois intervenir car j'ai bien essayer cela :
VB:
Private Sub SemelleGauche_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Semelle Gauche"
End Sub

Private Sub SemelleDroite_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Semelle Droite"
End Sub

Private Sub SemelleAvant_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Semelle Avant"
End Sub

Private Sub SemelleArriere_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Semelle Arrière"
End Sub
Private Sub PlintheGauche_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Plinthe Gauche"
End Sub

Private Sub PlintheDroite_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Plinthe Droite"
End Sub

Private Sub PlintheAvant_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Plinthe Avant"
End Sub

Private Sub PlintheArriere_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    OpenUserForm2 "Plinthe Arrière"
End Sub



Private Sub OpenUserForm2(lblName As String, typeLabel As String)
    Dim offsetTop As Long

    ' Place le UserForm2 sur le premier écran au-dessus du UserForm1
    offsetTop = -UserForm2.InsideHeight         ' Prend en compte la hauteur du titre du UserForm2
    UserForm2.Top = UserForm1.Top + offsetTop
    UserForm2.Left = UserForm1.Left

    If typeLabel = "Semelle" Then
        UserForm2.LabelSemelle.Caption = lblName
        UserForm2.CheckBoxDessus.Caption = "Dessus"
        UserForm2.CheckBoxAvant.Caption = "Avant"
        ' Ajoutez les autres ajustements pour les labels "Semelle"
    ElseIf typeLabel = "Plinthe" Then
        UserForm2.LabelPlinthe.Caption = lblName
        UserForm2.CheckBoxGauche.Caption = "Gauche"
        UserForm2.CheckBoxDroite.Caption = "Droite"
        ' Ajoutez les autres ajustements pour les labels "Plinthe"
    End If

    UserForm2.Show vbModal
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' Efface le contenu de la cellule Z1 de la feuille de calcul lorsque l'UserForm2 est fermé
    ThisWorkbook.Sheets("Calcul").Range("Z1").ClearContents
    ' Réinitialise la variable globale pour indiquer que l'UserForm2 n'est plus ouvert
    isUserForm2Open = False
End Sub

mais cela ne marche pas. J'ai remis le fichier car depuis j'ai fais des modifications
 

Pièces jointes

  • test-(TooFatBoy-v01) (2).xlsm
    152.9 KB · Affichages: 1

TooFatBoy

XLDnaute Barbatruc
Pour les plinthes, tes nouvelle macros pour les double-clic sont OK. 👍
Ce qu'il faut modifier, c'est la macro du bouton "Valider" du UserForm2. ;)

Regarde si c'est bon pour les plinthes.
 

Pièces jointes

  • test-(TooFatBoy-v02).xlsm
    161.4 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
314 708
Messages
2 112 090
Membres
111 416
dernier inscrit
philipperoy83