Erreur 13 type missmatch vba

Signaler
Messages postés
4
Date d'inscription
samedi 17 août 2013
Statut
Membre
Dernière intervention
21 mars 2021
-
 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

Messages postés
32074
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 avril 2021
3 398
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.
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
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
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
merci ça marche maintenant.
bien à vous
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