Insérer des n° dans les cellules avec VBA

Bonjour,
Etant un débutant, je suis un peu perdu dans mon code.
J'ai un code qui numérote dans un sens ou dans l'autre et qui fonctionne bien.
L'emplacement des n° était défini dans le UserForm1, donc quasiment fixe.
Mais je voudrai définir l'emplacement des n° en mettant n1 et n2 dans les cellules qui doivent recevoir les numéros.
J'ai bidouillé quelques lignes mais cela ne fonctionne pas et je ne sais pas vraiment quelle fonction utilisée.
Si quelqu'un pouvait m'aider, se serait sympa.
Je joins mon code.
Merci, Chgo

Private Sub CommandButton1_Click()
   
 Dim PageDe As Single, PageA As Single, p As Single
    Dim sPas As Single, sBorneMin As Single, sBorneMax As Single
    Dim celA As String, celB As String, celC As String, celD As String
    
    Dim i As String
      For i = 1 To 2
        If Range("A1:T21").Value = Cells.Value = "n1""n2" Then
  
        If TextBox1.Value <> "" And TextBox2.Value <> "" Then
          PageDe = TextBox2
          PageA = TextBox1 / 5
        
        Unload Me
        
        If CheckBox1.Value = True Then
            sBorneMin = PageDe
            sBorneMax = PageA + TextBox2 - 1
            sPas = 1
        Else
            sBorneMin = PageA + TextBox2 - 1
            sBorneMax = PageDe
            sPas = -1
        End If
        
        For p = sBorneMin To sBorneMax Step sPas
            Range("D13", Cells.Value = n1).Value = p
            Range(Cells.Value = n2).Value = p + 1 * PageA
            Worksheets("Feuil4").PrintOut
                
        Next p
        
        Range("D13").Value = 0
       End If
    
    End If
    
  Next i
 
End Sub
 
Private Sub CommandButton2_Click()
    Unload Me
End Sub
 
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1.Value <> vbNullString Then
        If CLng(TextBox1.Value) Mod 5 <> 0 Then
            MsgBox "Veuillez saisir un multiple de 5", vbCritical + vbOKOnly, "Attention..."
            Cancel = True
            TextBox1.Value = ""
            TextBox1.SetFocus
        End If
    End If
End Sub
 
Private Sub TextBox1_Change()
    Label4.Caption = 0
    If TextBox1.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox1.Value)
    If TextBox2.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox2.Value)
    Label6.Caption = 0
    If TextBox1.Value <> "" Then Label6.Caption = CDbl(TextBox1 / 5)
End Sub
 
Private Sub TextBox2_Change()
    Label4.Caption = -1
    If TextBox1.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox1.Value)
    If TextBox2.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox2.Value)
End Sub
Configuration: Windows XP
Firefox 2.0.0.9

