Les Graphiques Ne Sont Pas Automatiquement Mise À Jour Lorsque Des Modifications De Données
J'espère que c'est facile. J'ai une série de tableaux MS Excel de ce point de données sur la même feuille de calcul. Les données sur la feuille de calcul est calculée à l'aide d'une fonction VBA. Lorsque les données sont mises à jour par la fonction VBA les nouveaux numéros ne sont pas reflétés dans les tableaux qui pointent vers eux. J'ai essayé d'appeler l'Application.Calculer, mais qui n'a pas fait l'affaire. Toutes les pensées?
UDPATE:
J'ai été en mesure de reproduire ce problème sur une échelle beaucoup plus petite. Voici comment:
- Créer un nouveau classeur
- Renommer la Feuille 1 "Résumé"
- Renommer la Feuille 2 de "Données"
-
Ouvrir la fiche de Synthèse dans l'éditeur VBA et collez le code suivant:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Parent.Range("worksheetDate") = Target Then Application.CalculateFull End If End Sub
-
Créer un nouveau module VBA
-
Collez le code suivant dans le nouveau module VBA (je m'en excuse, je ne peux pas obtenir de Débordement de Pile pour formater correctement pour la vie de moi, c'est le mieux que je puisse faire pour le faire):
.Function getWeekValue (weekNumber As Integer, valuesRange As Range) As Integer Dim aCell As Range Dim currentDate As Date Dim arrayIndex As Integer Dim weekValues(1 To 6) As Integer currentDate = ThisWorkbook.Names("worksheetDate").RefersToRange.Value arrayIndex = 1 For Each aCell In valuesRange If month(currentDate) = month(ThisWorkbook.Sheets("Data").Cells( _ aCell.Row - 1, aCell.Column)) Then weekValues(arrayIndex) = aCell.Value arrayIndex = arrayIndex + 1 End If Next getWeekValue = weekValues(weekNumber) End Function
.
-
Modifier les Données de feuille de calcul pour correspondre à l'image suivante:
- Sélectionnez la Cellule B1 et le nom de la gamme "worksheetDate"
- Dupliquer les lignes 1 à 3 dans l'image suivante:
- Sur la ligne 4, en vertu de la "Semaine X" en-têtes, entrez la formule suivante
.
= getWeekValue(1, Data!$A$2:$M$2)
incrémenter le premier argument de la getWeekValue fonction par un pour chaque semaine (par exemple, passer de 1 pour 1 Semaine, 2 pour la Semaine 2, 3, pour la Semaine 3, etc.
- Créer un graphique à barres à l'aide de cellules A3 à E4, comme les données
- De changer la date dans la cellule B2 pour une date entre 10/1/2010 et 12/31/2010, le choix d'un mois autre que le mois de mai qui est actuellement dans la cellule. Par exemple, si la date est 12/11/2010, de le changer pour quelque chose comme 11/11/2010 ou 10/11/2010. Il est à noter que les données et mise à jour du tableau correctement.
- De modifier la date dans la cellule B2 de gain. Notez que les données mises à jour, mais le tableau ne tient pas.
Curieusement, après une période de temps (plusieurs minutes) s'est écoulé, le graphique enfin des mises à jour. Je ne sais pas si c'est parce que j'ai été d'effectuer d'autres activités qui a déclenché la mise à jour ou parce que Excel est le déclenchement d'une mise à jour au bout de plusieurs minutes.
Merci pour l'info, je vais garder cela à l'esprit dans l'avenir. Dans ce cas, je travaille avec un graphique à barres, pointant vers une des données d'une simple plage de données qui n'est pas liée à un tableau croisé dynamique.
Si vous étiez en mesure de résoudre cette après tout? J'ai remarqué que l'insertion de la première ligne de la feuille de calcul mises à jour le tableau
Remarque: voir la réponse ci-dessous par moi, plus besoin d'utiliser la fonction DoEvents dans le code pour forcer les mises à jour sur le graphique.
OriginalL'auteur Adam | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
à la fin de mes modifications je ferme le classeur et le rouvrir. qui semble la plus simple et la plus fiable pour tout mettre à jour pour moi.
OriginalL'auteur TmTron
Trouvé la solution à ce problème que je souffrais de la même.
Je viens d'ajouter "DoEvents()" avant l'impression ou de l'exportation et le graphique obtenu actualisé.
exemple
OriginalL'auteur Ageel Al-Shayeb
Par exemple:
Je l'ai testé sur ma machine avant de poster
Voir modifier ..
Je me dois de préciser Votre code fonctionne comme prévu. Même en le modifiant avec certains ajoutent de la complexité à imiter ce que j'ai mis en place fonctionne bien. En fait, la ligne d'actualiser le tableau n'est même pas nécessaire - que se passe automatiquement. Cependant, pour une raison quelconque, il semble y avoir un problème avec ce classeur/dataset/ensemble de fonctions VBA. Les graphiques actualiser correctement avec la première série de modifications de données, mais pas par la suite... Toujours en train d'enquêter.
Essayez de réduire votre classeur pour tous les détails inutiles et de le télécharger quelque part ...
OriginalL'auteur Dr. belisarius
Cette solution a fonctionné pour moi. Pour la délinquance de la feuille de calcul ajouter:
Je vous remercie. Je vais supprimer mon autre réponse.
OriginalL'auteur SLeepdepD
Il est possible que le problème est la liste des arguments de getWeekValue, qui ne comprend que le numéro de la semaine et le flux de données.
Si vous ajoutez un troisième argument, worksheetDate, puis d'Excel moteur de recalcul sera frappé sur le côté de la tête avec le fait que getWeekValue utilise la valeur dans worksheetDate. Dans votre mise en œuvre, de ce fait, n'est tenu que dans le code VBA, où il est probablement invisible pour le moteur de recalcul.
J'écris ce donc hedgingly parce que je ne connais pas le fonctionnement interne du moteur de recalcul. (Peut-être quelqu'un qui connaît mieux que je peux faire des commentaires sur mon spéculation) Mais j'ai fait un test, dans lequel getWeekValue n'ont que troisième argument, et le tableau n'recalculer correctement. Nice avantage de cette approche: vous pouvez supprimer tous ce que les autres VBA gestion de l'événement. -HTH
OriginalL'auteur user3716832
J'ai trouvé que l'appel de cette Sous fonctionne...
MAIS
Microsoft met en garde contre d'être pris avec la prochaine DoEvents d'exécution avant la première DoEvents complète, qui peut se produire en fonction de la façon dont il est souvent appelé sans délai entre les appels. Ainsi, la fonction DoEvents semble agir comme un type de non maskable interrupt, et de nidification non maskable interruptions peut cause de la machine à geler pour de multiples raisons, sans récupération d'autre que le redémarrage.
À l'aide de la Sous ci-dessous, que j'ai modifié à partir de leur suggestion, permet d'éviter cela.
I semble que le nombre de DoEvents nécessaire est basé sur le nombre de tâches en arrière-plan en cours d'exécution sur votre machine, et de mettre à jour le graphique semble être une tâche en arrière-plan de l'application. J'ai seulement besoin de deux DoEvents parce que j'appel de la routine souvent; cependant, je peut finir par monter plus tard si nécessaire.
Je garde aussi le Mod à 1000 afin de ne pas modifier le décalage entre chaque DoEvents que Microsoft suggère, de prévention de la nidification. Une raison possible vous pouvez augmenter le nombre de 2000, à un nombre plus élevé est de savoir si le système ne met pas à jour le graphique. L'augmentation de ce nombre permet à la machine de gérer un plus grand nombre d'événements d'arrière-plan que la fonction DoEvents pourriez rencontrer à travers de multiples appels comme ils sont probablement sur une pile, et la fonction DoEvents événement est uniquement autorisé à exécuter un nombre de cycles avant de marquer sa place dans la pile afin de permettre non gérée événements et de retour, les laissant être traitées sur le prochain appel. Par conséquent, le besoin pour les appels multiples. La modification de ce à leur exemple de 150000 ne semble pas ralentir la machine trop, pour jouer la sécurité, vous souhaitez peut-être 150000.
Remarque: le premier exemple Sous deux DoEvents est probablement plus sûr, en fonction de combien de fois vous appelez le Sub, cependant, si trop souvent, votre ordinateur peut se bloquer. Votre appel. 😉
PS: la fonction DoEvents deviendra l'un de vos appels si vous créez beaucoup de boucles imbriquées et le programme ne se comporte pas comme prévu. Heureusement, il est disponible dans toutes les applications qui utilisent VBA!
OriginalL'auteur Cyberchipz
Juste une idée: dans votre Sub Worksheet_Change, insérer à la première ligne:
afin d'éviter de déclencher des événements....
Bien sûr définir à True à la fin de la Sous.
OriginalL'auteur Patrick Honorez