IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Interférence entre Collection et OLEObject. (bug ?)


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut Interférence entre Collection et OLEObject. (bug ?)
    Bonjour,
    Je tourne en rond sur un problème depuis plusieurs jours. La cause du problème m'est toujours aussi obscure...

    J'ai une variable globale Collection qui garde des données. Appelons la stack.
    Un bouton de la feuille de calcul (appelons le bouton1) permet de créer 4 données et de les ajouter dans stack. Tout cela marche à merveille.

    J'ai voulu ajouter dans la fonction de bouton1 la création dynamique de boutons dans la feuille de calcul comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Worksheets("main").OLEObjects.Add ClassType:="Forms.CommandButton.1", _
                                          Left:=2, _
                                          Width:=15, _
                                          Height:=12.5
    Et bien l'ajout de cette simple ligne fait purger stack de toutes ses données membres. Il suffit que je commente cette ligne pour que stack marche parfaitement à nouveau !

    Si vous voulez voir la chose en code, voici :
    Bouton1 appelle la fonction AddTrades.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub AddTrades()
      Call AddTrade 'ajout donnée 1
      Call AddTrade 'ajout donnée 2
      Call AddTrade 'ajout donnée 3
      Call AddTrade 'ajout donnée 4
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub AddTrade()
        Dim newTrade As New Trade
        Set newTrade = CreateTrade()
     
        'Add the new trade to the list of trades
        Dim key As String
        key = stack.Count + 1
        stack.Add Item:=newTrade, key:=key
     
        Worksheets("main").OLEObjects.Add ClassType:="Forms.CommandButton.1", _
                                          Left:=2, _
                                          Width:=15, _
                                          Height:=12.5
    End Sub
    Toute vague idée est bienvenue !

    Merci beaucoup.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Peut-on avoir tout le code ça permettra de gagner du temps

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut
    Impossible de donner le code complet. C'est plusieurs centaines de lignes réparties sur plusieurs modules / module de classe.

    Néanmoins, je peux donner un code plus détaillé pour la partie qui nous intéresse :

    Voici le code d'appel du bouton origine des évènements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub CommandButton1_Click()
        Application.ScreenUpdating = False
        Worksheets("main").Unprotect
     
        Call AddTrades(ToggleButton1, ToggleButton2, ToggleButton3, ToggleButton4, ToggleButton5, _
                       ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, iniO1L, iniO1C, iniO2L, iniO2C, iniO3L, iniO3C, _
                       iniO4L, iniO4C, iniSpotL, iniSpotC)
     
        Worksheets("main").Protect
        Application.ScreenUpdating = True
    End Sub
    La fonction AddTrades :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub AddTrades(T1, T2, T3, T4, T5, C1, C2, C3, C4, C5, li1, col1, li2, col2, li3, col3, li4, col4, li5, col5)
     
        If T1.value = True Then
            Call AddTrade(C1, li1, col1)
        End If
     
        If T2.value = True Then
            Call AddTrade(C2, li2, col2)
        End If
     
        If T3.value = True Then
            Call AddTrade(C3, li3, col3)
        End If
     
        If T4.value = True Then
            Call AddTrade(C4, li4, col4)
        End If
     
        If T5.value = True Then
            Call AddTrade(C5, li5, col5)
        End If
     
        Call DrawDelimitationLine
     
    End Sub
    La méthode AddTrade() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Sub AddTrade(Combo, ligne, colonne)
     
        Dim newTrade As New Trade
        Set newTrade = CreateTrade(Combo, ligne, colonne)
     
        'Add the new trade to the list of trades
        Dim key As String
        key = gTrades.Count + 1
        gTrades.Add Item:=newTrade, key:=key
     
        'Add the trade to the excel list
        Dim line As Range
        Set line = Worksheets("main").Range("B52").Offset(gTrades.Count, 0)
     
        Worksheets("main").OLEObjects.Add ClassType:="Forms.CommandButton.1", _
                                          Left:=2, _
                                          Width:=15, _
                                          Height:=12.5
     
        line.Offset(0, 0).value = newTrade.GetDealDate()
        line.Offset(0, 1).value = newTrade.GetDealType()
        line.Offset(0, 2).value = newTrade.GetVolume()
        line.Offset(0, 3).value = newTrade.GetDealUnderlyingPrice()
        line.Offset(0, 4).value = newTrade.GetStrike()
        line.Offset(0, 5).value = gTrades.Count
        line.Offset(0, 6).value = newTrade.GetTotalPremium()
        'TODO: change ?
        line.Offset(0, 7).value = Range("currentInterestRate").value
        line.Offset(0, 8).value = newTrade.GetDividend()
        line.Offset(0, 9).value = newTrade.GetMaturityDate()
        line.Offset(0, 10).value = newTrade.GetTimeLeftToMaturity()
        'line.Offset(0, 11).value =
        line.Offset(0, 12).value = newTrade.Price(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        'line.Offset(0, 13).value = 'Gain
        line.Offset(0, 14).value = "-"
        line.Offset(0, 15).value = newTrade.Delta(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 16).value = newTrade.Gamma(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 17).value = newTrade.Vega(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 18).value = newTrade.Theta(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 19).value = newTrade.Rho(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 20).value = newTrade.Delta(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 21).value = newTrade.Gamma(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 22).value = newTrade.Vega(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 23).value = newTrade.Theta(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
        line.Offset(0, 24).value = newTrade.Rho(Range("currentSpot").value, Range("currentInterestRate").value, Range("currentVolatility").value)
     
        'Paint the line in yellow
        Worksheets("main").Range(Cells(52, 2), Cells(52, 26)).Offset(gTrades.Count, 0).Interior.Color = RGB(255, 255, 153) 'Yellow
    End Sub
    Comme vous le voyez, le code est assez indépendant. N'hésitez pas à demander s'il vous faut autre chose.

    Tout ce code marche parfaitement si l'on commente la création de l'OLEObject. Et si on le garde, le code ajoute bien les 4 données et crée les 4 boutons, seulement, au deuxième appui sur le bouton d'origine, la liste gTrades est purgée. Ce comportement disparaît sitôt la création dynamique de bouton retirée.

    Merci encore,

    O.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Désolé, j'ai bien réfléchi mais je ne vois pas.
    Peut -être un autre

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut
    Citation Envoyé par JPierreM Voir le message
    Désolé, j'ai bien réfléchi mais je ne vois pas.
    Peut -être un autre
    La est bien le problème, j'ai l'impression que c'est un bug excel...

Discussions similaires

  1. Interférence entre $_SESSION["idToto"] et $idToto
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 28/04/2009, 18h11
  2. [Cookies] Empecher interférences entre sessions php
    Par reventlov dans le forum Langage
    Réponses: 4
    Dernier message: 04/06/2008, 11h33
  3. Interférence entre deux programmes
    Par eyquem dans le forum Général Python
    Réponses: 1
    Dernier message: 01/06/2008, 15h10
  4. [Struts-Layout] Différence entre collection et datagrid
    Par nabil148911 dans le forum Struts 1
    Réponses: 4
    Dernier message: 30/07/2007, 09h52
  5. Interférence entre références ?!
    Par janou dans le forum Access
    Réponses: 2
    Dernier message: 12/12/2005, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo