Erreur de compatibilité de type (vba)

Résolu
Bonjour, voici mon code qui a pour but lorsque qu'une commande est faite d'aller chercher dans la feuille stock si la référence de la pièce achetée existe déjà. Si oui, je veux qu'elle incrémente juste la quantité achetée avec la quantité en stock, sinon elle crée une nouvelle ligne dans la feuille stock.
Je ne suis pas sur de mon code, mais cela à part j'ai un problème de compatibilité de type qui apparait sur la ligne "cherche = TextBox_référence_pièce.Value". Pourtant "cherche"est déclaré et, dans un autre useform, fonctionne parfaitement avec cette synthaxe. Je suis donc pommé...

no_ligne1 As Integer, x As Integer, cherche As Integer , machine as string

no_ligne1 = Worksheets("stock").Range("e65536").End(xlUp).Row + 1 

'si la référence existe déjà sur la feuille stock alors on change juste la quantité en stock         
         
         
        With Range("g12:g65536") 
            cherche = TextBox_référence_pièce.Value 
            x = .Columns("G").Find(What:=cherche, after:=.Range("G12"), LookIn:=xlValues).Row 
             
        If Worksheets("stock").Range("G").Value = TextBox_référence_pièce.Value Then 
            Worksheets("stock").Cells(x, 8) = Worksheets("stock").Cells(x, 8).Value + TextBox_quantité.Value 
                 
            'sinon on crée une nouvelle ligne pour le nouvel article mis en stock 
            Else 
            Worksheets("stock").Cells(no_ligne1, 5) = machine 
            Worksheets("stock").Cells(no_ligne1, 6) = TextBox_nom_pièce.Value 
            Worksheets("stock").Cells(no_ligne1, 7) = TextBox_référence_pièce.Value 
            Worksheets("stock").Cells(no_ligne1, 8) = TextBox_quantité.Value 
         
        End If 
        End With

