XL 2016 CheckBox et OptionButon

Choco2x

XLDnaute Occasionnel
Bonjour à toutes et à tous !

J'ai trouvé beaucoup de réponses concernant ce que je cherche, mais chaque fois soit je n'ai pas réussi à l'adapter, soit ça ne correspondait pas à mes besoins...
Précision : je suis d'un niveau très faible en VBA, si je suis déjà allé aussi loin c'est uniquement grâce à votre aide (surtout JM27 🙏).

J'ai deux problèmes :
- J'ai un formulaire avec des CheckBox, et quand je coche les cases pour les retrouver dans la feuille "Commande", les résultats vont toujours sur la ligne 3
, remplaçant chaque fois le résultat précédent, au lieu d'aller juste en dessous, sur la ligne correspondant à la nouvelle entrée du formulaire.

- Ensuite, mais c'est plus optionnel, je n'arrive pas à remplacer les ComboBoxCivilité et ComboTps par des OptionButon, tout en résupérant les résultats dans la feuille "Commande" pour les deux, et dans la feuille "BD Patients" pour la civilité.

La userform est en vrac, je sais, mais j'ai changé si souvent que j'attends à présent que tout fonctionne pour la mettre en forme...

Quelqu'un pourrait-il m'aider ?...

Merci d'avance...
 

Pièces jointes

  • Transport Hopital 8.6 OK avant tentative BR pour XLD.xlsm
    85.6 KB · Affichages: 76

Staple1600

XLDnaute Barbatruc
Re

=>JM27
en conclusion son bout code n'a rien à faire à cet endroit là
Je suppose que tu parles du bout de code lié au Ctrl et pas de mon bout ? ;)

En parlant de bout, voici une version améliorée de mon petit bout
(pour lister les contrôles et leur Tag)
Ca peut toujours servir
VB:
Sub Test_Tags_v2()
Dim ctrl As Control, k&, t
Sheets.Add
Application.ScreenUpdating = False: [A1:D1].Font.Bold = -1
[A1:D1] = Array("Nom Contrôle", "Tag (part 1)", "Tag (part 2)", "Tag (part 3)"): k = 2
For Each ctrl In UserFormTransport.Controls
If Len(ctrl.Tag) Then
t = Split(ctrl.Tag)
Cells(k, 1) = ctrl.Name: Cells(k, 2) = t(0): Cells(k, 3) = t(1): Cells(k, 4) = t(2)
End If
k = k + 1
Next
Columns(1).SpecialCells(4).EntireRow.Delete: Columns(1).Columns.AutoFit
[A1].CurrentRegion.Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
[A1].CurrentRegion.Borders.Weight = 2
End Sub
 

JM27

XLDnaute Barbatruc
Je précisais que le bout de code qu'il à rajouté dans la macro de validation n'a rien à faire la.
et je confirme que cela plante quand le nom ou le prénom est nouveau

et pour être encore plus clair
VB:
Select Case Split(ctrl.Tag, " ")(0)
Case "1", "6"
If ctrl.Value = True Then .Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = ctrl.Caption
End Select
 
Dernière édition:

JM27

XLDnaute Barbatruc
A ben enfin :D :D :D
Et pendant qu'on y est
est tu sur qu'il faut que cela soit à cet endroit la??
VB:
 If ChkBxContentions.Value = True Then
            .Cells(LigneDeDestination, "Q").Value = "X"
        End If
        If ChkBxBar.Value = True Then
            .Cells(LigneDeDestination, "P").Value = "X"
        End If
        If ChkBxBMR.Value = True Then
            .Cells(LigneDeDestination, "N").Value = "X"
        End If
        If ChkBxCOV.Value = True Then
            .Cells(LigneDeDestination, "O").Value = "X"
        End If
        If ChkBxO2.Value = True Then
            .Cells(LigneDeDestination, "M").Value = "X"
        End If
                End If
          Next
 

Choco2x

XLDnaute Occasionnel
Je ne suis sûr de rien, comme tu as pu le comprendre déjà !! :D
Où dois-je le déplacer ? Ca fonctionne, là, pourtant...
Il n'y a plus qu'une toute petite chose qui coince, et c'est facultatif, c'est le report de la civilité dans la feuille BD Patients...
 

JM27

XLDnaute Barbatruc
Les check box sont écrites avec leur nom dans la macro : pourquoi les mettre dans la boucle ?
donc à déplacer après le next

pour la civilité ( ne pas oublier de déclarer en début de macro LigneDeTransfert en integer ou long )

