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. 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
    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. 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. 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. Bonjour,

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


          Cdt

          Lupin
          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,

              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. 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,

                  With Range("g12:g65536")

                  Definir l'onglet

                  With Worksheets("stock").Range("g12:g65536")
                  0