XL 2016 Erreur type 13 - calcul variable en fonction de trois autres

rouckyluke

XLDnaute Nouveau
Bonjour

N'étant pas experte en VBA je me trouve en difficulté pour écrire un code qui décrit l'action suivante :
J'aimerais calculer une variable "Poids vif" en fonction de deux autre variables (poids carcasse et rendement). Sachant que le rendement est conditionné par la variable classement, exemple : si classement = E+ alors le rendement =0.67 et ainsi de suite...
J'ai tourné le code dans tous les sens mais j'ai toujours une erreur d'incompatibilité de type 13.
A la fin j'aimerais que les valeurs calculées s'insèrent dans la colonne "poids vif" (de I2 jusqu'à la dernière valeur, variable DL)
Il manque certainement des lignes...
Merci par avance pour votre aide !

Voici mon code :

Sub calculPoidsV()

'Calculer le rendement en fonction du classement EUROP

Dim Rendmt As Variant
Dim Poidscarc As Variant
Dim Poidsvif As Variant
Dim Cls As Variant
Dim i As Integer

Dim DL As Integer

DL = Sheets("Saisies").Cells(Rows.Count, 2).End(xlUp).Row

For i = 1 To DL
Poidsvif = Sheets("Calcul").Range("I2:I" & DL).Value
Poidscarc = Sheets("Calcul").Range("J2:J" & DL).Value
Cls = Sheets("Calcul").Range("K2:K" & DL).Value


If Cls = "E+" Then
Rendmt = 0.67
ElseIf Cls = "E=" Then
Rendmt = 0.67
ElseIf Cls = "E-" Then
Rendmt = 0.66
ElseIf Cls = "U+" Then
Rendmt = 0.65
ElseIf Cls = "U=" Then
Rendmt = 0.64
ElseIf Cls = "U-" Then
Rendmt = 0.63
ElseIf Cls = "R+" Then
Rendmt = 0.62
ElseIf Cls = "R=" Then
Rendmt = 0.61
ElseIf Cls = "R-" Then
Rendmt = 0.61
Else: Rendmt = 0.6

End If
If Poidscarc = "" Then
Poidscarc = 0
End If

Poidsvif = Poidscarc / Rendmt

Next i

End Sub
 
Solution
Est-ce que ceci ne conviendrait pas ? :
VB:
Sub CalculPoidsV()
   Feuil3.[I2].Resize(Feuil3.[J1000000].End(xlUp).Row - 1).FormulaR1C1 = "=IFERROR(RC10/CHOOSE(MATCH(RC11," _
      & "{""E+"";""E="";""E-"";""U+"";""U="";""U-"";""R+"";""R="";""R-""},0),0.67,0.67,0.66,0.65,0.64,0.63,0.62,0.61,0.61),"""")"
   End Sub

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour rouckyluke, le forum

ma foi, sans fichier exemple et sans savoir sur quelles valeurs vous travaillez ni ce que vous voulez faire, je dirai que l'erreur vient de là ou du DL que vous utilisez à la place de i dans la boucle !
mais sans fichier exemple, je n'ai ni testé ni essayé d'améliorer le code.

Bien cordialement, @+
VB:
Sub calculPoidsV()

'Calculer le rendement en fonction du classement EUROP

Dim Rendmt As Variant
Dim Poidscarc As Variant
'Dim Poidsvif As Variant
Dim Cls As Variant
Dim i As Integer

Dim DL As Integer

DL = Sheets("Saisies").Cells(Rows.Count, 2).End(xlUp).Row

For i = 1 To DL
'Poidsvif = Sheets("Calcul").Range("I2:I" & DL).Value
Poidscarc = Sheets("Calcul").Range("J2:J" & DL).Value
Cls = Sheets("Calcul").Range("K2:K" & DL).Value


If Cls = "E+" Then
Rendmt = 0.67
ElseIf Cls = "E=" Then
Rendmt = 0.67
ElseIf Cls = "E-" Then
Rendmt = 0.66
ElseIf Cls = "U+" Then
Rendmt = 0.65
ElseIf Cls = "U=" Then
Rendmt = 0.64
ElseIf Cls = "U-" Then
Rendmt = 0.63
ElseIf Cls = "R+" Then
Rendmt = 0.62
ElseIf Cls = "R=" Then
Rendmt = 0.61
ElseIf Cls = "R-" Then
Rendmt = 0.61
Else: Rendmt = 0.6

End If
If Poidscarc = "" Then
Poidscarc = 0
End If

Sheets("Calcul").Range("I2:I" & DL).Value = Poidscarc / Rendmt

Next i

End Sub
 

rouckyluke

XLDnaute Nouveau
Bonjour rouckyluke, le forum

ma foi, sans fichier exemple et sans savoir sur quelles valeurs vous travaillez ni ce que vous voulez faire, je dirai que l'erreur vient de là ou du DL que vous utilisez à la place de i dans la boucle !
mais sans fichier exemple, je n'ai ni testé ni essayé d'améliorer le code.

Bien cordialement, @+
VB:
Sub calculPoidsV()

'Calculer le rendement en fonction du classement EUROP

Dim Rendmt As Variant
Dim Poidscarc As Variant
'Dim Poidsvif As Variant
Dim Cls As Variant
Dim i As Integer

Dim DL As Integer

DL = Sheets("Saisies").Cells(Rows.Count, 2).End(xlUp).Row

For i = 1 To DL
'Poidsvif = Sheets("Calcul").Range("I2:I" & DL).Value
Poidscarc = Sheets("Calcul").Range("J2:J" & DL).Value
Cls = Sheets("Calcul").Range("K2:K" & DL).Value


If Cls = "E+" Then
Rendmt = 0.67
ElseIf Cls = "E=" Then
Rendmt = 0.67
ElseIf Cls = "E-" Then
Rendmt = 0.66
ElseIf Cls = "U+" Then
Rendmt = 0.65
ElseIf Cls = "U=" Then
Rendmt = 0.64
ElseIf Cls = "U-" Then
Rendmt = 0.63
ElseIf Cls = "R+" Then
Rendmt = 0.62
ElseIf Cls = "R=" Then
Rendmt = 0.61
ElseIf Cls = "R-" Then
Rendmt = 0.61
Else: Rendmt = 0.6

End If
If Poidscarc = "" Then
Poidscarc = 0
End If

Sheets("Calcul").Range("I2:I" & DL).Value = Poidscarc / Rendmt

Next i

End Sub
Bonjour Yeahou,

J'ai essayé de changer le DL par i dans la boucle mais sans succès.
Je vous joins mon fichier de travail : l'idée est d'importer un fichier qui se copie colle dans "saisies" (bouton importer qui fonctionne), il y a une partie saisie de données alimentaire (bouton saisir des données qui fonctionne aussi), et celle sur quoi je bloque c'est le bouton "Calculer" à "Sub calculPoidsV()"
J'ai importé un fichier avec des données fictives pour que vous puissiez comprendre.
Merci beaucoup pour votre aide
 

Pièces jointes

  • Construction GTE.xlsm
    212.8 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Bonjour.
Votre procédure CalculPoidsV est incohérente à plusieurs points de vue :
1 — Vous chargez l'intégralité des données, ça c'est bien, dans des tableaux mis dans des Variant, un peu moins bien, mais à chaque passage dans la boucle au lieu d'une seule fois avant celle ci, pas bon du tout.
2 — Vous essayez de les utiliser dans des instructions qui ne les acceptent pas. Avec leurs éléments indicés ça irait mieux
3 — Le résultat n'est conservé nulle part après exécution.
 

eriiic

XLDnaute Barbatruc
Bonjour,
1631012354843.png

il ne faut mettre As Variant que quand c'est voulu.
Il faut typer au plus près de son utilisation.
Si une variable est numérique c'est As Double, ou As Long si entier.
Quand tu as l'erreur, espionne tes variables. Tu dois en avoir une typée Variant/String sans doute => erreur 13

J'ai repéré une autre anomalie aussi :
1631012354843.png

Cls étant un tableau, ça plante...
eric
 

Dranreb

XLDnaute Barbatruc
Est-ce que ceci ne conviendrait pas ? :
VB:
Sub CalculPoidsV()
   Feuil3.[I2].Resize(Feuil3.[J1000000].End(xlUp).Row - 1).FormulaR1C1 = "=IFERROR(RC10/CHOOSE(MATCH(RC11," _
      & "{""E+"";""E="";""E-"";""U+"";""U="";""U-"";""R+"";""R="";""R-""},0),0.67,0.67,0.66,0.65,0.64,0.63,0.62,0.61,0.61),"""")"
   End Sub
 

Dranreb

XLDnaute Barbatruc
Version très légèrement plus courte :
VB:
Sub CalculPoidsV()
   Feuil3.[I2].Resize(Feuil3.[J1000000].End(xlUp).Row - 1).FormulaR1C1 = "=IFERROR(RC10*100/(MIN(MAX(MATCH(" _
      & "LEFT(RC11,1),{""R"";""U"";""E""},0)*3+MATCH(RIGHT(RC11,1),{""-"";""="";""+""},0)+56,61),67)),"""")"
   End Sub
 

Discussions similaires

Réponses
49
Affichages
1 K
Réponses
9
Affichages
300

Statistiques des forums

Discussions
314 638
Messages
2 111 475
Membres
111 161
dernier inscrit
KARIMTAPSO