Problème de référencement circulaire

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Guillaume

XLDnaute Nouveau
Bonjour,

J'ai un problème avec mon programme VBA.
Quand je le lance dans mon environnement de développement, il fonctionne parfaitement et me renvoie la bonne valeur.
Par contre quand je le lance à partir de ma feuille Excel, il m'avertit d'un problème de référencement circulaire et m'affiche tout le temps la valeur 0.

Je fais d'abord une recherche sur la feuille 'OPCVM_BLOOMBERG' pour trouver une valeur 'isin2' et je fais ensuite une autre recherche dans un tableau situé sous la valeur 'isin2' (composé de date) pour trouver deux dates différentes ('31/04/2010' et '32/04/2010'). Je fais cette recherche en type 'string' parce que je n'ai pas réussi à l'effectuer avec des types 'date'
Une fois que je les aie trouvé je prend la valeur de la case à droite de chacune de ces dates. et j'effectue une opération toute bête dessus.

Quand je lance ce programme dans mon environnement de développement, il marche parfaitement, mais à partir de ma feuille excel il s'exécute partiellement plusieurs fois. Il s'arrête tout le temps juste avant la dernière division, redémarre et au bout d'un moment s'arrête complétement en me renvoyant la valeur zéro.

Est-ce quelqu'un a une idée sur le pourquoi?
Cordialement,
Guillaume

Code:
Function perf_mois() As Integer

Dim isin2 As String
Dim CaseIsin, CaseJour, CaseJourMoisPrecedent, LigneIsin As Range
Dim jour As Date
Dim prix_moix, prix_mois_precedent As Integer


jour2 = "32/04/2010"
jour = "31/04/2010"
isin2 = "FR0010096552 " 
Debug.Print Val(jour2)
Sheets ("OPCVM_BLOOMBERG") 'sélectionne la feuille OPCVM BLOOMBERG 
colonneIsin = Application.WorksheetFunction.Match(isin2, Rows("4"), 0) 'recherche le code isin sur la ligne 4
Cells(7, colonneIsin).Select 'selectionne la première des dates du bon code isin

Set c = Columns(colonneIsin)

CaseJour = Application.WorksheetFunction.Match(jour, c, 0) 'trouve la case avec la bonne date ou celle la plus élevée qui lui est inférieure
Cells(CaseJour, colonneIsin).Select
CasePrix = ActiveCell.Offset(0, 1).Select 'selectionne la case à droite de la case où se trouve la bonne date (ou celle juste inférieure à celle-ci)
prix_mois = Selection.Value 'prend la valeur de la case à droite de la case où se trouve la bonne date (ou celle juste inférieure à celle-ci)

CaseJourMoisPrecedent = Application.WorksheetFunction.Match(jour2, c, 0) 'trouve la case avec la bonne date ou celle la plus élevée qui lui est inférieure
Cells(CaseJourMoisPrecedent, colonneIsin).Select
CasePrixMoisPrecedent = ActiveCell.Offset(0, 1).Select ' selectionne la case à droite de la case où se trouve la date de fin du mois précédent (ou celle juste inférieure à celle-ci)
prix_mois_precedent = Selection.Value ' prend la valeur de la case à droite de la case où se trouve la date de fin du mois précédent (ou celle juste inférieure à celle-ci)
prix_mois_precedent2 = prix_mois_precedent
prix_mois2 = prix_mois


perf_mois = (prix_mois2 / prix_mois_precedent2)
Debug.Print perf_mois

End Function

PS: mon fichier excel est trop volumineux pour être mis en pièce jointe.
 
Re : Problème de référencement circulaire

Bonjour Guillaume,
Je ne sais pas si je pourrais t'aider(je ne suis pas chez moi) mais il serait préférable de nous fournir un fichier exemple.
Personnellement je ne comprend pas:
Comment ton code peux fonctionner en cherchant le 32/04 😕
Tu utilise une fonction sans déclarer de valeur à prendre en copmpte.
"colonneIsin" ne semble pas exister.
Etc...
A te relire, moi ou un autre...
Cordialement
 
Dernière édition:
Re : Problème de référencement circulaire

Salut Guillaume et le forum
Quand je le lance dans mon environnement de développement, il fonctionne parfaitement et me renvoie la bonne valeur.
Par contre quand je le lance à partir de ma feuille Excel, il m'avertit d'un problème de référencement circulaire et m'affiche tout le temps la valeur 0.
C'est quoi un environnement de développement ?
Je fais cette recherche en type 'string' parce que je n'ai pas réussi à l'effectuer avec des types 'date'
Tu as déjà la réponse au poste ci-dessus

