begin process at 2012 02 17 10:51:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Divers

 > 

Débutants

 > 

Référence circulaire en VBA sur Excel


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Référence circulaire en VBA sur Excel

mardi 29 mai 2007 à 12:30:38 | Référence circulaire en VBA sur Excel

nico971gwada

Bonjour,

J'ai fait une procédure qui appelle une fonction sous excel afin de calculer des pourcentages. En gros j'ai le résultat d'une enquete en ligne sous les yeux. Dans mon tableau il y a des lignes grises qui symbolisent les questions et en dessous de chaque ligne grise un ensemble de ligne (qui ne sont pas grises) remplies de 1 et de 0 et qui symbolisent le choix des différentes réponses possibles.
Le but est de pouvoir faire une colonne a la fin de mon tableau et qui pour chaque ligne de réponse me disent le pourcentage de choix. Sachant que dans la ligne grise représentant une question donnée j'ai une case indiquant le nombre de répondants.

voici un bout du code: (Je vous préviens, comme je viens de commencer le vba mon code risque de vous paraitre très sale)

Private Sub CalculerPourcentage(LigneCourante, NbReponses, Autre)

    Dim i, j As Integer
    Dim NbReponsesPositives, NbRepondants As Long
    Dim LigneReponse As Range
   
    NbRepondants = LigneCourante.Cells(1, 2)
       
    For i = 1 To NbReponses + Autre
        Set LigneReponse = LigneCourante.Offset(i, 0)
      
      LigneReponse.Cells(1, IntColMax + 1).Activate
      LigneReponse.Cells(1, IntColMax + 1).Formula = "=Personal.xls!Pourcentage()"
   
    Next
       
End Sub

Public Function Pourcentage() As Long
   
    Dim NbReponsesPositives As Long, NbRepondants As Long, NbColMax As Integer, NbRowMax As Integer
    Dim LigneReponse As Range, CaseNbRepondant As Range, Cellule As Range
    Dim i As Integer, j As Integer
   
    Set Cellule = ActiveCell
   
    Set LigneReponse = ActiveSheet.UsedRange.Rows(Cellule.Row)
    NbColMax = ActiveSheet.UsedRange.Columns.Count
    NbRowMax = ActiveSheet.UsedRange.Rows.Count
    i = 0
   
    While i < 20
        Set CaseNbRepondant = Cellule.Offset(-i, -Cellule.Column + 2)
        If CaseNbRepondant.Interior.ColorIndex = 15 Then
            i = 20
            NbRepondants = CaseNbRepondant.Value
        End If
        i = i + 1
    Wend
   
    NbReponsesPositives = 0
   
    For j = 3 To NbColMax - 1
        If LigneReponse.Cells(1, j) <> 0 And LigneReponse.Cells(1, j) <> "" Then
            NbReponsesPositives = NbReponsesPositives + 1
        End If
    Next
   
    Pourcentage = NbReponsesPositives * 100 / NbRepondants

End Function

La ligne en rouge est celle qui me pose problème.
Quand je la laisse comme ça ma colonne de pourcentage se retrouve avec plein de #Name.
Je suis obligé de cliquer sur chacune des cases et de rappuyer entrée pour que ça marche.
En mode débug, je me suis rendu compte que ma fonction pourcentage() était appelée plusieurs fois pour une seule ligne et j'ai aussi quelques fois eu le message d'erreur "référence circulaire".
Je ne comprend pas d'où ça vient.
Help!

Merci d'avance.

Ps: Quand je remplace la ligne en rouge par
LigneReponse.Cells(1, IntColMax + 1) = Pourcentage()"
ça fonctionne mais après un changement dans mon tableau mes cellules ne sont pas mises à jour...
mardi 29 mai 2007 à 12:53:07 | Re : Référence circulaire en VBA sur Excel

lermite222

Membre Club

Bonjour,

La référence circulaire provient de formule qui se recalcul en boucle, il est possible que c'est du fait que ta routine n'est pas terminée ?

Essaye en désactivant le calcul automatique et quand la routine est terminée faire un recalcul de la feuille. Si le pb persiste colle les formules qui interviennent dans la feuille, c'est de là que vient le problème.
A+
louis

mardi 29 mai 2007 à 14:11:53 | Re : Référence circulaire en VBA sur Excel

nico971gwada

Super!