VB:
 With Sheets("BD patients")
            LigneDeTransfert = .Range("A10000").End(xlUp).Row + 1
           .Range("A" & LigneDeTransfert) = Sheets("Commande").Range("A" & LigneDeDestination)
            .Range("B" & LigneDeTransfert) = Me.ComboNom
            .Range("C" & LigneDeTransfert) = Me.ComboPrénom
            .Range("D" & LigneDeTransfert) = CDate(Me.TxtDateDeNaissance)
  End With

a la place de :

VB:
 With Sheets("BD patients")
            LigneDeDestination = .Range("A10000").End(xlUp).Row + 1
         '  .Range("A" & LigneDeDestination) = Me.ComboBoxCivilité
            .Range("B" & LigneDeDestination) = Me.ComboNom
            .Range("C" & LigneDeDestination) = Me.ComboPrénom
            .Range("D" & LigneDeDestination) = CDate(Me.TxtDateDeNaissance)
        End With
 
Dernière édition:

Choco2x

XLDnaute Occasionnel
' Transfert des strings
.Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = ctrl.Value
End Select
End If
Next
If ChkBxContentions.Value = True Then
.Cells(LigneDeDestination, "Q").Value = "X"
End If
If ChkBxBar.Value = True Then
.Cells(LigneDeDestination, "P").Value = "X"
End If
If ChkBxBMR.Value = True Then
.Cells(LigneDeDestination, "N").Value = "X"
End If
If ChkBxCOV.Value = True Then
.Cells(LigneDeDestination, "O").Value = "X"
End If
If ChkBxO2.Value = True Then
.Cells(LigneDeDestination, "M").Value = "X"
End If
End If
End With

il me dit "Next sans for"... Je l'ai mal positionné ?...
 

JM27

XLDnaute Barbatruc
Il y a aussi le dernier end if qui n'a rien a faire la
Si tu rajoutes de l'indentation ( retrait des ligne conditionnées) , cela sera plus facile d'analyser
( faire de l'indentation en général entre deux textes écrit en "bleu")
exemple :
If , end if
with , end with
on error resume next ; on error goto 0
for , next

etc.

et voila
VB:
With Sheets("Commande")
             ' Je définie la ligne de destination dans la base de données ' dernière ligne documentée +1
             LigneDeDestination = .Range("A65536").End(xlUp).Row + 1
             For Each ctrl In Me.Controls
                     ' Je tranfère les données en fonction de leur type ( numérique , date, string)
                     If ctrl.Tag <> "" Then
                            ' transfert des dates
                            If Split(ctrl.Tag, " ")(2) = "date" Then
                               .Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = CDate(ctrl.Value)
                            ' Transfert des valeures numérique
                            ElseIf Split(ctrl.Tag, " ")(2) = "num" Then
                               .Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = CDbl(ctrl.Value)
                            Else
                                 Select Case Split(ctrl.Tag, " ")(0)
                                   Case "1", "6"
                                       If ctrl.Value = True Then .Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = ctrl.Caption
                                   Case Else 'ajout ici
                                ' Transfert des strings
                                    .Cells(LigneDeDestination, CByte(Split(ctrl.Tag, " ")(0))) = ctrl.Value
                                  End Select
                            End If
                    End If
                          
            Next
                    If ChkBxContentions.Value = True Then
                        .Cells(LigneDeDestination, "Q").Value = "X"
                    End If
                    If ChkBxBar.Value = True Then
                        .Cells(LigneDeDestination, "P").Value = "X"
                    End If
                    If ChkBxBMR.Value = True Then
                        .Cells(LigneDeDestination, "N").Value = "X"
                    End If
                    If ChkBxCOV.Value = True Then
                        .Cells(LigneDeDestination, "O").Value = "X"
                    End If
                    If ChkBxO2.Value = True Then
                        .Cells(LigneDeDestination, "M").Value = "X"
                    End If
    End With
 
Dernière édition:

JM27

XLDnaute Barbatruc
extrait de l'aide VBA
Dim, instruction
Déclare des Lien supprimé et attribue de l'espace de stockage.
Dim, instruction
Les variables déclarées à l'aide de l'instruction Dim au Lien supprimé sont disponibles pour toutes les procédures duLien supprimé. Au Lien supprimé, les variables ne sont disponibles qu'au sein de la procédure.
voir aussi portée des variables et espace de stockage de celle ci

Utilisez l'instruction Dim au niveau module ou au niveau procédure pour déclarer le type de données d'une variable. Par exemple, l'instruction suivante déclare une variable comme variable de type Integer.

Non public doit se mettre dans un module standard
Private ( ou dim ) en tête d'un module en particulier
et dim en tête de procédure
dim LigneDeTransfert As Long
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 379
Messages
2 087 767
Membres
103 662
dernier inscrit
rterterert