Problème incompatibilité type Excel VBA (Help, Stagiaire en détresse!)

Problème incompatibilité type Excel VBA (Help, Stagiaire en détresse!) - VB/VBA/VBS - Programmation

Marsh Posté le 27-05-2011 à 09:30:51    

Bonjour,
 
Je viens vous demander votre aide car après avoir cherché partout et m'être arraché les cheveux hier, aujourd'hui, ca ne fonctionne toujours pas...
 
La macro ci-dessous plante pour un "incompatibilité type" au niveau de la fonction Alpha Jensen, lorsque je lance la sub.
 
Si je désactive la function dans la sub, tout toutrne correctement (autres sub appelées et autre fonction).
 
Merci de votre aide.
 
bonne journée  
 
 
   Sub jensen()
Dim jensen As Variant
Dim rg_jensen As Variant
Dim beta As Variant
Dim funds As Variant
Dim rr As Variant
Dim rma As Variant
 
Application.Calculation = xlCalculationManual
 
nb_actions = ThisWorkbook.Worksheets.Count - 10
nb_periodes = ThisWorkbook.Worksheets("Titre" ).Range("F2" ).Value - 36
ReDim rg_jensen(10, nb_actions)
 
refer = InputBox("Choississez l'indice de référence du calcul des Betas (S&P 500, Emerging markets Index...), en entrant le code yahoo!Finance de l'indice Choisi", "Choix de l'indice de référence", "^GSPC" )
risk = InputBox("Choississez l'indice de référence indiquant le Taux sans Risque (T-Bills, OAT, Bunds...), en entrant le code yahoo!Finance de l'indice Choisi", "Choix de l'indice de référence", "^IRX" )
 
Set rg_market = Range("C3" ).Resize(35, 1)
Set rg_fund = Range("D3" ).Resize(35, 1)
Set rg_risk = Worksheets(risk).Range("E3" ).Resize(35, 1)
rma = rg_market.Value
rr = rg_risk.Value
funds = rg_fund.Value
 
j = 0
 
For Each Feuille In ThisWorkbook.Worksheets
        If Feuille.Name = "Titre" Then GoTo FIN
            Feuille.Activate
             
            Call Calcule_Beta
             
            j = j + 1
             
            Set rg_fund = Range("K3" ).Resize(89, 1)
            Set rg_bet = Range("N3" ).Resize(89, 1)
            Set rg_market = Worksheets(refer).Range("K3" ).Resize(89, 1)
            Set rg_risk = Worksheets(risk).Range("K3" ).Resize(89, 1)
             
            bet = rg_bet.Value
            rma = rg_market.Value
            rr = rg_risk.Value
            funds = rg_fund.Value
             
            For i = 1 To 10
            rg_jensen = fnAlpha(rg_jensen, funds, rma, rr, bet, i, j)
            Next i
             
Next Feuille
     
FIN:
    Worksheets("Alpha de Jensen" ).Activate
    Range("A3" ).Select
    Range(Selection, Selection.Offset(10, nb_actions)).Value = rg_jensen          
Application.Calculation = xlCalculationAutomatic
 
    End Sub
 
    Function fnAlpha(rg_jensen, funds, rma, rr, bet, i, j)
 
rg_jensen(i, j) = (funds(i, 1)) - (rr(i, 1) + (bet(i, 1) * (rma(i, 1) - rr(i, 1))))
 
    End Function
 
 
 
 
    Sub Calcule_Beta()
 
Dim rg_rm As Range
Dim rg_fond As Range
Dim rg_beta As Range
Dim marché As Variant
Dim fond As Variant
Dim beta As Variant
 
ReDim modi(36, 1)
 
For i = 1 To nb_periodes
 
Set rg_fond = ActiveSheet.Range("G2" ).Resize(36, 1).Offset(i - 1, 0)
Set rg_beta = ActiveSheet.Range("N2" ).Resize(1, 1).Offset(i - 1, 0)
Set rg_rm = Worksheets((refer)).Range("G2" ).Resize(36, 1).Offset(i - 1, 0)
 
marché = rg_rm.Value
fond = rg_fond.Value
 
beta = fnBeta(fond, marché)
rg_beta.Value = beta
Next i
 
    End Sub
 
 
    Function fnBeta(fond, marché)
fnBeta = WorksheetFunction.Covar(fond, marché) / WorksheetFunction.VarP(marché)
 
     End Function


Message édité par metalikal le 27-05-2011 à 13:22:19
Reply

Marsh Posté le 27-05-2011 à 09:30:51   

Reply

Marsh Posté le 27-05-2011 à 11:14:22    

J'apporte un peu plus de précisions à ma demande.
 
En fait, il s'agit d'une sub visant à calculer des alphas de jensen sur des périodes de 36 mois glissants.
 
