Textbox / Formulaire / Incompatibilité de type "Erreur 13"

Résolu
Julien -  
 Julien -
Bonjour tout le monde,
Je débute sous VBA, j'ai commencé il y a quelques jours. Donc si mes questions peuvent vous paraitre simples je m'en excuse.
J'ai parcouru plusieurs forum sans trouver la solution à mon problème (malgré que plusieurs questions ressemblais à ce que je cherchais) donc je me permets de la poser ici.

Mon problème :
J'ai créé un formulaire "Notation"
Dans celui-ci j'ai des TextBox
Les TextBox de 1 à 16 font références à la valeur des cellules correspondantes dans un fichier excel (correspondance assurée par "numl")
Les textBox 17 à 32 devrait me permettre de mettre à jour les données en ajoutant la valeur correspondante.
Le problème de mon code est que quand je le lance j'ai une erreur d'incompatibilité de type.
Je soupçonne que c'est du au fait que j'associe le texte "TextBox" & "I" (qui est integer) Mais je n'ai aucune idée de comment le résoudre...

Exemple:
Cellule : M1 = 2
TextBox1 = 2
TextBox17 = 10

Actualisation (Assurer par le boutton4)

Cellule M1 = 12
TextBox1 = 12
TextBox17 = ""

Private Sub CommandButton4_Click()
Dim c As Range
Dim numl
Dim a As Integer
Dim T As Integer

a = Worksheets(ActiveSheet.Name).Index
Set c = ActiveCell
numl = c.Offset(1, 0).Value

TextBox42 = ActiveCell.Value
TextBox41 = Sheets(a).Range("I" & 1).Value

For T = 17 To 32

If IsEmpty("TextBox" & T) = True Then
Sheets(3).Cells(T - 4 & numl).Value = CDbl(("TextBox" & ((T - 16))))

ElseIf IsEmpty("TextBox" & T) = False Then
Sheets(3).Cells(T - 4 & numl).Value = (CDbl(("TextBox" & T)) + CDbl(("TextBox" & (T - 16))))
End If

Next T

Unload Me
Notation.Show


PS : l'objet 'numl" me permet de retrouver la ligne de la cellule travaillé.

J'espère que je n'ai pas été trop vague.
J'espère que vous pourrez m'aider, n'hésitez pas à me demander des précisions.
Merci d'avance de votre aide précieuse!!

1 réponse

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

    Pour explorer les textbox, tu peux utiliser une boucle de ce type :
    Option Explicit
    Private Sub CommandButton1_Click()
    Dim Ctr As Control
    For Each Ctr In Me.Controls
     If TypeOf Ctr Is MSforms.TextBox Then
       If Ctr.Value = vbNullString Then
         MsgBox Ctr.Name & " est vide"  ' à remplacer par tes instructions
       Else
         MsgBox Ctr.Name & " = " & Ctr.Value ' idem
       End If
     End If
    Next
    End Sub
    
    1
    1. Julien
       
      Bonjour Patrice33740,

      D'abord je vous remercie pour votre première réponse. Cela m'a appris la fonction "Ctr" qui me servira à de multiples reprises. je vais approfondir mes connaissances pour cette fonction.

      Votre code marche très bien, Ceci dit, j'ai besoin de tester la validité uniquement sur certaines "textbox" : de la 17 à la 32. Si jamais ces textbox sont vides, je souhaite les additionner à la texbox (N - 16) r ou plutôt à la cellule afficher sur cette textBox (N-16).

      Exemple :
      TextBox 17 = 12
      TextBox (17-16) = Valeur de départ + 12
      Cellule (columns(17-4), numl) = Valeur de départ +12

      De manière générale je cherche à créer un objet qui reprend le numéro de la TextBox pour pouvoir y faire référence par la suite.
      C'est ce que j'essaye de faire avec :
      num = Mid(Ctr.Name, 8)

      Donc j'ai écris avec ton script: Et ça marche plutôt pas mal dans l'ensemble. Pet être as tu des idée pour simplifier?

      Private Sub CommandButton4_Click()
      Dim c As Range
      Dim numl As Integer
      Dim num As Integer
      Dim Ctr As Control
      Dim a As Integer

      a = Worksheets(ActiveSheet.Name).Index
      Set c = ActiveCell
      numl = c.Offset(1, 0).Value

      Sheets(3).Select 'On sélectionne notre fichier source

      For Each Ctr In Me.Controls
      If TypeOf Ctr Is MSforms.TextBox Then
      num = Mid(Ctr.Name, 8)
      If num > 16 And num < 32 Then
      If Ctr.Value = vbNullString Then
      'MsgBox Ctr.Name & " est vide"
      'Je ne veux rien faire

      Else
      'MsgBox Ctr.Name & " = " & Ctr.Value
      Cells(numl, num - 4).Value = (Cells(numl, num - 4).Value + CDbl(Ctr.Value))
      End If
      Ctr.Value = ""
      ' Je nétoie le textbox

      End If
      End If
      Next

      Sheets(a).Select ' on resélectionne notre fiche de travail

      Call UserForm_Initialize 'On re initialise le formulaire


      End Sub


      En tout cas MERCI beaucoup! Vous m'avez bien aidé!!
      0
    2. Julien
       
      ReBonjour Patrice,
      Je me permet de vous posez une question quelque peu différente quoique complémentaire.

      Lorsque j'ouvre mon formulaire en mode non-modal; j'aimerai que celui ci s'actualise à chaque fois que je sélectionne une nouvelle cellule dans mon classeur excel. Pensez vous que cela est possible?

      Je pensais utiliser quelque chose du genre :
      UserForm_KeyDown
      UserForm_KeyUp

      Mais je dois apprendre comment m'en servir.
      Si vous avez une solution simple je suis preneur.

      Encore MERCI.
      0
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > Julien
         
        Bonsoir,

        Je n'ai pas essayé mais je pense à :
        Private Sub Worksheet_Change(ByVal Target As Range)
          UserForm1.Repaint
        End Sub
        0