Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Incompatibilité de type avec un userform

Tom_des

XLDnaute Nouveau
Bonjour,

je suis en train d'écrire un code où quand je double clique sur un cellule celle ci m'ouvre un userform dans lequel le 1er textbox me permet de rentrer un nouveau commentaire et dans un 2nd j'ai la liste de tous les anciens commentaires.
Le code est le suivant :

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Dim rng As Range

    Dim ws As Worksheet

    Dim uf As New UserForm1



    ' Définir la plage à surveiller

    Set ws = ThisWorkbook.Sheets("Synthesis")

    Set rng = Union(ws.Range("D25:D35"), ws.Range("I25:I35"), ws.Range("N25:N35"))



    ' Vérifier si la cellule double-cliquée est dans la plage spécifiée

    If Not Intersect(Target, rng) Is Nothing Then

        Cancel = True  ' Annuler le double-clic pour éviter l'édition directe de la cellule



        ' Afficher le UserForm

        uf.Show



        ' Mettre à jour la cellule avec le nouveau commentaire

        Dim newComment As Variant

        Dim existingComments As Variant

      

        ' Construire le nouveau commentaire avec la date, prénom et nom de l'utilisateur

        newComment = Format(Now(), "dd/mm/yyyy") & " - " & Left(Application.UserName, 1) & Mid(Application.UserName, InStr(Application.UserName, " ") + 1, 2) & " - " & uf.TextBox1.Text

      

        ' Récupérer les commentaires existants de la cellule

        existingComments = Target.Value

      

        ' Mettre à jour les commentaires dans la cellule

        Target.Value = newComment

      

        ' Mettre à jour les commentaires dans le UserForm

        uf.TextBox2.Text = existingComments & vbCrLf & newComment

    End If

End Sub

Cependant j'ai un eurreur de type sur cette ligne : uf.TextBox2.Text = existingComments & vbCrLf & newComment.

J'ai essayé de rajouter des .text, des .value et même de dimensionner mes variables en variant mais rien n'y fait.

Si vous avez des idées je suis preneur !

Merci d'avance !
 
Dernière édition:
Solution
Re,
Ah oui à sa fermeture l'uf vide toutes les variables et il n'est pas possible des les "sauvegarder" sur l'uf lui-même pour les retrouver lors de la prochaine ouverture. D'après ce que vous dites, il faut que la liste des commentaires de la textbox2 soit sauvegardée en fin de...

wDog66

XLDnaute Occasionnel
Bonjour et bienvenue

Il est mieux en général, de mettre son code entre balises sur les forums,
ici vous avez un bouton pour ça

Sinon, je pense qu'il faut définir vos "comment" en String et non Variant

A tester
 

Tom_des

XLDnaute Nouveau
Merci beaucoup je viens de le changer !

Au début j'avais défini mes "comments" en string mais dans ce cas j'ai la même incompatibilité de type mais sur cette ligne là : existingComments = Target.Value.

Je ne comprend pas pourquoi puisque dans ma cellule j'ai une chaîne de caractère donc le target.value est censé me donné une chaîne de caractère, compatible donc avec existingComment ...
 

Tom_des

XLDnaute Nouveau

Si cela peut aider, j'ai un bouton de commande pour valider mon nouveau commentaire dans le userform dont le code est le suivant :

VB:
Private Sub CommandButton1_Click()
    ' Récupérer le nouveau commentaire depuis TextBox1
    Dim newComment As String
    newComment = Me.TextBox1.Text
    
    ' Ajouter le nouveau commentaire à TextBox2
    Me.TextBox2.Text = Me.TextBox2.Text & vbCrLf & newComment
    
    ' Effacer le contenu de TextBox1 après validation
    Me.TextBox1.Text = ""
    
    ' Fermer le UserForm après validation
    Unload Me
End Sub

Le programme ne me retourne pas de problème mais peut-être que ça peut vous aider.
 

Tom_des

XLDnaute Nouveau
Bonjour a tous,

Avec le code d'origine pas d'erreur mais pas d'affichage dans l'uf, normal
Mettre
VB:
        ' Afficher le UserForm

        uf.Show
avant le end if

Bonjour,

Je pense avoir mal compris votre réponse car cela me donnerait :

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rng As Range
    Dim ws As Worksheet
    Dim uf As New UserForm1  ' Assurez-vous que le nom du UserForm est correct

    ' Définir la plage à surveiller
    Set ws = ThisWorkbook.Sheets("Synthesis")
    Set rng = Union(ws.Range("D25:D35"), ws.Range("I25:I35"), ws.Range("N25:N35"))

    ' Vérifier si la cellule double-cliquée est dans la plage spécifiée
    If Not Intersect(Target, rng) Is Nothing Then
        Cancel = True  ' Annuler le double-clic pour éviter l'édition directe de la cellule

        ' Mettre à jour la cellule avec le nouveau commentaire
        Dim newComment As String
        Dim existingComments As String
        
        ' Construire le nouveau commentaire avec la date, prénom et nom de l'utilisateur
        newComment = Format(Now(), "dd/mm/yyyy") & " - " & Left(Application.UserName, 1) & Mid(Application.UserName, InStr(Application.UserName, " ") + 1, 2) & " - " & uf.TextBox1.Text
        
        ' Récupérer les commentaires existants de la cellule
        existingComments = Target.Value
        
        ' Mettre à jour les commentaires dans la cellule
        Target.Value = newComment
        
        ' Mettre à jour les commentaires dans le UserForm
        uf.TextBox2.Text = existingComments & vbCrLf & newComment
        
        ' Afficher le UserForm
        uf.Show
    End If
