Erreur de compatibilité de type (vba)

Résolu/Fermé
remy4242 - Modifié par remy4242 le 23/04/2012 à 10:57
 remy4242 - 24 avril 2012 à 13:32
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

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
23 avril 2012 à 11:41
Bonjour,

With Range("g12:g65536")

Definir l'onglet

With Worksheets("stock").Range("g12:g65536")
0
merci d'avoir répondu cependant malgrès la modification, toujours le même problème, même intitulé et même ligne
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 23/04/2012 à 15:14
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
23 avril 2012 à 15:45
Bonjour,

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


Cdt

Lupin
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
23 avril 2012 à 16:12
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
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
24 avril 2012 à 08:39
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
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
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