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 Sub

En 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 If

Ce 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).Value

Mais ç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!

23simplifie.xlsm (43.11 Ko)

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 Sub

Bonjour 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).Value

Mais il n'affiche pas la MsgBox...

Changer cette ligne

er1: MsgBox Temps & " / " & Worksheets("Rendement").Cells(2, Rdmt.Column).Value

par :

er1:
MsgBox Temps
MsgBox Rdmt.Column

et dit moi ce que donne

et Vérifier ca

If Colonne Is Nothing Or Ligne Is Nothing Then 'Or Rdmt Is Nothing
Temps = 0
Else

Ca 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).Value

Les 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 Nothing

Bonjour 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).Value

et 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!

19gb.xlsx (20.84 Ko)
15ptmy.xlsx (19.55 Ko)
19simplifie.xlsm (54.32 Ko)
Rechercher des sujets similaires à "erreur incompatibilite type 2013"