End Sub

mais dans ce cas j'ai toujours la même incompatibilité de type (erreur 13) sur cette ligne : existingComments = Target.Value et mon userform ne s'affiche plus, l'erreur survient dès le double click sur la cellule.
 

Bernard38

XLDnaute Nouveau
Hello @Tom_des
Pourquoi se compliquer autant ? Si j'ai bien compris, au double clic sur la cellule cible :
1/Tu lance l'uf
2/tu récupères la valeur de la cellule pour la mettre en textbox2 (ExistingComments)
3/l'utilisateur rempli la textbox1
4/à la validation de l'uf,
- tu crées un nouveau commentaire avec la valeur de textbox1 qui est envoyé dans la cellule cible (NewComments)
- tu rajoutes le nouveau commentaire dans la textbox2

Du coup, pourquoi ne pas mettre le code de la partie 2 à 4 directement sur le commandbutton de l'uf ?
...ou j'ai pas compris un truc
 

Tom_des

XLDnaute Nouveau
Re,

Tom_des

Ben, chez moi pas d'erreur!
Mettez votre ficher a dispo

Bonjour, je viens de trouver une semblant de solution je pense. Mes cellules étaient fusionnées (par exemple ma cellule D25 recouvre en réalité les colonnes D à G et les lignes 25 et 26). En enlevant la fusion je n'ai plus ce problème.

J'ai donc deux questions supplémentaires.

Est-ce qu'il existe une manipulation pour que cela fonctionne avec la fusion ?
et un nouveau problème apparait ... lorsque je rentre un nouveau commentaire, celui-ci ne s'affiche pas, j'ai seulement la date ainsi que le trigramme mais pas de commentaire derrière. Et dans ma fenêtre des anciens commentaires je n'ai pas le nouveau au-dessus de l'ancien malgré la présence de "vbCrLf", ceux ci sont côte à côte ...

si vous avez de nouvelles propositions je suis encore preneur !
 

Tom_des

XLDnaute Nouveau

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rng As Range
    Dim ws As Worksheet
    Dim uf As New UserForm1  ' Assurez-vous que le nom du UserForm est correct

    ' Définir la plage à surveiller
    Set ws = ThisWorkbook.Sheets("Synthesis")
    Set rng = Union(ws.Range("D25:D35"), ws.Range("I25:I35"), ws.Range("N25:N35"))

    ' Vérifier si la cellule double-cliquée est dans la plage spécifiée
    If Not Intersect(Target, rng) Is Nothing Then
        Cancel = True  ' Annuler le double-clic pour éviter l'édition directe de la cellule
      
        ' Afficher le UserForm
        uf.Show
      
    End If
End Sub

et

VB:
Private Sub CommandButton1_Click()
    ' Récupérer le nouveau commentaire depuis TextBox1
    Dim newComment As String
    newComment = Me.TextBox1.Text
   
    ' Mettre à jour la cellule avec le nouveau commentaire
    Dim newCommentcomplet As String
    Dim existingComments As String
    Dim Target As Range
   
    Set Target = ActiveCell
   
    ' Construire le nouveau commentaire avec la date, prénom et nom de l'utilisateur
    newCommentcomplet = Format(Now(), "dd/mm/yyyy") & " - " & Left(Application.UserName, 1) & Mid(Application.UserName, InStr(Application.UserName, " ") + 1, 2) & " - " & newComment
       
    ' Récupérer les commentaires existants de la cellule
    existingComments = Target.Value
       
    ' Mettre à jour les commentaires dans la cellule
    Target.Value = newCommentcomplet
       
   
    ' Ajouter le nouveau commentaire à TextBox2
    Me.TextBox2.Text = Me.TextBox2.Text & vbCrLf & newCommentcomplet
   
    ' Effacer le contenu de TextBox1 après validation
    Me.TextBox1.Text = ""
   
    ' Fermer le UserForm après validation
    Unload Me
End Sub

Bonjour, effectivement comme cela mon commentaire s'affiche dans la cellule.

Néanmoins, mes anciens commentaires ne sont pas sauvegardés dans mon 2nd textbox (la zone de texte est vide) ... ce que je ne comprends pas puisque newCommentcomplet fonctionne (il apparait dans la cellule) et Me.textbox2.text se reprend lui-même ...

Je vous remercie pour votre aide déjà conséquente.

Si vous avez des idées pour ce problème, je suis encore preneur !
 
Dernière édition:

Bernard38

XLDnaute Nouveau
Re,
"par contre ma variable target n'est plus définie. Je la définie comment" Il faut passer la cellule et sa valeur en variables public. J'ai ajouté un module "Variables"
Je vous joins le fichier.
Par contre il y a une chose que je ne comprends pas : pourquoi récupérer les valeurs ancienne et nouvelle dans le textbox2 puiqu'elles ne sont pas utilisées et qu'au Unload de l'uf elles sont vidées ? Le code n'est pas fini peut-être ?
 

Pièces jointes

  • ClasseurTomDes.xlsm
    20.4 KB · Affichages: 1

Discussions similaires

Réponses
0
Affichages
324
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…