dans un premier temps la sub calcul_beta (et la fonction fnBeta) calculent les bêta sur 36 mois glissant.
 
dans un second temps, j'utilise les plages rg_bet (beta précédemment calculés), rg_risk, rg_funds, etc... pour calculer mes alphas de jensen pour chaque période (en décalant de i=1 to 10 à chaque fois) et pour chaque feuille (j = j+1 à chaque feuille).
Les résultats étant stocké dans le variant rg_jensen, qui ensuite apparait dans la sheet "alpha de jensen".
 
J'espère avoir été clair,
 
Merci de votre aide.

Reply

Marsh Posté le 27-05-2011 à 14:19:37    

il y a un problème avec la variable qui s'appelle rg_jensen.
Il faut que son type reste le même. On ne pas avoir de temps en temps un nombre, et de temps en temps un tableau.
 
Il faut avoir des variables différentes pour contenir des choses différentes.
C'est un principe fondamental en programmation.
D'ailleurs, c'est à peu près ce que dit la première règle de normalisation de E. Codd (mais hélas, les merveilleuses règles de normalisation sont trop peu enseignées dans les écoles).

Reply

Marsh Posté le 17-04-2012 à 10:50:04    

Bonjour !!
 
J'ai besoin d'aide à mon avis cela ne prendra pas énormément de votre temps. Etant une bille en VB je me tourne vers ce forum.
J'ai le code suivant :  
 
 
Private Sub CommandButton1_Click()
Dim objConn As Connection, objRS As Recordset
Dim mabd As String, chemin As String, masource As String
Dim matable As String
Dim champ, nbchamp
Dim k, j, lig As Integer
 
' Chemin d'accès à la BD
chemin = "E:\excel_access\"
 
' Nom de la BD Access
mabd = "SYSMA.mdb"
 
' Construire la source
masource = chemin & mabd
 
' Pointer une connexion ouverte à une source de données.
Set objConn = CreateObject("adodb.connection" )
 
' Pointer le jeu d'enregistrements complet d'une table
Set objRS = CreateObject("adodb.recordset" )
 
' Ouvrir la connexion (Donc, la BD Access)
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & masource
 
' Nom de la table que je souhaite traiter
matable = "COMMANDE"
 
' Ouvrir ma table (Donc, ouvrir un objet RecordSet, le curseur pointe l'enr. n° 1)
 
objRS.Open matable, objConn, adOpenKeyset ' adopenKeyset pour recordcount
MsgBox "Nombre d'enr. dans la table : " & matable & " : " & objRS.RecordCount
 
' -------------------------------------
' Ecrire le nom de chaque champ à partir de A1(puis, B1, C1, ...)
k = 1
For Each champ In objRS.Fields
    Cells(1, k) = champ.Name
    k = k + 1
Next
nbchamp = objRS.Fields.Count
 
' -------------------------------------
' Ecrire chaque enregistrement... jusqu'au dernier
 
lig = 2 ' n° de la ligne du premier enregistrement dans la feuille Excel
 
' Tant que la fin de la table n'est pas atteinte
While Not objRS.EOF
 
   j = 0 ' Pour passer à la colonne suivante (champ suivant)
 
   ' Parcourir chaque champ de l'enregistrement courant
   For Each champ In objRS.Fields
        Cells(lig, 1 + j) = champ
        j = j + 1
   Next champ
   lig = lig + 1 ' passer à la ligne suivante
 
   ' Enregistrement suivant
   objRS.MoveNext
Wend
 
' Fermer la connexion
objRS.Close
objConn.Close
 
' Libérer les ressources
Set objRS = Nothing
Set objConn = Nothing
 
' Formater l'en-tête de chaque colonne
en_tete_colonne (nbchamp)
 
End Sub
 
 
La phrase en rouge ne marche pas !! Je ne trouve pas pourquoi !!
 
HELP
 
Merci !!

Reply

Marsh Posté le 17-04-2012 à 15:21:31    

Il ya deux solutions possibles
soit il faut cocher Microsoft ActiveX Data Objects x.x Library dans le sous-menu Références du menu Outils de l'éditeur VBA.
soit il faut remplacer la ligne que t'a écrite en rouge par
Dim objConn As New ADODB.Connection, objRs As New ADODB.Recordset
 
La prochaine fois, pose ta question dans un sujet séparé.

Reply

Marsh Posté le 17-04-2012 à 18:13:19    

Salut, par principe développer en Early Binding et s'il y a distribution le faire en Late Binding, lire : http://mhubiche.developpez.com/vba [...] e/binding/


---------------
Myanmar 90/91 : http://gadaud.gerard.free.fr/publi [...] index.html
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed