Insérer des n° dans les cellules avec VBA

Chgo -  
Polux31 Messages postés 7219 Statut Membre -
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. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  3. naitgo Messages postés 5 Date d'inscription   Statut Membre
     
    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
  4. naitgo Messages postés 5 Date d'inscription   Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  7. naitgo Messages postés 5 Date d'inscription   Statut Membre
     
    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
  8. naitgo Messages postés 5 Date d'inscription   Statut Membre
     
    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
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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