Erreur 13 type missmatch vba

bilancourt -  
 Lupin -
Bonjour,

Lors de l'exécution de mon code j'ai une erreur de type : "Erreur 13: type mismatch"

Voici mes variable:



Sub Trt_toout()

Dim NUMINS, IDETU, COMPOS As String
Dim PRGM_CODE, PRGM_LIBL, MODEL_CODE, PRGM_EXED As String
Dim Module_Code, Module_Type, Module_Pays, Module_Dure_Str As String
Dim Module_Dure As Long
Dim OutG_Type, OutG_Dure_Str, OutG_Pays As String
Dim OutG_Dure As Long
Dim ExpPro_Type, ExpPro_Dure_Str, ExpPro_Pays As String
Dim ExpPro_Dure As Long

Do While Sheets(FeuilleIMP).Cells(i, 1) <> ""

' Ajout CK
Code_Diplome_Sise = Sheets(FeuilleIMP).Cells(i, 40)
Erasmus = Sheets(FeuilleIMP).Cells(i, 41)
Regime = Sheets(FeuilleIMP).Cells(i, 42)

NUMINS = Sheets(FeuilleIMP).Cells(i, 1) & " " & Sheets(FeuilleIMP).Cells(i, 14)

IDETU = Sheets(FeuilleIMP).Cells(i, 2)
COMPOS = Sheets(FeuilleIMP).Cells(i, 3)
PRGM_CODE = Sheets(FeuilleIMP).Cells(i, 5)
PRGM_LIBL = Sheets(FeuilleIMP).Cells(i, 6)
MODEL_CODE = Sheets(FeuilleIMP).Cells(i, 7)
PRGM_EXED = Sheets(FeuilleIMP).Cells(i, 8)

Module_Code = Sheets(FeuilleIMP).Cells(i, 19)
Module_Type = Sheets(FeuilleIMP).Cells(i, 20)
Module_Pays = Sheets(FeuilleIMP).Cells(i, 21)

Module_Dure_Str = Replace(Sheets(FeuilleIMP).Cells(i, 22), ".", ",")

If Module_Dure_Str = " " Then
Module_Dure = 0
Else
Module_Dure = Module_Dure_Str * 1
End If


Quand je lance ma macro il me renvoi une erreur 13 de type mismatch à la ligne :

Module_Dure = Module_Dure_Str * 1

voir capture d'écran:

sachant que je survole avec la souris la ligne à debeuguer en jaune il me dit:
Module_Dure_Str = "Paris"

pourriez vous m'aider à débuguer?

Cordialement

