Erreur de compatibilité de type (vba)

Résolu
remy4242 -  
 remy4242 -
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. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    With Range("g12:g65536")

    Definir l'onglet

    With Worksheets("stock").Range("g12:g65536")
    0
  2. remy4242
     
    merci d'avoir répondu cependant malgrès la modification, toujours le même problème, même intitulé et même ligne
    0
  3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  4. remy4242
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Bonjour,

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


    Cdt

    Lupin
    0
  7. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  8. remy4242
     
    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
  9. remy4242
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. remy4242
       
      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
  10. remy4242
     
    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