Erreur incompatibilité de type

amiro2017 Messages postés 207 Statut Membre -  
ThauTheme Messages postés 1564 Statut Membre -
bonsoir le forum,

je suis débutant en vba cependant j'ai eu un problème dans mon code , en effet l'erreur est de compatibilité lors je séléctionne des réelles de type standards de feuille excel dans une matrice des réelles :

voici le code où me paraît l'erreur

Dim e() As Double
ReDim e(2 To dernier, 1 To 5)
Dim e1() As Double
ReDim e1(2 To dernier, 4 To 5)
ReDim e(2 To dernier, 1 To 5)
For j = 2 To dernier
e(j, 1) = Sheets("Risque de taux d'intérêt").Range("D" & j).Value
e(j, 2) = Sheets("Risque de taux d'intérêt").Range("E" & j).Value
e(j, 3) = Sheets("Risque de taux d'intérêt").Range("F" & j).Value
e1(j, 4) = Sheets("Risque de taux d'intérêt").Range("K" & j).Value 'l'erreur ici
e1(j, 5) = Sheets("Risque de taux d'intérêt").Range("L" & j).Value
Next j
  


je vous remerciee d'avance

6 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonsoir Amiro, bonsoir le forum,

    Plusieurs problèmes dans ton bout de code :
    • La variable dernier n'est ni définie ni initialisée. Donc elle vaut 0 et une boucle de 2 à 0 ne s'effectue qu'avec un pas (Step) négatif. Mais j'imagine que dans ton vrai code cela est fait...
    • tu redimensionnes deux fois le tableau e (pas grave non plus, mais une fois de trop)
    • tu attribues aux variables de e et e1 le type Double. Il y aura donc plantage si tu tombes sur du texte ou sur une valeur non compatible avec ce type. C'est peut-être ce qui se passe dans la ligne qui plante.

    Tu pourrais contourner avec un code du type :

    Dim dernier As Integer
    Dim e(2 To dernier, 1 To 5) As Double
    Dim e1(2 To dernier, 4 To 5) As Double
    dernier = 10 'à adapter à ton cas
    
    For J = 2 To dernier
        On Error Resume Next
        e(J, 1) = CDbl(Sheets("Risque de taux d'intérêt").Range("D" & J).Value)
        If Err <> 0 Then
            Err.Clear
            e(J, 1) = 0 'à adapter
        End If
        e(J, 2) = CDbl(Sheets("Risque de taux d'intérêt").Range("E" & J).Value)
        If Err <> 0 Then
            Err.Clear
            e(J, 2) = 0 'à adapter
        End If
        e(J, 3) = CDbl(Sheets("Risque de taux d'intérêt").Range("F" & J).Value)
        If Err <> 0 Then
            Err.Clear
            e(J, 2) = 0 'à adapter
        End If
        e1(J, 4) = CDbl(Sheets("Risque de taux d'intérêt").Range("K" & J).Value) 'l'erreur ici
        If Err <> 0 Then
            Err.Clear
            e1(J, 4) = 0 'à adapter
        End If
        e1(J, 5) = CDbl(Sheets("Risque de taux d'intérêt").Range("L" & J).Value)
        If Err <> 0 Then
            Err.Clear
            e1(J, 5) = 0 'à adapter
        End If
        On Error GoTo 0
    Next J
    


    0
    1. amiro2017 Messages postés 207 Statut Membre 1
       
      bonsoir ThauTheme ,

      je vous remercie pour votre commentaire cependant j'ai déjà déclaré dernier comme étant le nombre de lignes non vides d'une colonne

      dim dernier as integer
      dernier = Range("B:B").End(xlDown).Row


      et lorsque j'ai injecté votre proposition une erreur de compilation " constante requise " sachant que j'ai déjà mettre dernier=10 et mettre dernier = Range("B:B").End(xlDown).Row comme commentaire

      je ne sais pas alors le problème où?
      0
      1. ThauTheme Messages postés 1564 Statut Membre 160 > amiro2017 Messages postés 207 Statut Membre
         
        Bonjour Amiro, bonjour le forum,

        Sans, au pire, le code complet et au mieux, le fichier, il nous sera difficile de t'aider...

        Essaie cela :

        Dim dernier As Integer
        Dim e(2 To dernier, 1 To 5) As Double
        Dim e1(2 To dernier, 4 To 5) As Double
        dernier = Cells(Application.Rows.Count, "B").End(xlUp).Row
        
        For J = 2 To dernier
            On Error Resume Next
            e(J, 1) = CDbl(Sheets("Risque de taux d'intérêt").Range("D" & J).Value)
            If Err <> 0 Then
                Err.Clear
                e(J, 1) = 0 'à adapter
            End If
            e(J, 2) = CDbl(Sheets("Risque de taux d'intérêt").Range("E" & J).Value)
            If Err <> 0 Then
                Err.Clear
                e(J, 2) = 0 'à adapter
            End If
            e(J, 3) = CDbl(Sheets("Risque de taux d'intérêt").Range("F" & J).Value)
            If Err <> 0 Then
                Err.Clear
                e(J, 2) = 0 'à adapter
            End If
            e1(J, 4) = CDbl(Sheets("Risque de taux d'intérêt").Range("K" & J).Value) 'l'erreur ici
            If Err <> 0 Then
                Err.Clear
                e1(J, 4) = 0 'à adapter
            End If
            e1(J, 5) = CDbl(Sheets("Risque de taux d'intérêt").Range("L" & J).Value)
            If Err <> 0 Then
                Err.Clear
                e1(J, 5) = 0 'à adapter
            End If
            On Error GoTo 0
        Next J
        0
      2. amiro2017 Messages postés 207 Statut Membre 1 > ThauTheme Messages postés 1564 Statut Membre
         
        bonjour ThauTheme , bonjour à tous

        je vous remercie encore ,

        j'ai implimenté cette proposition cependant une erreur clique dernier en disant que "une constate requise "

        voici le code en faite c'est un bouton de calcul:

        Private Sub CommandButton6_Click()
        
        Dim i As Integer, j As Integer
        Dim v() As Double, c() As Double
        ReDim v(20)
        ReDim c(20)
        Dim dernier As Integer
        
        Sheets("Approche_standards").Activate
        
        'If (dernier = 0) Then MsgBox ("Votre portefeuille est vide , Veuillez la remplir s'il vous plaît ")
              
        
        Dim e(2 To dernier, 1 To 5) As Double
        Dim e1(2 To dernier, 4 To 5) As Double
        dernier = Cells(Application.Rows.Count, "B").End(xlUp).Row
         'à adapter à ton cas
        
        For j = 2 To dernier
            On Error Resume Next
            e(j, 1) = CDbl(Sheets("Risque de taux d'intérêt").Range("D" & j).Value)
            If Err <> 0 Then
                Err.Clear
                e(j, 1) = 0 'à adapter
            End If
            e(j, 2) = CDbl(Sheets("Risque de taux d'intérêt").Range("E" & j).Value)
            If Err <> 0 Then
                Err.Clear
                e(j, 2) = 0 'à adapter
            End If
            e(j, 3) = CDbl(Sheets("Risque de taux d'intérêt").Range("F" & j).Value)
            If Err <> 0 Then
                Err.Clear
                e(j, 2) = 0 'à adapter
            End If
            e1(j, 4) = CDbl(Sheets("Risque de taux d'intérêt").Range("K" & j).Value) 'l'erreur ici
            If Err <> 0 Then
                Err.Clear
                e1(j, 4) = 0 'à adapter
            End If
            e1(j, 5) = CDbl(Sheets("Risque de taux d'intérêt").Range("L" & j).Value)
            If Err <> 0 Then
                Err.Clear
                e1(j, 5) = 0 'à adapter
            End If
            On Error GoTo 0
        Next j
        
          
        For j = 2 To dernier
        For i = 1 To 3
        
        If (Abs(e(j, i)) <= 0.083333333 And e(j, i) > 0) Then
        v(1) = 0
        c(1) = c(1) + (e1(j, 4)) * 0
        ElseIf (Abs(e(j, i)) <= 0.083333333 And e(j, i) > 0) Then
        c(1) = c(1) + (e1(j, 5)) * 0
        End If
        
        If (Abs(e(j, i)) > 0.083333333 And Abs(e(j, i)) <= 0.25 And e(j, i) > 0) Then
        v(2) = 0.002
        c(2) = c(2) + e1(j, 4) * v(2)
        ElseIf (Abs(e(j, i)) > 0.083333333 And Abs(e(j, i)) <= 0.25 And e(j, i) < 0) Then
        c(2) = c(2) + e1(j, 5) * v(2)
        End If
        
        If (Abs(e(j, i)) > 0.25 And Abs(e(j, i)) <= 0.5 And e(j, i) > 0) Then
        v(3) = 0.004
        c(3) = c(3) + (e1(j, 4)) * v(3)
        ElseIf (Abs(e(j, i)) > 0.25 And Abs(e(j, i)) <= 0.5 And e(j, i) < 0) Then
        c(3) = c(3) + (e1(j, 5)) * v(3)
        End If
        
        If Abs(e(j, i)) >= 0.5 And Abs(e(j, i)) <= 1 And e(j, i) > 0 Then
        v(4) = 0.007
        c(4) = c(4) + (e1(j, 4)) * v(4)
        ElseIf Abs(e(j, i)) >= 0.5 And Abs(e(j, i)) <= 1 And e(j, i) < 0 Then
        c(4) = c(4) + (e1(j, 5)) * v(4)
        End If
        
        If Abs(e(j, i)) > 1 And Abs(e(j, i)) <= 2 And e(j, i) > 0 Then
        v(5) = 0.0125
        c(5) = c(5) + (e1(j, 4)) * v(5)
        ElseIf Abs(e(j, i)) > 1 And Abs(e(j, i)) <= 2 And e(j, i) < 0 Then
        c(5) = c(5) + (e1(j, 5)) * v(5)
        End If
        
        If Abs(e(j, i)) > 2 And Abs(e(j, i)) <= 3 And e(j, i) > 0 Then
        v(6) = 0.0175
        c(6) = c(6) + (e1(j, 4)) * v(6)
        ElseIf Abs(e(j, i)) > 2 And Abs(e(j, i)) <= 3 And e(j, i) < 0 Then
        c(6) = c(6) + (e1(j, 5)) * v(6)
        End If
        
        If Abs(e(j, i)) > 3 And Abs(e(j, i)) <= 4 And e(j, i) > 0 Then
        v(7) = 0.0225
        c(7) = c(7) + (e1(j, 4)) * v(7)
        ElseIf Abs(e(j, i)) > 2 And Abs(e(j, i)) <= 3 And e(j, i) < 0 Then
        c(7) = c(7) + (e1(j, 5)) * v(7)
        End If
        
        
        If Abs(e(j, i)) > 4 And Abs(e(j, i)) <= 5 And e(j, i) > 0 Then
        v(8) = 0.0275
        c(8) = c(8) + (e1(j, 4)) * v(8)
        ElseIf Abs(e(j, i)) > 4 And Abs(e(j, i)) <= 5 And e(j, i) > 0 Then
        c(8) = c(8) + (e1(j, 5)) * v(8)
        End If
        
        
        If Abs(e(j, i)) > 5 And Abs(e(j, i)) <= 7 And e(j, i) > 0 Then
        v(9) = 0.0325
        c(9) = c(9) + (e1(j, 4)) * v(9)
        ElseIf Abs(e(j, i)) > 5 And Abs(e(j, i)) <= 7 And e(j, i) < 0 Then
        c(9) = c(9) + (e1(j, 5)) * v(9)
        End If
        
        If Abs(e(j, i)) > 7 And Abs(e(j, i)) <= 10 And e(j, i) > 0 Then
        v(10) = 0.0375
        c(10) = c(10) + (e1(j, 4)) * v(10)
        ElseIf Abs(e(j, i)) > 7 And Abs(e(j, i)) <= 10 And e(j, i) > 0 Then
        c(10) = c(10) + (e1(j, 5)) * v(10)
        End If
        
        If Abs(e(j, i)) > 10 And Abs(e(j, i)) <= 15 And e(j, i) > 0 Then
        v(11) = 0.045
        c(11) = c(11) + (e1(j, 4)) * v(11)
        ElseIf Abs(e(j, i)) > 10 And Abs(e(j, i)) <= 15 And e(j, i) < 0 Then
        c(11) = c(11) + (e1(j, 5)) * v(11)
        End If
        
        If Abs(e(j, i)) > 15 And Abs(e(j, i)) <= 20 And e(j, i) > 0 Then
        v(12) = 0.0525
        c(12) = c(12) + (e1(j, 4)) * v(12)
        ElseIf Abs(e(j, i)) > 15 And Abs(e(j, i)) <= 20 And e(j, i) > 0 Then
        c(12) = c(12) + (e1(j, 5)) * v(12)
        End If
        
        If Abs(e(j, i)) > 20 And e(j, i) > 0 Then
        v(13) = 0.06
        c(13) = c(13) + (e1(j, 4)) * v(13)
        ElseIf Abs(e(j, i)) > 20 And e(j, i) < 0 Then
        c(13) = c(13) + (e1(j, 5)) * v(13)
        
        End If
        
        Next i
        Next j
        
        Dim s As Double, s1 As Double, s2 As Double, s3 As Double, x As Double, x1 As Double, x2 As Double, x3 As Double, t1 As Double
        s = 0
        For i = 1 To 20 'première comosante
        s = s + c(i)
        Next i
        MsgBox (s)
        s1 = 0
        For i = 1 To 4
        s1 = s1 + c(i)
        Next i
        s2 = 0
        For i = 5 To 7
        s2 = s2 + c(i)
        Next i
        s3 = 0
        For i = 8 To 14
        s3 = s3 + c(i)
        Next i
        
        If (s1 < 0 And s2 > 0) Or (s1 > 0 And s2 < 0) Then
        x = Application.WorksheetFunction.Min(Abs(s1), Abs(s2))
        End If
        
        If (s1 < 0 And s3 > 0) Or (s1 > 0 And s3 < 0) Then
        x1 = Application.WorksheetFunction.Min(Abs(s1), Abs(s2))
        End If
        
        If (s1 < 0 And s2 > 0) Or (s1 > 0 And s2 < 0) Then
        x2 = Application.WorksheetFunction.Min(Abs(s1), Abs(s2))
        End If
        
        If (s3 < 0 And s2 > 0) Or (s3 > 0 And s2 < 0) Then
        x3 = 0.45 * Application.WorksheetFunction.Min(Abs(s1), Abs(s2))
        End If
        
         t1 = x + x1 + x2 + x3 '2ème composante
        Dim c1 As Integer, r2 As Integer, r3 As Integer, r1 As Integer, ii As Integer, ii1 As Integer, ii2 As Integer, total As Double, t2 As Double
        
        For ii = 1 To 4
        If c(ii) < 0 Then
        r1 = Abs(c(ii)) * 0.4 + c1
        End If
        Next ii
        
        For ii1 = 5 To 8
        If c(ii1) < 0 Then
        r2 = r2 + 0.3 * Abs(c(ii1))
        End If
        Next ii1
        
        For ii2 = 9 To 14
        If c(ii2) < 0 Then
        r3 = r3 + 0.3 * Abs(c(ii2))
        End If
        Next ii2
        
        t2 = r1 + r2 + r3
        total = t1 + t2 + s
        
        TextBox1.Value = total
        
        End Sub
        
        
        0
  2. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Amiro,

    Désolé Amiro, tu ne précise pas quelle est la ligne qui plante et sans le fichier je serais incapable de t'aider...

    J'ai juste repéré une erreur ici (mais je ne pense pas que ton problème sois là). Remplace la partie :
    e(j, 3) = CDbl(Sheets("Risque de taux d'intérêt").Range("F" & j).Value)
        If Err <> 0 Then
            Err.Clear
            e(j, 2) = 0 'à adapter
        End If


    par :
    e(j, 3) = CDbl(Sheets("Risque de taux d'intérêt").Range("F" & j).Value)
        If Err <> 0 Then
            Err.Clear
            e(j, 3) = 0 'à adapter
        End If


    0
  3. amiro2017 Messages postés 207 Statut Membre 1
     
    bonjour ThauTheme,
    comment je peux vous importer le fichier?
    0
  4. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Par exemple : https://www.cjoint.com/

    0
    1. amiro2017 Messages postés 207 Statut Membre 1
       
      merci beaucoup
      voici le fichier

      http://www.cjoint.com/c/GCrk5anMDDq
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Amiro,

    Écoute, je suis pas devin ! Décris moi précisément ce que je dois faire (activer quel onglet, lancer quel userform, le remplir avec quelles données) pour obtenir l'erreur que tu cites. Et je pourrais peut-être comprendre et t'aider... Si tu ne fais pas d'effort, je n'en ferai pas non plus !
    0
    1. amiro2017 Messages postés 207 Statut Membre 1
       
      Bonjour ThauTheme,

      je vous explique : en effet le but est de calcul de risque générale de marché par la méthode d'échénace .donc je veux automatiser cette méthode par le userform n°6.Ainsi vous avez le userform n°6 et la feuille excel "approche standards"

      l'utisateur fait alors l'etude d'une portefeuille contenant des instruments financiers il va donc enregistrer les données spécifiques pour chaque instrument par la suite ils enregiste ces données en appayant sur ajouter .Par la suite le but est le calcul de risque générale selon la méthode que j'ai implimenté

      Si vous pouvez comprendre la méthode de calcul elle est expliqué par cet exemple :
      http://www.osfi-bsif.gc.ca/Fra/fi-if/rg-ro/gdn-ort/gl-ld/Pages/CAR_chpt9.aspx#ToCAnnexe97Exempledecalculdurisquedechangeselonlam%c3%a9thodesimplifi%c3%a9e

      mais la base de ma automatisation est basé sur le tableau clé ceci:

      http://www.osfi-bsif.gc.ca/Fra/fi-if/rg-ro/gdn-ort/gl-ld/Pages/CAR_chpt9.aspx#ToCdemarch%c3%a9

      j'ai pu comprendre cette méthode elle est simple comme vous pouvez voir.Cependant la contrainte est dans sa automatisation

      je vous remercie d'avance!!
      0
  7. ThauTheme Messages postés 1564 Statut Membre 160
     
    Re,

    Amiro, je t'avoue que la bourse est quelque chose qui va complètement à l'encontre de mon étique personnelle. Alors, aller me former sur tes liens il n'en n'est absolument pas question. En revanche, si tu me donnes un exemple précis des données permettant de remplir l'UserForm6, qui vont provoquer l'erreur qui te pose problème, je suis disposer à regarder. Sinon, je passe la main...
    0
    1. amiro2017 Messages postés 207 Statut Membre 1
       
      c'est pas grave , je déciderai de résolver ma problème moi-même
      souhaitant à vous bonne week-end
      relax-toi
      0
      1. ThauTheme Messages postés 1564 Statut Membre 160 > amiro2017 Messages postés 207 Statut Membre
         
        Re,

        Bon week-end à toi aussi, et bonne chance...
        0