ça marche. En désactivant le calcul automatique j'ai bien ma formule calculée dans ma case et ce n'est même pas la peine de faire un recalcul de la feuille ça marche tt seul.
Par contre si une case de ma feuille change, mon pourcentage n'est pas mis à jour (même avec l'option volatile). Et si je fais un recalcul de la feuille, étant donné que dans ma fonction je part de la cellule active, toutes les cases de la colonne pourcentage prennent la même valeur.
Que faire? Est-ce qu'il y a un moyen de partir de la cellule à partir de laquelle on appelle une fonction au lieu de la cellule active?

Merci d'avance.
mardi 29 mai 2007 à 15:26:14 | Re : Référence circulaire en VBA sur Excel

lermite222

Membre Club

Evidemment, je ne vois pas l'entièreté de ton prog, mais comme ce sont des formules, il est évident que les autres cellules vont se recalculer.
Si les résultats peuvent êtres figés, tu peu changer les formules par leurs résultats au moyen des fonctions spéciale de copie.
A+
louis

mardi 29 mai 2007 à 15:31:51 | Re : Référence circulaire en VBA sur Excel

lermite222

Membre Club
Une autre solution, ne pas mettre de formule dans la feuille et tout calculer par VBA, évidemment cela nécessiterrais une refonte complète de l'appli.
Après changement dans une cellule, faire appel à la fonction feuille Cell_change (je ne sais plus les termes exact) et recalculer ce qui est nécessaire en fonction de la ligne et de la colonne.
A+
louis
mardi 29 mai 2007 à 15:42:28 | Re : Référence circulaire en VBA sur Excel

jmfmarques

Membre Club
Bonjour  nico971gwada,

Imagine le mécanisme suivant :

une cellule additionnant toutes les valeurs d'une colonne dans laquelle elle se trouve elle-même.
Il est clair que si tu ajoutes ou modifie une des valeurs de la colonne, celà aura pour effet :
1) de modifier ton total
2) comme ce total est lui-même dans la colonne et inclus dans le calcul du total ===>> de remodifier le total etc... etc...

C'est là un exemple simple de référence circulaire !!!
A toi de chercher sur ta feuille où se trouve une (ou plusieurs) cellule qui fait un calcul de l'espèce (sur une base incluant sa propre valeur) et de corriger...


Cette discussion est classée dans : ligne, cells, pourcentage, lignereponse, nbreponsespositives


Répondre à ce message

Sujets en rapport avec ce message

exportation de vb a excel je ne peut pas calculer [ par asem67 ] j'ai fait un prog de gestion de pieces machine et jexport mes recordset sous excel jusque'a la ca fonctionne mais quand je veut fait des calcul sous e ya personne ici ki sache faire un copier coller ??? !!! [ par stidjeanmoulin ] voici mon code:Sub Jonction()' Jonction MacroDim i As Integer, j As Integer 'indices de boucleDim ligne As Variant 'variable auxiliaire de copiei = 1< Dépassement de capacité EXCEL [ par annedel ] Bonjour !J'ai un gros problème... l'exécution de mon programme provoque l'erreur "Dépassement de capacité"... J'ai beau faire un test pas à pas, je ne *** Export vers Excel qui n'est pas installer *** [ par Heny ] Dim MsDim EX As New Excel.ApplicationDim ligne As LongDim MSG, Msg1, Style, Title, Response, MyString'Boite de dialogue demande de confirmation MSG = récupérer valeur des variables et las copier dans une autre feuille [ par philou1 ] bonjourje n'arrive pas à récupérer la valeur de mes variables pour les recopier dans une autre feuille.voici mon code:dim plage_relevé as range, r1 as exel vba [ par champion ] comment fait on avec l'objet range ou cells pour avoir la ligne courante et la colonne numéro X ?cells(ligne_courante,3) par exemple. ***EXPORTER VERS EXCEL *** [ par Heny ] Salut a tous Dim MsDim EX As New Excel.ApplicationDim ligne As LongDim MSG, Msg1, Style, Title, Response, MyString'Boite de dialogue demande de confir comment ajuster automatiquement un texte dans une cellule fusionné en vba? [ par erti1711 ] Bonjour à tous,en faite je dispose de 12 feuilles ds le classeur dont la dernière va me servir a réalisé un devis.g 11 feuilles qui regroupe une liste comptage de A dans une ligne [ par funkay91 ] Bon ceci est une partie d'une macro For Each c In Range(Cells(6, 3), Cells(6, 56))            If c.Value() = "A" Then          &n [VBA Excel] recuperer la lettre d'une colonne [ par tof008 ] Hello! Voila mon problème : Je dois ajouter automatiquement sur une ligne un nouveau mois, puis remplir la colonne de données...Je fais donc une boucl


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,647 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales