Reinitialisation Userform

Résolu
GermPeru Messages postés 175 Statut Membre -  
GermPeru Messages postés 175 Statut Membre -
Bonjour a tous,

Mon probleme du jour est le suivant, au travers dúne macro je charge les données dúne feuille dans differente txtbox d´un USF, ces derniere se créé automatiquement; je passe par une maccro et pas a l'initialisation de l´usf pour créer et charger les valeur ds mes txtbox.
Lútilisateur a la possibilité dájouté des données dans la feuille source et dans ce cas je repasse par ma maccro de chargement des données et j'actualise ainsi mon usf.

Mon soucis est que ensuite je fais des calculs avec des données issu de mon usf, mais en cas de reinitialisation de mon usf je nárrive plus a recuperer les données de mes textbox. Un message dérreur míndique que les types ne coincide pas..

J´ai bien essayé des repaint dans mon code sans succés, et je ne peux pas unloader mon usf pour le relancer car a la fermeture je supprime les données de la feuille source...

Je ne sais pas si je suis trés clair dans mes explications mais je vous remercie d´avance pour vos sages conseils.

6 réponses

  1. GermPeru Messages postés 175 Statut Membre
     
    Le probleme peut venir du fait du point et de la virgule, pb de compatibilité avec le clavier espagnol et excel en anglais... Je dois configurer l´affichage... Mais l´erreurde compatibilité continue ...
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Je pense devoir utiliser un control.remove car il doit il y avoir ambiguité pcq j´ai utilisé deux fois les memes noms ... Je pensais qu´en appelant une nouvelle fois ma sub de création dynamique de textbox, ca allait écraser les anciens noms mais ca n´a pas l´air d´etre le cas.... Qulequún pourrait m´en dire ce qu´il en pense ?
      0
    2. GermPeru Messages postés 175 Statut Membre
       
      J´allimente ls discussion au fil de mes essais sns succes
      J' ai créé une autre sub pour effacer le nom de mes txtbox avant rechargement des données mais j´ai tjs la meme erreur au meme endroit..

      Partie du code poour effacer les noms
      For Each Ctrl In USFEt.Controls
          If TypeName(Ctrl) = "TxtFrac" Then
              For j = 2 To Nblignes
                  If Ctrl.Name = "TxtFrac" & j Then
                      USFEt.Controls.Remove Ctrl.Name
                  End If
              Next j
          End If
      Next Ctrl


      Partie du code avec erreur:
      FraC = Ctrl.Value


      Je pense aue l´erreur est sur le ctrl.value....mais le pourquoi je ne sais pas....

      Un petit coup de main SVP
      0
  2. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    Bonjour,

    La partie de code fournie n'efface pas les noms mais supprime les contrôles TextBox. Difficile après d'obtenir une valeur pour le contrôle disparu...
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Rebonjour Thev,

      Lorsque je n´ai pas de reinitialisation de mon userform j´arrive a récuperer mes valeur de mes text box, et faire mes calculs; mais en cas de reinitialisation cela ne fonctionne plus. Je pensais que le probleme venait du fait que j´utilisais deux fois le meme nom.

      Ce que je pensais faire cést effacer les noms des controles ou les controles et les reinitialiser avec les nouvelles données.

      Je ne sais pas si j´arrive a bien m´expliquer....

      Merci pour ton aide Thev
      0
  3. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    Bonsoir,

    A priori, si ton UserForm est réinitialisé, cela signifie que tu as passé au préalable une instruction du type : "Unload  USFEt" et donc supprimé les contrôles "TextBox" créés dynamiquement.
    Une instruction du type "USFEt.Hide" masquera ton formulaire tout en conservant les données.
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Justement non je ne peux pas le unloader, car en ce cas est supprimé la feuille source.
      Dans ma conception cést: lútilisateur rentre un N°, ce N° correnpond a un tableau excel dans une base données, je charge les données dans une nouvelle feuille de mon classeur. Mon usf travail a partir de ces données nouvellement chargées et quand je ferme mon usf je supprime cette feuille. Je ne sais pas si c´est la conception est bonne... car maintenant je suis un peu bloquer car j´ai une nouvelle contrainte qui est que lútilisateur peut rajouter des données dans la feuilles et donc je dois réinitialiser mon USF sans le unloader....
      Je pensais aussi le unloader mais peut pas selon ma conception. Je pensais quíl existait peut etre une parade pour effacer les données sans unloader? Car je pense que vient de la mon erreur...
      0
  4. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    L'utilisation classique d'un formulaire, c'est de saisir ou mettre à jour des données qui restent stockées dans une feuille.
    Ce que tu as l'air de dire, c 'est que la feuille contenant les données présentes dans ton formulaire, est supprimée après fermeture ou masquage du formulaire.
    Je pense qu'un exemple matérialisé par un classeur joint, serait nécessaire pour illustrer ton propos.
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Je ne peux pas fournir le classeur tel quel, mais je vais essayer détre le plus pertinent possible dans les bouts de code.
      Ps: je ne voudrais pas choquer les puristes par mon écriture de code... J´apprends sur le tas et en me confrontant aux problemes

      Affichage de mon USF, au travers dúne inputbox pour chercher un code produit et verifier s´il existe

      Sub ShUSFEt()
      Dim MaRep As String
      Dim Feuille As Worksheet, i As Integer, Nblignes As Integer
          MaRep = InputBox("Introduzca N° de lote:", "Impresión etiqueta de dispensación")
          If MaRep <> "" Then
          Abrir MaRep
              If Sheets(2).Name = MaRep Then
              Nblignes = Application.WorksheetFunction.CountA(Sheets(2).Range("$A:$A"))
              For i = 2 To Nblignes
                  Cells(i, 1) = "1"
              Next i
              USFEt.Show
              Set Feuille = Nothing
              End If
          Else
          MsgBox "Ingresar N° de lote", vbInformation, "Falta dato"
          End If
      End Sub


      Je consulte une base de données qui me permet de voir si mon code produit existe, dans ce cas je procede a ma maccro Abrir qui va alors copier les données créer unefeuille, coller les données et fermer le fichier originel.

      Sub Abrir(ByRef MaRep As String)
      Application.ScreenUpdating = False
      Dim Chemin As String, FichierMaRep As String, FichierActuel As String
      Dim Classeur As Workbook
      Chemin = "C:\Users\user\Desktop\lotes\"
      On Error GoTo NoExiste
      FichierActuel = ActiveWorkbook.Name
      FichierMaRep = Chemin & MaRep & ".xls"
      Workbooks.Open FichierMaRep, 0, False, Password:="Dispensacion"
      FichierMaRep = ActiveWorkbook.Name
      Workbooks(FichierMaRep).Sheets(1).Copy After:=Workbooks(FichierActuel).Sheets(1)
      Workbooks(FichierMaRep).Close False
      Exit Sub
      NoExiste:
      MsgBox "          El N° de lote introducido no existe." & Chr(10) & Chr(10) & "Asegurarse que el N° de lote está bien registrado.", vbCritical
      End Sub
      


      Ensuite a l´initialisation de mon USF:
      Private Sub UserForm_Initialize()
      ' je charge des données ..
      ' et je creér de manier dynamique mes chkbox au nb de 2 et txt box au nb de 15 au travers de ma maccro init
      Init
      End Sub
      


      Maccro init pour la création dynamique de mes txtbox et chkbox, il n ´y a pas de grande pertinence de mettre toutes les txtbox car elles ont chacune des tailles ou specificité particuliere; ce n´est pas la meilleure facon de faire mais a l´epoque je ne connaissais pas le dictionnaire et donc j´ai proceder avec la classe collection... Je tiens a préciser que je ne metrise pas la classe dictionnaire meme si j´ai eu de tres bonnes explications!

      Sub Init()
      Dim Obj As Control
      Dim Cl As Clase1
      Dim i As Integer, Nblignes As Integer
      Dim ctrlNumBox As Control
       Nblignes = Application.WorksheetFunction.CountA(Sheets(2).Range("$A:$A"))
          
      Set CollectChk = New Collection
      For i = 2 To Nblignes
      USFEt.Repaint
      Set Obj = USFEt.Controls.Add("forms.checkbox.1")
          With Obj
          .Name = "ChkA" & i
          .Left = 7
          .Top = 22 * i + 4
          .Width = 22
          .Height = 16
          End With
          
          Set Cl = New Clase1
          Set Cl.ChkBox = Obj
          CollectChk.Add Cl
      
      Set Obj = USFEt.Controls.Add("forms.checkbox.1")
          With Obj
          .Name = "ChkC" & i
          .Left = 29
          .Top = 22 * i + 4
          .Width = 22
          .Height = 16
          If Cells(i, 1) = "0" Then
          .Value = True
          .Enabled = False
          End If
          End With
      
          Set Cl = New Clase1
          Set Cl.ChkBox = Obj
          CollectChk.Add Cl
      Next i
      
      Set CollectTxt = New Collection
      For i = 2 To Nblignes
      USFEt.Repaint
      USFEt.Height = 70 + 22 * i
      ' 1 N° de lignes
      ' 6 cantidad practica mat pemiere
      Set Obj = USFEt.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtCantPract" & i
              .Object.Value = Sheets(2).Range("N" & i)
              .Left = 493
              .Top = 22 * i + 4
              .Width = 61
              .Height = 16
              .TextAlign = fmTextAlignCenter
              .Enabled = False
              With .Font
              .Name = "Tahoma"
              .Size = 8
              End With
          End With
          Set Cl = New Clase1
          Set Cl.textbox = Obj
          CollectTxt.Add Cl
      ' 8 fraccion de chaque mat prim
      Set Obj = USFEt.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtFrac" & i
              .Left = 592
              .Top = 22 * i + 4
              .Width = 43
              .Height = 16
              .BackColor = RGB(180, 205, 205)
              .Tag = "1"
              With .Font
              .Name = "Tahoma"
              .Size = 8
              End With
          End With
          Set Cl = New Clase1
          Set Cl.textbox = Obj
          CollectTxt.Add Cl
      ' 9 selladas de chaque mat prim
      Set Obj = USFEt.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtSellada" & i
              .Left = 637
              .Top = 22 * i + 4
              .Width = 49
              .Height = 16
              .BackColor = RGB(180, 205, 205)
              .Tag = "1"
              With .Font
              .Name = "Tahoma"
              .Size = 8
              End With
          End With
          Set Cl = New Clase1
          Set Cl.textbox = Obj
          CollectTxt.Add Cl
      'ajout d une derniere txt pour le calcul total des etiquetas
      If i = Nblignes Then
      Set Obj = USFEt.Controls.Add("forms.textbox.1")
          With Obj
              .Name = "TxtEtTot"
              .Left = 955
              .Top = 22 * (Nblignes + 1) + 4
              .Width = 49
              .Height = 16
              .Visible = False
              .BackColor = RGB(127, 255, 0)
              .Tag = "3"
              .TextAlign = fmTextAlignCenter
              With .Font
              .Name = "Tahoma"
              .Size = 9
              End With
          End With
      End If
      'ajout de l'objet dans la classe
       Set Cl = New Clase1
          Set Cl.textbox = Obj
          CollectTxt.Add Cl
      Next i
      'limitation valeur numerique de mes txtbox
      For Each ctrlNumBox In USFEt.Controls
           If TypeOf ctrlNumBox Is MSForms.textbox Then
               Select Case ctrlNumBox.Tag
                  Case Is = "1", Is = "2"
                      T = T + 1
                      ReDim Preserve TNumBox(1 To T)
                      Set TNumBox(T).NumBox = ctrlNumBox
              End Select
           End If
      Next ctrlNumBox
      End Sub


      Donc a l´initialisation de mon usf je charge les données des txtboxs depuis ma feuille(2). J´ai laissé que le code de 3 txtboxs, une qui charge les données depuis la feuille 2 et les autres que l´utilisateur enregistre. Ceci me permettant de faire des calculs.

      Avant ca sur mes chkbox j´ai un evenement dans un module de classe qui est le suivant:
      With ChkBox
          For i = 2 To Nblignes
              If .Name Like "ChkC" & i Then
                  If .Value = True Then
                  On Error GoTo ValeurNum
                  StrRep = InputBox("Nombre de fraccionamiento?", "Caso de fracionamiento irregular")
                      If StrRep > 1 Then
                          CantTher = Cells(i, 13)
                          Cells(i, 1).EntireRow.Copy
                              For j = 1 To StrRep
                                  Cells(Nblignes + j, 1).EntireRow.Select
                                  ActiveCell.PasteSpecial (xlPasteValuesAndNumberFormats)
                                  CtFrac = InputBox("Cantidad del primer fracionamiento" & Chr(10) & Cells(Nblignes + j, 10), "Caso de fracionamiento irregular")
                                  Cells(Nblignes + j, 14) = CtFrac
                              Next j
                          Cells(i, 1).EntireRow.Delete
                          Application.ScreenUpdating = False
                      ' a cet endroit j' ai essayé de effacer les noms de mes anciennes txtbox anavant de rappeler la nouvelle initialisation de mon USF....
                          Init
                      End If
                   End If
              End If
          Next i
          End With
      Exit Sub
      ValeurNum:
      MsgBox "Solemente se puede ingresar cifras superior a 0", vbInformation, "Mensaje informmativo"


      Ce qui permet au final a lútilisateur de copier n fois une certaine ligne de la feuille et de renseigner lui meme certaines données pour les calculs...

      Et enfin mes calculs... Alors la c´est du grand free style, je m´en excuse d´avance, ce n´est pas propre mais ca fonctionne ... Je le laisse complet car je suis ouvert a toute forme d´optimisation !!!
      Mon message dérreur survient lorsquíl cherche la premiere valeur de ma txtbox frac et que lorsque je suis passé par une réinitialisation de mon usf...

      Private Sub CmdCalc_Click()
      Dim i As Integer, Nblignes As Integer
      Dim Ctrl As Control
      Dim CT As Double, FraC As Integer, SelL As Double, FracSell As Byte
      Dim CPR As Double, CPIR As Double
      Dim FPR As Byte, FPIR As Byte, ET As Byte, ETtot As Byte
      Dim Compteur As Byte, Verif As Double, VerifTot As Double, VerifTher As Double
      Dim Reponse As String, PbLlenar As String, PbLlenar2 As String
      'On Error GoTo PbLlenar
      Nblignes = Application.WorksheetFunction.CountA(Sheets(2).Range("$A:$A"))
      Me.Repaint
      If ChkMod = False Then
      'compteur de clik
      Range("Y1").Value = Range("Y1").Value + 1
      '1er tour de boucle
      For i = 2 To Nblignes
      'On Error GoTo PbLlenar
      CT = Format(Cells(i, 14), "0.000")
        If Cells(i, 13).Value = CT Then
          For Each Ctrl In Me.Controls
              If Ctrl.Name Like "TxtFrac" & i Then
      '***************************************************************************'
      'mon message dérreur apparait a ce niveu avec msg de pb de 
      'Les types ne coincide pas
              FraC = Ctrl.Value
      '********************************************************
              Cells(i, 17).Value = FraC
              ElseIf Ctrl.Name Like "TxtSellada" & i Then
              SelL = Ctrl.Value
              Cells(i, 18).Value = SelL
              ElseIf Ctrl.Name Like "TxtCantSell" & i Then
              Cells(i, 19).Value = selladas(CT, FraC, SelL)
              FracSell = Cells(i, 19).Value
              Ctrl.Value = FracSell
              ElseIf Ctrl.Name Like "TxtCantPuchReg" & i Then
              Cells(i, 20).Value = Format(CantPuchoReg(CT, FraC, FracSell, SelL), "0.000")
              CPR = Cells(i, 20).Value
              Ctrl.Value = CPR
              ElseIf Ctrl.Name Like "TxtCantPuchIReg" & i Then
              Cells(i, 22).Value = Format(CantPuchoIReg(CT, FraC, SelL), "0.000")
              CPIR = Cells(i, 22).Value
              Ctrl.Value = CPIR
              End If
          Next Ctrl
         End If
      Next
      '2ieme tour de boucle pour calcul
      For i = 2 To Nblignes
      'On Error GoTo PbLlenar
      CT = Format(Cells(i, 14), "0.000")
        If Cells(i, 13).Value = CT Then
          For Each Ctrl In Me.Controls
              If Ctrl.Name Like "TxtPuchReg" & i Then
              Cells(i, 21).Value = FracPuchoReg(Cells(i, 20), Cells(i, 17))
              FPR = Cells(i, 21).Value
              Ctrl.Value = FPR
              ElseIf Ctrl.Name Like "TxtPuchIReg" & i Then
              Cells(i, 23) = FracPuchoIReg(Cells(i, 22), Cells(i, 17))
              FPIR = Cells(i, 23).Value
              Ctrl.Value = FPIR
              End If
          Next Ctrl
        End If
      Next
      'condition si le calcul a deja été effectué
      If Range("Y1").Value > 1 Then
      Reponse = MsgBox("Desea recalcular?" & Chr(10) & Chr(10) & "En caso de varias fracciones y varios N° de lote del mismo producto, se debe llenar los campos manuelmente", vbYesNo, "Confirmación")
          If Reponse = vbYes Then
          For i = 2 To Nblignes
      '    On Error GoTo PbLlenar2
          CT = Format(Cells(i, 14), "0.000")
              If Cells(i, 13).Value <> CT Then
                  For Each Ctrl In Me.Controls
                      If Ctrl.Name Like "TxtFrac" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 17).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtSellada" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 18).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtCantSell" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 19).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtCantPuchReg" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 20).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtPuchReg" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 21).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtCantPuchIReg" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 22).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                      ElseIf Ctrl.Name Like "TxtPuchIReg" & i Then
                          If Ctrl.Value <> "" Then
                          Cells(i, 23).Value = Ctrl.Value
                          Else
                          GoTo PbLlenar2
                          End If
                     End If
                  Next Ctrl
              End If
          Next
          ElseIf Reponse = vbNo Then
          Exit Sub
          End If
      End If
      
      For i = 2 To Nblignes
      'On Error GoTo PbLlenar
      CT = Format(Cells(i, 14), "0.000")
          For Each Ctrl In Me.Controls
              If Ctrl.Name Like "TxtEt" & i Then
              'calcul de la qtté tot d´etiquettes
              Cells(i, 24).Value = Cells(i, 19) + Cells(i, 21) + Cells(i, 23)
              ET = Cells(i, 24)
              Ctrl.Value = ET
              ETtot = ETtot + ET
              'calcul de la somme de poids selon fraccionement
              Verif = Format(Cells(i, 18) * Cells(i, 19) + Cells(i, 20) * Cells(i, 21) + Cells(i, 22) * Cells(i, 23), "0.000")
              Cells(i, 25) = Verif
              'verif
                  If Cells(i, 14).Value = Cells(i, 25) Then
                  Ctrl.BackColor = RGB(0, 205, 0)
                  Else
                  Ctrl.BackColor = RGB(255, 69, 0)
                  End If
              VerifTot = VerifTot + Verif
              'calcul somme des poids theorique
              VerifTher = VerifTher + Cells(i, 14)
              ElseIf Ctrl.Name Like "TxtEtTot" Then
              Cells(i + 1, 24).Value = ETtot
              Ctrl.Value = ETtot
              Cells(i + 1, 25) = VerifTher
              Cells(i + 1, 26) = VerifTot
              End If
          Next Ctrl
      Next
      End If
      
      For Each Ctrl In Me.Controls
            Select Case Ctrl.Tag
                  Case Is = "2", Is = "3"
                      Ctrl.Visible = True
            End Select
      Next Ctrl
      
      Exit Sub
      PbLlenar2:
      MsgBox "En caso de varias fracciones y varios N° de lote del mismo producto" & Chr(10) & "Llenar los campos manualmente", 32, "Mensaje Innformativo"
      Exit Sub
      PbLlenar:
      MsgBox "Llenar todos los campos", 16, "Mensaje de error"
      Exit Sub
      PbLlenarModA:
      MsgBox "Modula A no esta bien llenado", 16, "Mensaje de error"
      End Sub


      Je ne sais pas si quelquún va lire jusqu´a la fin mais je le felicite pour sa perseverance et sa determination! Et je m´excuse pour le mal de tete que j´ai pu occasionné par mon "style" d´ecriture de code!

      Merci pour l´aide, je suis presque a la fin de mon projet et il ne me manque que cette partie pour faire mes essais!
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
     
    Bonjour,

    Je t'avais laissé avec un exemple d'Userform qui utilisais une ListBox multicolonnes plutôt qu'une multitude de textbox créés dynamiquement.
    Qu'as tu fait de mon exemple?

    Si tu l'avais conservé, il n'y avait rien de plus simple pour vider et remplir tes contrôles.
    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Bonjour Pijaku,

      Lors de la conception de ma maccro l´utilisateur n´avait la possibilité de changer les valeur dans un cas seulement, maintenant avec ma nouvelle contrainte, l´utilisateur doit pouvoir ajouter ou mdifier les valeurs dans tous les cas . Donc si dans l´heure qui suit je n' arrive a arranger mes problemes. Je vais repartir non pas de zero mais avec la conception listbox; qui me permetra de rajouter/supprimer des lignes sans avoir besoi de réinitialiser le code. Concernant ton code avec list box je l´ai bien sur garder précieusement.

      Merci
      0
    2. GermPeru Messages postés 175 Statut Membre
       
      Je m' avoue vaincu avec les textbox et je repars avec ton idée de listbox et repenser la conception... affichage, impression, calcul.... J´en ai pour un petit moment.
      0
  7. thev Messages postés 2005 Date d'inscription   Statut Membre Dernière intervention   721
     
    Bonjour,

    '***************************************************************************'
    'mon message dérreur apparait a ce niveu avec msg de pb de
    'Les types ne coincide pas
    FraC = Ctrl.Value
    '********************************************************

    "Ctr.value" est une TextBox remplie par l'utilisateur. C'est donc a priori du caractère. "FraC" est de type nombre entier. Il faut donc faire une conversion
    FraC = Val(Ctrl.Value)

    0
    1. GermPeru Messages postés 175 Statut Membre
       
      Cela ne fonctionne malheureusement dans le cas ou je rajoute des lignes dans mon classeur; je pense que je dois unloader mon usf et le relancer; il y aurait bien la bidouillle de copier les données dans une nouvelle feuille et relancer mon usf depuis cette feuille... Ca fait vraiment bidouille. si je ne trouve pas mieux je vais repenser la conception depuis le debut avec la notion de listbox et non pas de txtbox comme me la suggérer Pijaku....
      0