8 réponses

  1. Le Unload décharge ton formulaire ... c'est surprenant à cet endroit ... En faisant ça tu fermes ta fenêtre...

    Ensuite j'ai relevé ça :
    Tu fais : For i = 1 to 2 ??? mais tu testes la même chose ???
    De plus dans ton premier if tu as 2 égalités ??? dont la dernière = "n1""n2" ??? si tu veux concaténer il faut le signe & ou un + ("n1" & "n2")
    Tu ne peux avoir 2 égalités ou alors il te faut un comparateur logique (And ou Or). Il y a plusieurs lignes avec la même erreur...

    Je n'ai pas testé mais à première vue ça ne peut pas marcher.

    ;o)

    Polux
    1
    1. bonjour,

      En parcourant rapidement le code j'ai relevé ceci :

      ...
      Dim i As String
      For i = 1 To 2
      If Range("A1:T21").Value = Cells.Value = "n1""n2"
      Then

      If TextBox1.Value <> "" And TextBox2.Value <> ""
      Then
      PageDe = TextBox2
      PageA = TextBox1 / 5

      Unload Me
      ...

      Dim i As String : i est de type intéger et non un string (chaine de caractère) ...

      Unload Me : Pas bon ... il faut d'abord sortir de la procédure avant de décharger le formulaire ...

      Il préférable de faire une fonction qui renvoie un booléan à partir de l'évènement click.

      ;o)

      Polux
      0
      1. Bonsoir Polux,
        Merci pour ton aide, pour Unload Me, sur une autre version du code il est à cet endroit, alors je ne comprends pas.
        Je remets le code avec des commentaires.
        Private Sub CommandButton1_Click()
        
        'définition des variables
          Dim PageDe As Single, PageA As Single, p As Single
          Dim sPas As Single, sBorneMin As Single, sBorneMax As Single
          Dim celA As String, celB As String, celC As String, celD As String
          Dim i As Integer
          
        'boucle pour la recherche des cellules à remplir
          For i = 1 To 2
            If Range("A1:T21").Value = Cells.Value = "n1""n2" Then
              
        'identification des chiffres contenu dans TextBox 1 et 2
              If TextBox1.Value <> "" And TextBox2.Value <> "" Then
                PageDe = TextBox2
                PageA = TextBox1 / 5
                Unload Me
         
        'définition du sens de numérotation (montant ou descendant)
                If CheckBox1.Value = True Then
                  sBorneMin = PageDe
                  sBorneMax = PageA + TextBox2 - 1
                  sPas = 1
                Else
                  sBorneMin = PageA + TextBox2 - 1
                  sBorneMax = PageDe
                  sPas = -1
                End If
          
         'boucle qui génère les numéros dans les cellules concernées
                For p = sBorneMin To sBorneMax Step sPas
                  Range ("D13"), i = Cells.Value = n1.Value = p
                  Range i = Cells.Value = n2.Value = p + 1 * PageA
                  Worksheets("Feuil4").PrintOut
                Next p
         
         'remise à zéro de la cellule servant au démarrage code
                Range("D13").Value = 0
              
              End If    ' TextBox1.Value <> ""And TextBox2.Value <> ""Then
            End If    ' Range("A1:T21").Value = Cells.Value = "n1""n2"Then
         Next i
        End Sub
        0
        1. bonjour Polux,
          Je voudrai utiliser la boucle For pour parcourir la plage de cellules (A1, A21), afin qu'elle trouve les cellules contenant n1 et n2. Je pensai qu'il fallait qu'elle parcoure 2 fois la plage de cellules pour trouver n1 et n2. Je n'arrive pas à exprimer cela en VBA.
          Ensuite, lorsque les n1 et n2 seront trouvés je souhaiterai que le code insère les N° générés par la formule à la place de n1 et n2.
          Merci pour ton aide et tes explications.
          Chgo
          0
          1. Bonjour,

            Je ne sais pas ce que tu cherches à faire exactement mais je ferai un truc de ce genre pour la boucle :

            Dim i As Integer
            Dim str As Variant

            With WorkSheets(1) ' Ta feuille sur laquelle tu effectues ta recherche

            For i = 1 to 21
            str = .Range("A" & i).Value
            If str = "n1" Then
            ' mettre ici le code pour le traitement à effectuer pour "n1" trouvé
            ...
            ElseIf str = "n2" Then
            ' mettre ici le code pour le traitement à effectuer pour "n2" trouvé
            ....
            End If
            Next i
            ....
            End With
            ...

            Il y a toujours le problème du Unload qui me gène un peu.

            If TextBox1.Value <> "" And TextBox2.Value <> "" Then
            PageDe = TextBox2
            PageA = TextBox1 / 5
            Unload Me
            ...


            Cette partie pourrait être traitée dans une fonction qui retourne un booléan.

            "PageA = TextBox1 / 5" ... impossible !!!
            Tu testes TextBox1.Value <> " " ... donc TextBox contient une chaine de caractères ... il est préférable d'écrire ensuite :
            PageA = Cint(TextBox1.Value) / 5
            ou alors : if TextBox1.Value <> 0 ... si la valeur saisie est de type numérique ...

            Bon courage ...

            N'hésite pas si tu as encore des blèmes.

            ;o)

            Polux
            0
            1. Bonsoir Polux,
              Je viens de lire ton message, et je te remercie pour l'attention que tu portes à mon projet de code.
              Ce que je veux faire ? c'est simplement numéroter des tickets avec souche (bourriche, tombola) en plusieurs poses sur un A4.
              Quand je parle de plusieurs poses cela veut dire 4 tickets, comportant chacun 2 N° identiques, sur un A4, est-ce que tu comprends mieux mon projet ?
              Comme je l'ai mis dans mon premier message j'ai le code qui numérote 5 tickets sur un A4, c'est pour cela que tu trouves : "PageA = TextBox1 / 5"
              lorsqu'on entre le nombre de tickets à créer dans TextBox1 il est divisé par 5 (chiffre que j'aurai dû changer)
              par exemple on veut 100 tickets le code génère : 1er ticket 1 à 20
              2e ticket 21 à 40 5 tickets sur la même feuille
              3e ticket 41 à 60 3 numéros identiques par ticket (je te mets le code plus bas)
              4e ticket 61 à 80
              5e ticket 81 à 100
              ce qui imprime 20 feuilles A4, est-ce plus clair ?

              Comme je l'ai dit précédemment ce code fonctionne bien, mais l'emplacement des N° est un peu figé puisqu'il faut accéder au code VB pour changer la position des N°.

              Donc, je cherche une solution pour pouvoir changer l'emplacement des N° sans aller dans VB et en mettant simplement, par exemple, n1 dans 2 cellules pour le premier ticket, puis n2 dans deux autres cellules pour le deuxième ticket et ainsi de suite, d'où la boucle pour la plage A1:T21 qui recherche n1, n2, n3, n4 (je viens de voir que dans mon précédent message j'ai mis A1:A21, ce qui n'est pas bon)
              Je te mets le code qui fonctionne avec 5 tickets et les cellules fixes qui reçoivent les N°. Je pense que cela t'aideras à comprendre ce que je veux faire.
              Encore merci, Chgo

              Private Sub CommandButton1_Click()
                  Dim PageDe As Single, PageA As Single, p As Single
                  Dim sPas As Single, sBorneMin As Single, sBorneMax As Single
                  
                  If TextBox1.Value <> "" And TextBox2.Value <> "" Then
                      PageDe = TextBox2
                      PageA = TextBox1 / 5
                      
                      Unload Me
                      
                      If CheckBox1.Value = True Then
                          sBorneMin = PageDe
                          sBorneMax = PageA + TextBox2 - 1
                          sPas = 1
                      Else
                          sBorneMin = PageA + TextBox2 - 1
                          sBorneMax = PageDe
                          sPas = -1
                      End If
                      
                      For p = sBorneMin To sBorneMax Step sPas
                          Range("E10,M10,T10").Value = p
                          Range("E21,M21,T21").Value = p + 1 * PageA
                          Range("E32,M32,T32").Value = p + 2 * PageA
                          Range("E43,M43,T43").Value = p + 3 * PageA
                          Range("E54,M54,T54").Value = p + 4 * PageA
                          Worksheets("Feuil4").PrintOut
                              
                      Next p
                      Range("E10").Value = 0
                  End If
              End Sub
              
              Private Sub CommandButton2_Click()
                  Unload Me
              End Sub
              
              
              Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
                  If TextBox1.Value <> vbNullString Then
                      If CLng(TextBox1.Value) Mod 5 <> 0 Then
                          MsgBox "Veuillez saisir un multiple de 5", vbCritical + vbOKOnly, "Attention..."
                          Cancel = True
                          TextBox1.Value = ""
                          TextBox1.SetFocus
                      End If
                  End If
              End Sub
              
              Private Sub TextBox1_Change()
                  Label4.Caption = 0
                  If TextBox1.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox1.Value)
                  If TextBox2.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox2.Value)
                  Label6.Caption = 0
                  If TextBox1.Value <> "" Then Label6.Caption = CDbl(TextBox1 / 5)
              End Sub
              
              Private Sub TextBox2_Change()
                  Label4.Caption = -1
                  If TextBox1.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox1.Value)
                  If TextBox2.Value <> "" Then Label4.Caption = Label4.Caption + CLng(TextBox2.Value)
              End Sub
              
              
              
              0
              1. Bonsoir à tous et à Polux,
                Je suis toujours dans mes N°, j'essaie de faire une boucle For et j'ai une erreur qui apparait dans la ligne : If str = "n1" And std = "n2" Then,
                voici le bout de code :
                'boucle pour la recherche des cellules à remplir
                  For i = 1 To 420
                         str = Range("A1:T21" & i).Value
                         std = Range("A1:T21" & i).Value
                      If str = "n1" And std = "n2" Then

                Encore une fois un peu d'aide serait bienvenue.
                Merci, Chgo
                0
                1. Bonsoir,

                  Désolé, je n'ai pas eu le temps de me pencher sur le problème ... il faudrait me faire passer le fichier Excel pour que je puisse voir exactement comment tout ça s'articule ... il y a un lien mais je ne le connais pas ... :o(

                  Pour le post 7 ... la syntaxe est incorrecte ... ça ne marche pas comme ça ...

                  Dès que j'ai le fichier, je jete un oeil et je retourne mes propistions.

                  ;o)

                  Polux
                  0