6 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Ton *1 ne sert à rien.
    A la place, utilise l'instruction CLng(String)

    A noter également que tu fais un replace du point par la virgule ... mais ... quel est le séparateur décimal utilisé dans ton système ?
    En général.. c'est le point qui est utilisé .. donc 123,45 est un text (non convertible en nombre) alors que 123.45 est lui, bien compris en tant que nombre.
    0
  2. Lupin
     
    Bonjour

    Sous VBA l'instruction

    Dim NUMINS, IDETU, COMPOS As String

    est en réalité

    NUMINS As Variant, IDETU As Variant, COMPOS As string

    pas étonnant que tu ais "Erreur 13: type mismatch"

    Lupin
    0
  3. bilancourt
     
    Bonjour,

    Après avoir appliquer vos réponses l'erreur persiste:
    voici mon code intégrale:

    Dim NUMINS As Variant, IDETU As Variant, COMPOS As String
    Dim PRGM_CODE, PRGM_LIBL, MODEL_CODE, PRGM_EXED As String
    Dim Module_Code, Module_Type, Module_Pays, Module_Dure_Str As String
    Dim Module_Dure As Long
    Dim OutG_Type, OutG_Dure_Str, OutG_Pays As String
    Dim OutG_Dure As Long
    Dim ExpPro_Type, ExpPro_Dure_Str, ExpPro_Pays As String

    ' Correction dépassement de capacité - Modif String par Long
    Dim ExpPro_Dure As Long

    FeuilleIMP = 1
    FeuilleRES = 2
    ExpPro_Dure_Str = ""

    Sheets(FeuilleIMP).Range("A:DP").ClearContents
    Sheets(FeuilleRES).Range("A:DP").ClearContents

    i = 2

    ' COMPOS DIPLOM
    Sheets(FeuilleRES).Activate
    j = 1
    Sheets(FeuilleRES).Cells(j, 1) = "NUMINS"
    Sheets(FeuilleRES).Cells(j, 2) = "IDETU"
    Sheets(FeuilleRES).Cells(j, 3) = "COMPOS"
    Sheets(FeuilleRES).Cells(j, 4) = "DIPLOM"
    Sheets(FeuilleRES).Cells(j, 5) = "DUREE_MOBPCO"
    Sheets(FeuilleRES).Cells(j, 6) = "TYPE_MOBPCO"
    Sheets(FeuilleRES).Cells(j, 7) = "PAYS_MOBPCO"

    'Ajout CK
    Sheets(FeuilleRES).Cells(j, 8) = "CODE_DIPLOME"
    Sheets(FeuilleRES).Cells(j, 9) = "REGIME"
    Sheets(FeuilleRES).Cells(j, 10) = "Durée Semestre Campus"
    Sheets(FeuilleRES).Cells(j, 11) = "Pays Semestre Campus"
    Sheets(FeuilleRES).Cells(j, 12) = "Pays INSEE Semestre Campus"
    Sheets(FeuilleRES).Cells(j, 13) = "Type semestre"
    Sheets(FeuilleRES).Cells(j, 15) = "Durée Outgoing"
    Sheets(FeuilleRES).Cells(j, 16) = "Pays Outgoing"
    Sheets(FeuilleRES).Cells(j, 17) = "Pays INSEE Outgoing"
    Sheets(FeuilleRES).Cells(j, 18) = "Type événement"
    Sheets(FeuilleRES).Cells(j, 20) = "Durée ExpPro"
    Sheets(FeuilleRES).Cells(j, 21) = "Pays ExpPro"
    Sheets(FeuilleRES).Cells(j, 22) = "Pays INSEE ExpPro"
    Sheets(FeuilleRES).Cells(j, 23) = "Type ExpPro"
    Sheets(FeuilleRES).Cells(j, 25) = "Durée Max"
    Sheets(FeuilleRES).Cells(j, 26) = "Durée Max en mois"
    Sheets(FeuilleRES).Cells(j, 27) = "Pays Durée Max"
    Sheets(FeuilleRES).Cells(j, 28) = "Type Durée Max"
    Sheets(FeuilleRES).Cells(j, 29) = "Erasmus"

    j = 2
    RupturNUMINS = "x"
    Do While Sheets(FeuilleIMP).Cells(i, 1) <> ""

    ' Ajout CK
    Code_Diplome_Sise = Sheets(FeuilleIMP).Cells(i, 40)
    Erasmus = Sheets(FeuilleIMP).Cells(i, 41)
    Regime = Sheets(FeuilleIMP).Cells(i, 42)

    NUMINS = Sheets(FeuilleIMP).Cells(i, 1) & " " & Sheets(FeuilleIMP).Cells(i, 14)
    IDETU = Sheets(FeuilleIMP).Cells(i, 2)
    COMPOS = Sheets(FeuilleIMP).Cells(i, 3)
    PRGM_CODE = Sheets(FeuilleIMP).Cells(i, 5)
    PRGM_LIBL = Sheets(FeuilleIMP).Cells(i, 6)
    MODEL_CODE = Sheets(FeuilleIMP).Cells(i, 7)
    PRGM_EXED = Sheets(FeuilleIMP).Cells(i, 8)

    Module_Code = Sheets(FeuilleIMP).Cells(i, 19)
    Module_Type = Sheets(FeuilleIMP).Cells(i, 20)
    Module_Pays = Sheets(FeuilleIMP).Cells(i, 21)
    Module_Dure_Str = Replace(Sheets(FeuilleIMP).Cells(i, 22), ".", ",")
    If Module_Dure_Str = "" Then
    Module_Dure = 0
    Else
    Module_Dure = Module_Dure_Str * 1
    End If

    OutG_Type = Sheets(FeuilleIMP).Cells(i, 26)
    OutG_Insee = Left(Sheets(FeuilleIMP).Cells(i, 27), 3)
    OutG_Pays = Sheets(FeuilleIMP).Cells(i, 28)
    OutG_Dure_Str = Replace(Sheets(FeuilleIMP).Cells(i, 25), ".", ",")
    'If OutG_Dure_Str = "" Then
    'OutG_Dure = 0
    'Else
    'OutG_Dure = CLng(OutG_Dure_Str) * 1
    'End If

    ExpPro_Type = Sheets(FeuilleIMP).Cells(i, 31)
    ExpPro_Insee = Left(Sheets(FeuilleIMP).Cells(i, 38), 3)
    ExpPro_Pays = Sheets(FeuilleIMP).Cells(i, 39)
    ExpPro_Dure_Str = Sheets(FeuilleIMP).Cells(i, 37)

    If ExpPro_Dure_Str = "" Then
    ExpPro_Dure = 0
    Else
    ' Correction dépassement de capacité - conversion au type Long
    ExpPro_Dure = CLng(ExpPro_Dure_Str) * 1
    End If

    If RupturNUMINS = NUMINS Then

    If Module_Code <> "" And Module_Pays <> "PARIS" And Module_Type = "SEM_CAMPUS" Then
    If Module_Dure >= MaxCampus Then
    MaxCampus = Module_Dure
    PaysCampus = Module_Pays
    End If
    End If

    If OutG_Type <> "" Then
    If OutG_Dure >= MaxOut Then
    MaxOut = OutG_Dure
    PaysOut = OutG_Pays
    InseeOut = OutG_Insee
    TypeOut = OutG_Type
    End If
    End If

    If ExpPro_Type <> "" Then
    If ExpPro_Dure >= MaxExpPro Then
    MaxExpPro = ExpPro_Dure
    PaysExpPro = ExpPro_Pays
    InseeExpPro = ExpPro_Insee
    TypeExpPro = ExpPro_Type
    End If
    End If

    Else
    If PaysCampus = "LONDON" Then
    PaysCampus = "Royaume-Uni"
    InseeCampus = "132"
    ElseIf PaysCampus = "BERLIN" Then
    PaysCampus = "Allemagne"
    InseeCampus = "109"
    ElseIf PaysCampus = "MADRID" Then
    PaysCampus = "Espagne"
    InseeCampus = "134"
    ElseIf PaysCampus = "TORINO" Then
    PaysCampus = "Italie"
    InseeCampus = "127"
    End If

    Sheets(FeuilleRES).Cells(j, 10) = MaxCampus
    Sheets(FeuilleRES).Cells(j, 11) = PaysCampus
    Sheets(FeuilleRES).Cells(j, 12) = InseeCampus
    Sheets(FeuilleRES).Cells(j, 13) = "CAMPUS"

    Sheets(FeuilleRES).Cells(j, 15) = MaxOut
    Sheets(FeuilleRES).Cells(j, 16) = PaysOut
    Sheets(FeuilleRES).Cells(j, 17) = InseeOut
    Sheets(FeuilleRES).Cells(j, 18) = TypeOut

    Sheets(FeuilleRES).Cells(j, 20) = MaxExpPro
    Sheets(FeuilleRES).Cells(j, 21) = PaysExpPro
    Sheets(FeuilleRES).Cells(j, 22) = InseeExpPro
    Sheets(FeuilleRES).Cells(j, 23) = TypeExpPro

    If MaxCampus > MaxOut Then
    indice = 10
    Else
    indice = 15
    End If

    If Sheets(FeuilleRES).Cells(j, indice) < MaxExpPro Then
    indice = 20
    End If

    Sheets(FeuilleRES).Cells(j, 25) = Sheets(FeuilleRES).Cells(j, indice)
    Sheets(FeuilleRES).Cells(j, 26) = Sheets(FeuilleRES).Cells(j, indice) / 30

    If Sheets(FeuilleRES).Cells(j, 26) >= 6 Then
    DUREE_MOBCO = 3
    ElseIf Sheets(FeuilleRES).Cells(j, 26) >= 3 Then
    DUREE_MOBCO = 2
    Else
    DUREE_MOBCO = 1
    End If

    Sheets(FeuilleRES).Cells(j, 27) = Sheets(FeuilleRES).Cells(j, indice + 1)
    Sheets(FeuilleRES).Cells(j, 28) = Sheets(FeuilleRES).Cells(j, indice + 3)

    If Sheets(FeuilleRES).Cells(j, 25) <> 0 Then
    Sheets(FeuilleRES).Cells(j, 5) = DUREE_MOBCO
    ' Ajout CK -> recodification CAMPUS / OUTGOING
    'Sheets(FeuilleRES).Cells(j, 6) = Sheets(FeuilleRES).Cells(j, 28)

    Select Case Sheets(FeuilleRES).Cells(j, 28)

    Case "OUTGOING":
    Sheets(FeuilleRES).Cells(j, 6) = "J"

    Case Else: '"CAMPUS", "FRCONV", "CDI", "STAGE", "OTH", "ITCONV", "ESCONV", "VIE", "CDD":
    Sheets(FeuilleRES).Cells(j, 6) = 0

    End Select

    ' Erasmus
    'Sheets(FeuilleRES).Cells(j, 9) = Sheets(FeuilleRES).Cells(j, 6) & " - " & Sheets(FeuilleRES).Cells(j, 29)
    If Sheets(FeuilleRES).Cells(j, 6) = "J" And Sheets(FeuilleRES).Cells(j, 29) Then Sheets(FeuilleRES).Cells(j, 6) = "L"

    Sheets(FeuilleRES).Cells(j, 7) = Sheets(FeuilleRES).Cells(j, indice + 2)
    Else
    Sheets(FeuilleRES).Cells(j, 5) = 9
    End If

    j = j + 1

    MaxCampus = 0
    PaysCampus = ""
    InseeCampus = ""
    MaxOut = 0
    PaysOut = ""
    InseeOut = ""
    MaxExpPro = 0
    PaysExpPro = ""
    InseeExpPro = ""
    TypeExpPro = ""

    RupturNUMINS = NUMINS
    Sheets(FeuilleRES).Cells(j, 1) = NUMINS
    Sheets(FeuilleRES).Cells(j, 2) = IDETU
    Sheets(FeuilleRES).Cells(j, 3) = COMPOS
    Sheets(FeuilleRES).Cells(j, 4) = PRGM_CODE

    'Ajout CK
    Sheets(FeuilleRES).Cells(j, 8) = Code_Diplome_Sise
    Sheets(FeuilleRES).Cells(j, 29) = Erasmus
    Sheets(FeuilleRES).Cells(j, 9) = Regime

    If Module_Code <> "" And Module_Pays <> "PARIS" And Module_Type = "SEM_CAMPUS" Then
    MaxCampus = Module_Dure
    PaysCampus = Module_Pays
    End If

    If OutG_Type <> "" Then
    MaxOut = OutG_Dure
    PaysOut = OutG_Pays
    InseeOut = OutG_Insee
    End If

    If ExpPro_Type <> "" Then
    MaxExpPro = ExpPro_Dure
    PaysExpPro = ExpPro_Pays
    InseeExpPro = ExpPro_Insee
    End If

    End If
    i = i + 1
    Loop

    If PaysCampus = "LONDON" Then
    PaysCampus = "Royaume-Uni"
    ElseIf PaysCampus = "BERLIN" Then
    PaysCampus = "Allemagne"
    ElseIf PaysCampus = "MADRID" Then
    PaysCampus = "Espagne"
    ElseIf PaysCampus = "TORINO" Then
    PaysCampus = "Italie"
    End If

    Sheets(FeuilleRES).Cells(j, 10) = MaxCampus
    Sheets(FeuilleRES).Cells(j, 11) = PaysCampus

    Sheets(FeuilleRES).Cells(j, 15) = MaxOut
    Sheets(FeuilleRES).Cells(j, 16) = PaysOut

    Sheets(FeuilleRES).Cells(j, 20) = MaxExpPro
    Sheets(FeuilleRES).Cells(j, 21) = PaysExpPro

    If MaxCampus > MaxOut Then
    indice = 10
    Else
    indice = 15
    End If

    If Sheets(FeuilleRES).Cells(j, indice) < MaxExpPro Then
    indice = 20
    End If

    Sheets(FeuilleRES).Cells(j, 25) = Sheets(FeuilleRES).Cells(j, indice)
    Sheets(FeuilleRES).Cells(j, 26) = Sheets(FeuilleRES).Cells(j, indice) / 30
    Sheets(FeuilleRES).Cells(j, 27) = Sheets(FeuilleRES).Cells(j, indice + 1)

    Rows(2).EntireRow.Delete
    MsgBox "Traitement terminé !"

    End Sub
    0
  4. retrotech
     
    Bonjour,

    Tu as déclaré Dim Module_Dure_Str as String
    donc la ligne Module_Dure_Str * 1 n'a pas de sens, on ne peut pas faire une opération arithmétique sur une chaîne.
    Il faut au préalable convertir la chaîne en nombre, pour autant que la chaîne soit convertible. Pour cela il faut utiliser la fonction Val()
    If Module_Dure_Str = "" Then
    Module_Dure = 0
    Else
    Module_Dure = Val(Module_Dure_Str) * 1
    End If
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bilancourt
     
    merci ça marche maintenant.
    bien à vous
    0
  7. Lupin
     
    Bonjour,

    Pour éviter le problème, tu dois comprendre le principe de déclaration des variables et d'avoir le bon contenant pour le bon contenu.

    Dans l'exemple suivant :

    Sub test()
    
    Dim NbrVariant, NbrDouble As Double
    ' La définition qui précède signifie que NbrVariant est de Type Variant 
    ' et que NbrDouble est de type double
    
    NbrVariant = "12,4"
    ' L'affectation qui précède affecte un type "double" dans un type variant
    ' donc le type de NbrVariant devient de type "double"
    
    NbrDouble = NbrVariant / 2
    ' L'opération qui précède fonctionne bien puisque un type "double"
    ' NbrVariant (type modifé par l'instruction d'affectation) est divisé par 2
    ' et le résultat est envoyé dans un variable de type "double"
    
    NbrVariant = "12.4"
    ' Ici on prépare une erreur de type mismatch car l'affectation envoie
    ' dans la variable une chaîne de caractère dans un type variant, ce
    ' type est alors modifié de devient un type string
    
    NbrDouble = NbrVariant / 2
    ' Ici, se produit le type mismatch puisque NbrVariant est devenu un type
    ' string suite à l'affectation et on tente une opération mathématique sur
    ' un type string
    
    End Sub
    


    Truc pour bien percevoir le type de contenant versus le type de contenu

    lors de la déclaration utiliser les 3 premiers caractères du nom de la variable pour définir le type de celle-ci.

    Exemple :

    
    Dim DblNombre As Double
    Dim StrMessage As String
    Dim LngNombreEntier As Long
    
    Dim StrTexte As String, StrMarque As String
    ' Lors de déclaration de plusieurs variables sur un même ligne
    ' Sous VBA chaque variable doit être défini par son type
    
    Dim StrTexte, StrMarque As String
    ' Cette déclaration spécifie implicitement que
    Dim StrTexte As Variant, StrMarque As String
    ' Ce qui amène les erreurs de type mismatch lorsque l'on ne connaît
    ' pas bien nos variables ou les Types Variant qui peuvent recevoir
    ' n'importe quel contenu lors d'une affectation en prenant le type
    ' défini par le contenu
    


    Bonne continuité

    Lupin
    0