quelques autres remarques :
mon fichier excel est trop volumineux pour être mis en pièce jointe
Ton fichier de travail très certainement ! Mais un fichier d'essai ne comporte qu'une dizaine de lignes, juste assez pour comprendre le problème
Code:
Function perf_mois() As Integer
Je ne comprend pas trop : tu utilises une fonction sans paramètres (mais ça...)
Tu espère retirer un nombre entier du résultat d'une division ? Ce ne devrait pas être un double plutôt ?
Code:
Dim CaseIsin, CaseJour, CaseJourMoisPrecedent, LigneIsin As Range
Dim prix_moix, prix_mois_precedent As Integer
Tu déclares LigneIsin en range et prix_mois_precedent en integer (donc, en supprimant la partie décimale) et toutes tes autres variables en VARIANT. Exprès ou pas ? Et jour2 ? Si tu l'avais déclaré en Date, tu aurais vu un problème.
Code:
Debug.Print Val(jour2)
Moi aussi, je mets un tas d'instructions pendant mes tests. Mais j'essais de nettoyer mon code avant de la publier...
Sheets ("OPCVM_BLOOMBERG") 'sélectionne la feuille OPCVM BLOOMBERG
Non ! Déjà, sélectionner est souvent une connerie... mais là, tu ne la sélectionne, ni l'active d'aucune manière(pas de méthode ou de propriété d'appliquée).
Code:
colonneIsin = Application.WorksheetFunction.Match(isin2, Rows("4"), 0)
Déjà, tu utilises une fonction de feuille de calcul => retourne une valeur que tu mets dans une variable qui se met au format de ta réponse (vraisemblablement string, ou date ?)
Code:
CaseJour = Application.WorksheetFunction.Match(jour, c, 0) 'trouve la case avec la bonne date ou celle la plus élevée qui lui est inférieure
Pas sûr étant plus anglophobe qu'anglophone ^^
Match => fonction EQUIV() en français. Et dans ce cas, l'aide nous dit :
Si la valeur de l'argument type est 0, la fonction EQUIV trouve la première valeur exactement équivalente à celle de l'argument valeur_cherchée. Les valeurs de l'argument matrice_recherche peuvent être placées dans un ordre quelconque
Code:
Cells(CaseJour, colonneIsin).Select
CasePrix = ActiveCell.Offset(0, 1).Select 'selectionne la case à droite de la case où se trouve la bonne date (ou celle juste inférieure à celle-ci)
Je trouve absolument aberrant d'utiliser Select... mais bon. Un coup de baguette magique et on aurait :
Code:
 set CasePrix = Cells(CaseJour, colonneIsin).Offset(0, 1)
Ouais, je milite pour diminuer la longueur des codes...

Comme j'en ai assez, j'arrête là. Moi, ce que je ne comprends pas c'est
Quand je le lance dans mon environnement de développement, il fonctionne parfaitement et me renvoie la bonne valeur.
Ce serait bien que tu m'indiques où je peux trouver le même ?
A+
 
Dernière édition:
Re : Problème de référencement circulaire

Salut Gorfael et le forum,

Tout d'abord désolé pour le fouillis dans mon code, je l'ai envoyé dans un moment d'épuisement et sans me relire assez.
C'est quoi un environnement de développement ?
J'appelle l'environnement de développement (je ne sais pas si c'est le nom exact, je l'ai trouvé dans un tuto sur un autre site) la fenêtre où on tape le code VBA. Quand je simule mon code dans cette fenêtre, le
Code:
print.debug perf_mois
écrit à la fin de mon programme me renvoie la bonne valeur dans la fenêtre d'éxécution (en l'occurence 6).
Par contre quand je lance la fonction à partir d'une case excel j'ai le droit à un " #VALEUR! ".

J'utilise une fonction sans paramètre juste pour faire des tests. A terme je rentrerais les valeurs de "jour" et "isin".

Au sujet du code, j'ai essayé de mieux le nettoyer ci -dessous:

Code:
Function perf_mois() As Double

Dim colonneIsin As Range
Dim prix_moix, prix_mois_precedent As Long
Dim c, MaPlage As Range

Set colonneIsin = Range("A1")

jour = "31/04/2010"
isin = "FR0010096552 equity isin"

Set MaPlage = ThisWorkbook.Worksheets(1).Rows("4")
colonneIsin = Application.WorksheetFunction.Match(isin, MaPlage, 0) 'recherche le texte isin sur la ligne 4 de la feuille 1

Set c = Columns(colonneIsin)

CaseJour = Application.WorksheetFunction.Match(jour, c, 0) 'trouve la case avec la bonne date
Set CasePrix = Cells(CaseJour, colonneIsin).Offset(0, 1) 'récupére la valeur de la case à droite de celle où se trouve la bonne date

perf_mois = CasePrix
Debug.Print perf_mois

End Function
Avez-vous une idée s'il vous plaît?

Guillaume

PS: merci Gorfael pour tes remarques sur les select, je ne savais pas qu'on pouvait faire comme ça 🙂.
PPS: j'ai aussi un soucis quand je fais une recherche avec la fonction match() et le paramètre type égal à 1. Comment réagit cette fonction avec une recherche sur un string ou une date s'il vous plaît?
PPPS: fichier excel exemple en pièce jointe.
 

Pièces jointes

Re : Problème de référencement circulaire [RESOLU]

Youpi j'ai trouvé mon erreur.
En fait la fonction Match me renvoyait un double que je forçais en Range. Quand je lançais la fonction depuis environnement de développement, il ne m'affichait pas d'erreur et je pense qu'il "recalibrait" automatiquement ma variable en double ou en int.
Par contre lorsque je la lançais depuis une feuille excel là il m'affichait une erreur de type #VALEUR! .
Problème résolu 😀
Merci pour votre aide en tout cas.

Guillaume
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
2 K
G
Retour