Erreur 13: Incompatibilité de type, Excel 2013
Bonjour à tous,
Je tiens à m'excuser d'avance pour les erreurs que je risque de commettre mais c'est la première fois que je poste sur ce forum...
Cette macro fonctionne parfaitement sur un premier ordinateur mais ne fonctionne pas sur le mien. Elle m'affiche une erreur 13: incompatibilité de type.
Elle a pour but de calculer un temps d'usinage en fonction d'une référence de composant, d'une opération et d'un rendement de machine (chaque machine effectue une opération et possède donc son rendement). La référence du composant et l'opération permettent d'obtenir un temps d'usinage sec (répertoriés sous forme de tableau dans la feuille Temps d'usinage simplifié) et le rendement permet d'obtenir un temps d'usinage final (et est répertorié par opérations dans la feuille Rendement - CAPA USI).
Voilà le code. La ligne générant le bug est surlignée (normalement):
Sub CalculerChargeUSI()
Dim NbeJours, NbLignes, NbOperation As Integer
Dim k, i As Integer
Dim Operation, Reference As String
Dim Colonne, Ligne, Temps, OpeModule, ValeurPrecedente, Mods, Rdmt
Dim Rendement As Single
Dim Modules(10) As String
Modules(0) = "M1-M2-M3-M4"
Modules(1) = "M1"
Modules(2) = "M2"
Modules(3) = "M3"
Modules(4) = "M4"
Modules(5) = "Fonds-Lunettes"
Modules(6) = "Patrimony"
Modules(7) = "Cornes Patrimony"
Modules(8) = "Découplé"
Modules(9) = "USI (Fictif)"
Modules(10) = "Pas fabriqué MP"
NbeJours = RecupererNbeJours()
If NbeJours < 5 Then
MsgBox "Ordo Semaine non chargé en mémoire. Veuillez refaire une importation", vbOKOnly + vbCritical, "Erreur critique"
Exit Sub
End If
NbOperation = Worksheets("Temps d'usinage simplifié").Range("B1:ZZ1").End(xlToRight).Column
Worksheets("Temps d'usinage simplifié").Range("B1:" & NumberToLetterVBA(NbOperation) & "1").Copy
Worksheets("M1-M2-M3-M4").Range("G1").PasteSpecial
Worksheets("M1").Range("G1").PasteSpecial
Worksheets("M2").Range("G1").PasteSpecial
Worksheets("M3").Range("G1").PasteSpecial
Worksheets("M4").Range("G1").PasteSpecial
Worksheets("Fonds-Lunettes").Range("G1").PasteSpecial
Worksheets("Découplé").Range("G1").PasteSpecial
Worksheets("USI (Fictif)").Range("G1").PasteSpecial
Worksheets("Pas fabriqué MP").Range("G1").PasteSpecial
Worksheets("Patrimony").Range("G1").PasteSpecial
Worksheets("Cornes Patrimony").Range("G1").PasteSpecial
Application.CutCopyMode = False
'Pour chaque module
For Each Mods In Modules
NbLignes = NombreLigneTableau(Mods, "A4:E4")
For k = 0 To NbLignes - 1 ' Nombre de lignes du module
For i = 0 To NbeJours - 1 ' Nombre de colonne où il y a des opérations.
If Worksheets(Mods).Cells(k + 5, i + 6) <> "" Then 'S'il y a une opération alors
'On récupère les informations (Référence et opération).
Operation = Worksheets(Mods).Cells(k + 5, i + 6).Value
Reference = ExtraireReference(Worksheets(Mods).Cells(k + 5, 3).Value)
'On récupère le temps associé et on l'additionne.
Set Colonne = Worksheets("Temps d'usinage simplifié").Range("1:1").Find(what:=Operation)
Set Ligne = Worksheets("Temps d'usinage simplifié").Range("A:A").Find(what:=Reference)
Set Rdmt = Worksheets("Rendements").Range("1:1").Find(what:=Operation)
If Colonne Is Nothing Or Ligne Is Nothing Then
'MsgBox "La combinaison de l'opération " & Operation & " avec la référence " & Reference & " n'est pas spécifié dans le tableau. Action interrompue", vbOKOnly + vbCritical, "Erreur critique"
Temps = 0
Else
Temps = Worksheets("Temps d'usinage simplifié").Cells(Ligne.Row, Colonne.Column).Value
Temps = Temps / Worksheets("Rendements").Cells(2, Rdmt.Column).Value
If Temps = "" Then
Temps = 0
End If
End If
'Recherche de l'opération dans la feuille du module.
Set OpeModule = Worksheets(Mods).Range("1:1").Find(what:=Operation)
If Not OpeModule Is Nothing Then
ValeurPrecedente = Worksheets(Mods).Cells(2, OpeModule.Column).Value
If ValeurPrecedente = "" Then
ValeurPrecedente = 0
End If
Worksheets(Mods).Cells(2, OpeModule.Column).Value = Int(ValeurPrecedente + Temps)
End If
End If
Next i
Next k
For k = 0 To NbOperation
Worksheets(Mods).Cells(2, k + 7).Value = Worksheets(Mods).Cells(2, k + 7).Value / 3600#
Next k
Next
Worksheets("Lancer le programme").Activate
End SubEn utilisant des espions, j'ai pu voir que ma variable Temps était considérée comme vide et a priori c'est ce qu'il n'arrive pas à gérer. Mais je ne comprends pas pourquoi il s'arrête à cette référence particulière sachant qu'il a déjà rencontré ce problème en amont et a réussi à le gérer...
J'ai essayé de:
- supprimer cette ligne: la macro fonctionne correctement. Le temps calculé est juste mais ne tient pas compte du rendement.
- déclarer Temps en tant que Variant: ça n'a rien changé
- déplacer la ligne générant le bug après
If Temps = "" Then
Temps = 0
End IfCe qui donnait
Temps = Worksheets("Temps d'usinage simplifié").Cells(Ligne.Row, Colonne.Column).Value
If Temps = "" Then
Temps = 0
End If
Temps = Temps / Worksheets("Rendements").Cells(2, Rdmt.Column).ValueMais ça n'a rien changé non plus.
- retaper le code entièrement pour éviter des erreurs de copier-coller: toujours cette erreur
- des choses plus élémentaires telles que quitter Excel et redémarrer mon PC, rien n'y fait...
Si jamais je ne suis pas claire ou qu'il vous faut plus d'informations concernant des fonctions ou des variables de la macro, n'hésitez pas à me le dire...
Je n'ai pas posté mon fichier car je ne l'ai pas simplifié et je n'ai pas enlevé les données confidentielles. Si c'est nécessaire pour vous, je le ferai sans problème.
Merci d'avance pour votre aide!
Bonsoir,
Sans le fichier difficile. Vu le message qui correspond au type de donnée, teste comme ça :
Temps = Temps / Val(Worksheets("Rendements").Cells(2, Rdmt.Column))Bonjour,
Une incompatibilité de type sur la ligne surlignée signifie a-priori que, ton opération exigeant 2 valeurs numérique, l'une des 2 au moins n'est pas un nombre.
Essaie :
Temps = Val(Temps)ou si valeur décimale :
Temps = Val(Replace(Temps, ",", "."))(car Val ne reconnaît pas la virgule comme séparateur décimal.)
NB- Temps est une variable de type Variant, comme la plupart de tes variables (11 sur 16) [toutes celles qui ne sont pas individuellement typées].
Cordialement.
Bonjour Raja, MFerrand, le forum,
Tout d'abord, merci pour votre aide à tous les deux. Je n'ai pas pu répondre plus tôt car j'étais partie avant de recevoir vos réponses.
J'ai essayé vos deux propositions mais malheureusement aucune n'a fonctionné...
J'ai essayé de faire un fichier simplifié du projet sur lequel je travaille. J'espère que ça pourra vous aider...
Encore merci d'essayer de régler ce problème!
bonjour
regardez ce que donne le msgbox
Sub CalculerChargeUSI()
Dim NbeJours, NbLignes, NbOperation As Integer
Dim k, i As Integer
Dim Operation, Reference As String
Dim Colonne, Ligne, Temps, OpeModule, ValeurPrecedente, Mods, Rdmt
Dim Rendement As Single
Dim Modules(10) As String
On Error GoTo er1
Modules(0) = "M1-M2-M3-M4"
Modules(1) = "M1"
Modules(2) = "M2"
Modules(3) = "M3"
Modules(4) = "M4"
Modules(5) = "Fonds-Lunettes"
Modules(6) = "Patrimony"
Modules(7) = "Cornes Patrimony"
Modules(8) = "Découplé"
Modules(9) = "USI (Fictif)"
Modules(10) = "Pas fabriqué MP"
NbeJours = RecupererNbeJours()
If NbeJours < 5 Then
MsgBox "Ordo Semaine non chargé en mémoire. Veuillez refaire une importation", vbOKOnly + vbCritical, "Erreur critique"
Exit Sub
End If
NbOperation = Worksheets("Temps d'usinage simplifié").Range("B1:ZZ1").End(xlToRight).Column
Worksheets("Temps d'usinage simplifié").Range("B1:" & NumberToLetterVBA(NbOperation) & "1").Copy
Worksheets("M1-M2-M3-M4").Range("G1").PasteSpecial
Worksheets("M1").Range("G1").PasteSpecial
Worksheets("M2").Range("G1").PasteSpecial
Worksheets("M3").Range("G1").PasteSpecial
Worksheets("M4").Range("G1").PasteSpecial
Worksheets("Fonds-Lunettes").Range("G1").PasteSpecial
Worksheets("Découplé").Range("G1").PasteSpecial
Worksheets("USI (Fictif)").Range("G1").PasteSpecial
Worksheets("Pas fabriqué MP").Range("G1").PasteSpecial
Worksheets("Patrimony").Range("G1").PasteSpecial
Worksheets("Cornes Patrimony").Range("G1").PasteSpecial
Application.CutCopyMode = False
'Pour chaque module
For Each Mods In Modules
NbLignes = NombreLigneTableau(Mods, "A4:E4")
For k = 0 To NbLignes - 1 ' Nombre de lignes du module
For i = 0 To NbeJours - 1 ' Nombre de colonne où il y a des opérations.
If Worksheets(Mods).Cells(k + 5, i + 6) <> "" Then 'S'il y a une opération alors
'On récupère les informations (Référence et opération).
Operation = Worksheets(Mods).Cells(k + 5, i + 6).Value
Reference = ExtraireReference(Worksheets(Mods).Cells(k + 5, 3).Value)
'On récupère le temps associé et on l'additionne.
Set Colonne = Worksheets("Temps d'usinage simplifié").Range("1:1").Find(what:=Operation)
Set Ligne = Worksheets("Temps d'usinage simplifié").Range("A:A").Find(what:=Reference)
Set Rdmt = Worksheets("Rendements").Range("1:1").Find(what:=Operation)
If Colonne Is Nothing Or Ligne Is Nothing Then
'MsgBox "La combinaison de l'opération " & Operation & " avec la référence " & Reference & " n'est pas spécifié dans le tableau. Action interrompue", vbOKOnly + vbCritical, "Erreur critique"
Temps = 0
Else
Temps = Worksheets("Temps d'usinage simplifié").Cells(Ligne.Row, Colonne.Column).Value
Temps = Temps / Worksheets("Rendements").Cells(2, Rdmt.Column).Value
If Temps = "" Then
Temps = 0
End If
End If
'Recherche de l'opération dans la feuille du module.
Set OpeModule = Worksheets(Mods).Range("1:1").Find(what:=Operation)
If Not OpeModule Is Nothing Then
ValeurPrecedente = Worksheets(Mods).Cells(2, OpeModule.Column).Value
If ValeurPrecedente = "" Then
ValeurPrecedente = 0
End If
Worksheets(Mods).Cells(2, OpeModule.Column).Value = Int(ValeurPrecedente + Temps)
End If
End If
Next i
Next k
For k = 0 To NbOperation
Worksheets(Mods).Cells(2, k + 7).Value = Worksheets(Mods).Cells(2, k + 7).Value / 3600#
Next k
Next
Worksheets("Lancer le programme").Activate
er1: MsgBox Temps & " / " & Worksheets("Rendement").Cells(2, Rdmt.Column).Value
End SubBonjour Amir,
Merci pour votre aide.
Le bug se produit avant la ligne contenant le MsgBox. Du coup, je n'arrive pas à l'afficher...
emmadsn a écrit :Le bug se produit avant la ligne contenant le MsgBox. Du coup, je n'arrive pas à l'afficher...
je comprends pas je pense que vous aurez tjrs un msgbox
La macro s'arrête avant et ne va pas jusqu'à la ligne contenant la MsgBox...
Peut-être qu'en utilisant le mode pas à pas je pourrais aller jusqu'à cette ligne mais je ne sais pas comment faire...
Bonjour,
Erreur : PasfMP => PfMP
Variable NbeJours non initialisée : étant de type Variant, elle est vide (valeur Empty) tout au long de la procédure, renvoie la valeur 0 en contexte numérique, d'où :
For i = 0 To NbeJours - 1 => For i = 0 To -1 => aucune chance de jamais rentrer dans cette boucle !
Cordialement.
MFerrand,
Les erreurs que vous signalez ne se trouvent que dans le fichier simplifié que j'ai fais rapidement ce matin. Elles ne se trouvent pas dans le fichier complet...
Je vous remercie de me les avoir signalées et je vais mettre ce fichier à jour.
Cordialement,
je dis que le msg s affiche trjs, soit il y a une erreur ou non, il est a la fin de la procedure
Message par AMIR » Aujourd’hui, 12:06
je dis que le msg s affiche trjs, soit il y a une erreur ou non, il est a la fin de la procedure
J'ai lancé ma macro plusieurs fois, la MsgBox ne s'est pas affichée...
as tu remplace mon code par le tien
Oui et il m'affiche une erreur 9 sur la ligne
er1: MsgBox Temps & " / " & Worksheets("Rendement").Cells(2, Rdmt.Column).ValueMais il n'affiche pas la MsgBox...
Changer cette ligne
er1: MsgBox Temps & " / " & Worksheets("Rendement").Cells(2, Rdmt.Column).Valuepar :
er1:
MsgBox Temps
MsgBox Rdmt.Columnet dit moi ce que donne
et Vérifier ca
If Colonne Is Nothing Or Ligne Is Nothing Then 'Or Rdmt Is Nothing
Temps = 0
ElseCa fonctionne! La MsgBox s'est affichée.
La première est vide et la deuxième affiche 2...
Pour la dernière partie, qu'entends-tu par vérifier..?
essayer ca
MFerrand a écrit :Une incompatibilité de type sur la ligne surlignée signifie a-priori que, ton opération exigeant 2 valeurs numérique, l'une des 2 au moins n'est pas un nombre.
Essaie :
Temps = Val(Temps)ou si valeur décimale :
Temps = Val(Replace(Temps, ",", "."))(car Val ne reconnaît pas la virgule comme séparateur décimal.)
NB- Temps est une variable de type Variant, comme la plupart de tes variables (11 sur 16) [toutes celles qui ne sont pas individuellement typées].
Ici vous essayer de faire une opération mathématique qui exige des valeurs numériques
Temps = Temps / Worksheets("Rendements").Cells(2, Rdmt.Column).ValueLes valeurs de la ligne 2 de la feuille Rendements sont stockées sous forme texte
Alors veuillez quelles restent tjrs sous forme numérique (type numérique)
Initialiser aussi le variable Temps pour avoir un type numérique
Par exemple
Temps =0 au début de code
Ou déclarer "Temps" comme type numérique
Penser à ajouter Rdmt dans cette ligne
If Colonne Is Nothing Or Ligne Is Nothing Then 'Or Rdmt Is NothingBonjour Amir, le forum,
Merci pour le temps passé sur ce problème...
J'ai essayé de faire tout ce que tu m'as conseillé mais l'erreur persiste sur la ligne
Temps = Temps / Worksheets("Rendements - CAPA").Cells(2, Rdmt.Column).Valueet ce toujours pour la même référence et le même rendement...
bonjour
essayez de renvoyer un fichier representatif
Bonjour Amir, le forum,
Désolée d'avoir été aussi longue à répondre...
Voici normalement un fichier représentatif de ma feuille ("Simplifié"). Pour ce qui est des fichies "GB" et "PTMY", ils constituent la base de données dans laquelle mes macros vont chercher les informations qui leur sont nécessaires.
Pour l'importation, le mieux est de la faire à partir de la semaine 35 pour le nombre de semaines que vous souhaitez (sinon, il n'y aura pas d'opérations à réaliser sur les pièces et il sera donc impossible de calculer un temps d'usinage)...
La ligne de code qui ne fonctionne pas se trouve sur dans le module "CalculUSI".
Si je ne suis pas très claire, n'hésitez pas à me le dire...
Encore merci pour votre aide!