9 réponses

  1. Bonjour,

    With Range("g12:g65536")

    Definir l'onglet

    With Worksheets("stock").Range("g12:g65536")
    0
    1. merci d'avoir répondu cependant malgrès la modification, toujours le même problème, même intitulé et même ligne
      0
      1. Bonjour,

        Provisoirement mettez

        Worksheets("stock").Activate avant

        With Worksheets("stock").Range("g12:g65536") et enlever le point devant Columns et Range("G12" )

        Je retrouverai peut-etre ce que j'avais fait avant pour que cela marche.
        0
        1. Avec Worksheets("stock").Activate avant , toujours même souci

          en enlevant seulment le point devant columns, même souci
          en enlevant seulment le point devant range, même souci
          en enlevant le point devant les 2, même souci
          en enlevant le point devant les 2 et en mettant Worksheets("stock").Activate , même souci

          si vous avez essayé et que cela fonctionner chez vous, je pense alors que mon souci viens d'une ligne de code antérieur à ce que je vous ai montré bien que le bug s'effectue sur la ligne
          cherche = TextBox_référence_pièce.Value 
          


          voici donc mon code entier :

          Private Sub CommandButton_terminer_Click()
          'Coloration des Labels en noir
              
              Label_nom_pièce.ForeColor = RGB(0, 0, 0)
              Label_référence_pièce.ForeColor = RGB(0, 0, 0)
              Label_fournisseur_pièce.ForeColor = RGB(0, 0, 0)
              Label_prix_unitaire_pièce.ForeColor = RGB(0, 0, 0)
              Label_tel.ForeColor = RGB(0, 0, 0)
              Label_date.ForeColor = RGB(0, 0, 0)
              Label_quantité.ForeColor = RGB(0, 0, 0)
              
          
              'Contrôles de contenu
              If TextBox_nom_pièce.Value = "" Then 'SI pas de "pièce" ...
                  Label_nom_pièce.ForeColor = RGB(255, 0, 0) 'Label "nom pièce" en rouge
              ElseIf TextBox_quantité.Value = "" Then
                  Label_quantité.ForeColor = RGB(255, 0, 0)
              ElseIf TextBox_date1.Value = "" Or TextBox_date2.Value = "" Or TextBox_date3.Value = "" Then
                  Label_date.ForeColor = RGB(255, 0, 0)
              Else
                  'Si le formulaire est complet, on insère les valeurs sur la feuille
                  Dim no_ligne As Integer, no_ligne1 As Integer, x As Integer, cherche As Integer, machine As String
                  
                  'Choix de la machine
                  For Each bouton_machine In Frame_machine.Controls
                      If bouton_machine.Value Then
                          machine = bouton_machine.Caption
                      End If
                  Next
                   
                  'no_ligne = N° de ligne de la dernière cellule non vide de la colonne +1
                  no_ligne = Worksheets("commandes pièces").Range("D65536").End(xlUp).Row + 1
                  no_ligne1 = Worksheets("stock").Range("E65536").End(xlUp).Row + 1
              
              'Insertion des valeurs sur la feuille
                  Worksheets("commandes pièces").Cells(no_ligne, 4) = machine
                  Worksheets("commandes pièces").Cells(no_ligne, 5) = TextBox_nom_pièce.Value
                  Worksheets("commandes pièces").Cells(no_ligne, 6) = TextBox_référence_pièce.Value
                  Worksheets("commandes pièces").Cells(no_ligne, 7) = ComboBox_fournisseur_pièce.Value
                  Worksheets("commandes pièces").Cells(no_ligne, 8) = TextBox_prix_unitaire_pièce.Value & "€"
                  Worksheets("commandes pièces").Cells(no_ligne, 10) = TextBox_tel.Value
                  Worksheets("commandes pièces").Cells(no_ligne, 11) = TextBox_date1.Value & "/" & TextBox_date2.Value & "/" & TextBox_date3.Value
                  Worksheets("commandes pièces").Cells(no_ligne, 12) = TextBox_quantité.Value
                  
                  'si la référence existe déjà sur la feuille stock alors on change juste la quantité en stock
                  
                  
                  
                  With Worksheets("stock").Range("G12:G65536")
                      cherche = TextBox_référence_pièce.Value
                      x = .Columns("G").Find(What:=cherche, after:=.Range("G12"), LookIn:=xlValues).Row
                      
                  If Worksheets("stock").Range("G").Value = TextBox_référence_pièce.Value Then
                      Worksheets("stock").Cells(x, 8) = Worksheets("stock").Cells(x, 8).Value + TextBox_quantité.Value
                          
                      'sinon on crée une nouvelle ligne pour le nouvel article mis en stock
                      Else
                      Worksheets("stock").Cells(no_ligne1, 5) = machine
                      Worksheets("stock").Cells(no_ligne1, 6) = TextBox_nom_pièce.Value
                      Worksheets("stock").Cells(no_ligne1, 7) = TextBox_référence_pièce.Value
                      Worksheets("stock").Cells(no_ligne1, 8) = TextBox_quantité.Value
                  
                  End If
                  End With
                
                  
                  'Après insertion, on remet les valeurs initiales
                  OptionButton_polymab.Value = True
                  TextBox_nom_pièce = ""
                  TextBox_référence_pièce.Value = ""
                  ComboBox_fournisseur_pièce.ListIndex = -1
                  TextBox_prix_unitaire_pièce.Value = ""
                  TextBox_tel.Value = ""
                  TextBox_date1.Value = ""
                  TextBox_date2.Value = ""
                  TextBox_date3.Value = ""
                  TextBox_quantité.Value = ""
                  
             End If
              Unload Me
          End Sub
          0
          1. Bonjour,

            cherche = CInt(TextBox_référence_pièce.Value)
            


            Cdt

            Lupin
            0
            1. Re,

              code de remplacement pour recherche

              'si la référence existe déjà sur la feuille stock alors on change juste la quantité en stock
              cherche = TextBox_référence_pièce.Value
              With Worksheets("stock").Range("G12:G65536")
              Set c = .Find(cherche, LookIn:=xlValues)
              If Not c Is Nothing Then
              'adresse ex: $G$23
              firstAddress = c.Address
              'Ligne
              x = c.Row
              'Majour Stock
              Worksheets("stock").Cells(x, 8) = Worksheets("stock").Cells(x, 8).Value + TextBox_quantité.Value

              Else
              'sinon on crée une nouvelle ligne pour le nouvel article mis en stock
              Worksheets("stock").Cells(no_ligne1, 5) = machine
              Worksheets("stock").Cells(no_ligne1, 6) = TextBox_nom_pièce.Value
              Worksheets("stock").Cells(no_ligne1, 7) = TextBox_référence_pièce.Value
              Worksheets("stock").Cells(no_ligne1, 8) = TextBox_quantité.Value
              End If
              End With
              0
              1. Bonjours, je vous remercie tout 2 pour vos réponses. J'ai testé vos 2 solutions mais elles ne fonctionnaient pas, puis j'ai changé ma variable " cherche" en "cherche1" parce que j'utilisais cette même variable dans un autre useform. Depuis ça a fonctionné (durant quelques instants...), lors de cette modif j'étais dans la configuration de synthaxe de f894009 et donc votre code est bon. Je n'ai pas testé le mien, ni la modif de Lupin avec le changement de nom de "cherche".
                J'ai effetcué l'opération 2 fois, cela fonctionnait très bien, quelques minutes plus tard => paf même erreur...
                0
                1. Ah j'ai compris le "pourquoi cela fonctionnais et pourquoi plus"
                  Si j'entre une référence qui existe bien, il m'incrémente mais si elle n'existe pas, il bug sur "cherche".
                  0
                  1. Modérateur
                    Bonjour tout le monde.

                    Vous avez tous raison, mais ce qu'il manque à remy c'est juste quelques petites explications.

                    Pour éviter le "bug" sur la recherche, il convient de rechercher l'objet Range relatif à votre recherche, au lieu de chercher le numéro de la ligne. Cela permet également de tester son existence et donc de renvoyer un message à l'utilisateur si la recherche est infructueuse.
                    Il vous faut donc remplacer :
                    Dim cherche As Integer, x As Long
                    cherche = TextBox_référence_pièce.Value
                                x = .Columns("G").Find(What:=cherche, after:=.Range("G12"), LookIn:=xlValues).Row

                    Par :
                     Dim cherche As Integer, RngTrouve As Range, x As Long
                    cherche = TextBox_référence_pièce.Value
                    Set RngTrouve = .Columns("G").Find(What:=cherche, after:=.Range("G12"), LookIn:=xlValues)
                    If RngTrouve Is Nothing Then
                        MsgBox "Référence non valide"
                    Else
                        x = RngTrouve.Row
                    End If
                    Set RngTrouve = Nothing


                    D'autres petites erreurs parsèment ton code :
                    1- Comme souligné par Lupin, un TextBox renvoie un "string". cherche, dans ton code est déclaré As Integer. Par conséquent, cherche = TextboxMachin.Value n'est pas correct. A remplacer par : cherche = CInt(TextboxMachin.Value)

                    2- Tu cherches le numéro d'une ligne entre la ligne 12 et la ligne 65536. Cela pose deux problèmes :
                    - à partir de la ligne 32768, ton code va bugger si tu déclares ta variable As Integer, ce type de variable étant limité à 32767. Par conséquent, il te faut penser à l'évolution de ton classeur en déclarant tes variables numériques As Long. de plus, cela ne prends pas plus de place en mémoire (enfin si mais avec les mémoires dont on dispose c'est infinitésimal comme différence) et donc l'exécution de ton code n'en sera pas ralentie.
                    - la portabilité de ton code sur une version 2007. Excel est moins limité en lignes dans ces versions récentes (>2007). Il convient donc d'en étudier les possibilités. La dernière ligne d'une colonne (ici A) peut être exprimée comme ceci :
                    Dim DernLigne As Long 
                    DernLigne = Range("A" & Rows.Count).End(xlUp).Row


                    3- lorsque tu recherches une valeur numérique (ce qui semble être ton cas) avec la méthode .Find, il faut absolument rechercher la valeur exacte. En effet, rechercher 1 dans la liste : 56, 22, 89 21, 46, 1, 79 va nous retourner 21. Par conséquent, dans ta méthode find, il faut ajouter le paramètre LookAt, comme ceci :
                    Set RngTrouve = .Columns("G").Find(What:=cherche, after:=.Range("G12"), LookIn:=xlValues, LookAt:=xlWhole)
                    LookAt accepte deux possibilités :
                    recherche partielle : LookAt:= xlPart
                    recherche exacte : LookAt:=xlWhole

                    4- Lorsque tu créées un code avec des userforms, cela sous entends "utilisateurs". L'utilisateur lambda, s'il a la possibilité de saisir des éléments, immanquablement, va faire des erreurs. Par exemple saisir des lettres dans un textbox numérique... Si, dans cet exemple, tu écris :
                    Dim cherche As Integer
                    cherche = CInt(TextboxMachin) et que l'utilisateur, dans le textboxmachin a saisi : "bidule", ton code va immanquablement bugger...
                    Dans ce genre de cas, tu testes avant, pendant la saisie de ton textbox, en utilisant l'événement textbox.change()
                    exemple :
                    'avec la virgule non valide (entier)
                    Private Sub textBox1_Change()
                        On Error Resume Next
                        
                        If Not IsNumeric(Right(TextBox1, 1)) Then
                            MsgBox "Le caractere saisi n'est pas valide"
                            TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
                        End If
                    End Sub


                    Source

                    A+
                    0
                  2. merci pour toutes ces précisions, c'est justement ce qui gêné, le fait que cherche soit string et non integer. Je vais aussi changer certaine choses pour que les textbox numérique le soit vraiment avec ton dernier code.
                    0
                2. J'ai trouvé la solution et j'ai terriblement honte. Je suis vraiment désolé. En faite les références utilisaient sont des combinaisons de chiffres ET de lettres ou parfois que de chiffres. J'ai remarqué que lorsque cela fonctionnait, j'utilisais une référence qu'en chiffre et cela ne fonctionnait plus avec des références où des lettres apparaissaient. Et bien entendu que cela ne fonctionnait plus puisque j'ai déclaré "cherche" en integer...maintenant je l'ai mis en string et "oh miracle!" ca fontionne. Désolé une nouvelle dois, l'erreur était en amont dans le code mais surtout en aval dans l'éxécution !! Chose auxquels vous ne pouviez rien faire et encore moins deviner. Milles excuses !
                  0