Erreur lors de la définition PlotArea.Largeur dans Excel, VBA (Excel 2010)
Je suis en train de vivre une erreur dans une sous-routine en essayant de définir les plotarea.la largeur de la propriété d'un graphique.
Les autres dimensions également provoquer cette erreur si je commente la ligne précédente(s).
Il n'y a pas de ActiveChart, pas de sélection, etc. Le message d'erreur spécifique est ceci: "-2147467259 (80004005) la Méthode 'Width' de l'objet 'PlotArea" a échoué"
C'est estompe moi pour plusieurs raisons:
- En mode debug, F8 pour parcourir le code, l'erreur ne se produit PAS.
- Autant que je sache, "largeur" n'est pas une "méthode", mais une "propriété" de l'organigramme plotarea, de sorte que même le message d'erreur est assez ambiguë.
Toute pensée? Voici autant de code que je peux partager, le ChartSizeMedium sous-programme dans son intégralité, et un mannequin extrait pour vous montrer comment je suis en train de créer le tableau et en le passant à sous qui définit la taille & certaines autres propriétés avant de passer à une autre fonction qui ajoute à la série de données pour le graphique.
Option Explicit
Private Sub EstablishChartObject()
Dim cObj as ChartObject
Set cObj = ActiveSheet.ChartObjects.Add(Left:=30, Top:30, Width:=740, Height:=300)
ChartSizeMedium cObj.Chart, "Integer", "Example Chart Title"
End Sub
Private Sub ChartSizeMedium(cht As Chart, NumType As String, Optional chtTitle As String)
'Subroutine to make a consistent size chart
Dim s As Long
With cht
'Add a chart title if one exists.
If Len(chtTitle) > 0 Then
.HasTitle = True
.chartTitle.Characters.Text = chtTitle
End If
'Create the default chart Legend
.HasLegend = True
With .Legend
.Position = xlTop
.Font.Size = 11
.Font.Bold = True
End With
'Format the axes
.Axes(xlValue).MajorGridlines.Format.Line.Visible = msoFalse
.Axes(xlValue).MinorGridlines.Format.Line.Visible = msoFalse
'Format the size of the chart
With .Parent
.Width = 740
.Height = 396
End With
With .PlotArea
.Width = 640 '<---- THIS LINE TRIGGERS THE ERROR
.Height = 280
.Left = 30
.Top = 30
End With
End With
'Some charts start with more than one series container, so make sure they're gone:
With cht
Do Until .SeriesCollection.Count = 0
s = .SeriesCollection.Count
.SeriesCollection(s).Delete
Loop
End With
End Sub
Mise à JOUR le 12 Décembre 2012
- Je supprimer tous les non-problématique de code et d'utiliser seulement les PlotArea avec bloc, dans la même routine, j'ai également essayé le réglage du type de graphique (plusieurs valeurs) et comme indiqué dans cet exemple, l'ajout manuel d'une série de données avant de tenter de définir la PlotArea dimensions, mais l'erreur persiste:
Option Explicit
Private Sub EstablishChartObject2()
Dim cObj As ChartObject
Dim sh As Worksheet
Set sh = ActiveSheet
Dim srs As Series
Set cObj = sh.ChartObjects.Add(Left:=30, Top:=30, Width:=740, Height:=300)
Set srs = cObj.Chart.SeriesCollection.NewSeries
srs.Values = "={1,3,5,7,4}"
cObj.Chart.ChartType = 57
With cObj.Chart.PlotArea
.Width = 100 '<---- THIS LINE TRIGGERS THE ERROR
.Height = 280
.Left = 30
.Top = 30
End With
End Sub
merci pour la suggestion, mais par défaut, ChartType est de 57 (xlBarClustered), qui certainement n'ont PlotArea 🙂
Debug.Print cObj.Chart.PlotArea.Width
renvoie une plotarea.largeur de 718.Ce fil traite d'un problème similaire et un délai d'actualisation question: excelforum.com/excel-programming-vba-macros/.... Vous devez vous connecter pour voir Andy Pape de la solution, donc je ne sais pas ce que c'est, mais comme il Andy, je suis sûr qu'il fonctionne. Ce fil dit qu'ils l'ont résolu en tournant
ScreenUpdating
sur: vbaexpress.com/forum/archive/index.php/t-17251.html. Ne sais pas si cela s'applique à vous.pouvez-vous commenter cette
width
ligne pour voir si l'erreur saute n'importe quelle autre ligne?ScreenUpdating=True dans la présente sous déjà, il n'est donc pas un problème de le rallumer (temporairement) bien que j'avais vu cette suggestion lors de la tentative de google de l'erreur, et essayé de jouer avec ScreenUpdating en vain.
OriginalL'auteur David Zemens | 2012-12-11
Vous devez vous connecter pour publier un commentaire.
Deux solutions qui semblent être au travail, ce n'est pas vraiment comme "élégant" que je préfère (j'espérais qu'il y aurait un moyen de le faire avec sélection le graphique en tout ou en partie).
Option 1 - Sélectionnez la zone de traçage et puis désélectionner. Ce qui semble être la plus fiable/solution efficace.
Option 2 - désactiver la gestion d'erreur en boucle (ce suivi de Doug lien). Cela ne semble pas être une très bonne ou une méthode efficace, et bien qu'il semble fonctionner, j'ai savoir qu'au sein de cette boucle est un échec une fois sur chacune des propriétés de avant de avec succès les met sur la passe suivante.
OriginalL'auteur David Zemens
j'ai eu un problème similaire . Et c'est définitivement un fichier excel problème (ayant 2013).
si vous supprimez le
.select
ligne, il en résultera une erreur sur la ligne suivante.notez que je ne travaille pas avec un <
with selection
faire des trucs>.le
.select
permet de travailler sans l'aide de la sélection, ce qui est évidemment un bug excel (à partir de versions précédentes?)même ici avec Excel 2016. Il m'a aidé 🙂
OriginalL'auteur Patrick Lepelletier
Espère que votre feuille et graphique a la capacité d'obtenir une largeur allant jusqu'à
640
. Si donc, essayez la explicite de référence. Vous suggérons également de changerwidth, height
valeurs à la baisse des valeurs et de voir comment le programme répond. Puisque vous l'avez dit, lorsque vousselect
il fonctionne,cht
est enveloppant le bon objet graphique - sauf que vous avez sélectionné le graphique à l'aide d'ActiveChart.PlotArea.Width
. Donc je suppose référence explicite pourrait être un potentiel essayer.,
Plus loin, vérifiez sur
Aspect Ratio
verrouiller ou déverrouiller. Si aucun de ces travaux, puis ajouter un graphique dans votre fiche et l'utilisation les plus simples de mise en forme de graphique de code pour vérifier surwidht, height, left, top
changements.Mise à jour de deux
Nous allons essayer d'en spécifiant un type de graphique et mise en place d'un objet graphique dans le deuxième
sub
. J'ai essayé dans ma fin, et ça fonctionne. Essayez le code avec les modifications suivantes.Code:
L'appel de cette sous-dès que le bouton est montré dans la feuille.
Otput:
Assurez-vous d'utiliser les bonnes propriétés pour chaque type de graphique. Notez que le code ci-dessus n'est pas de supprimer toute la gauche plus de, vieux graphiques à partir de votre feuille.
.MajoreGridlines.Format.Lines.Visible
échoue. Le.MajorGridlines = False
à assurez-vous que vous ne souhaitez pas afficher le quadrillage.Autre chose que vous voulez faire peut être fait plus tard. Juste essayer avec les changements de dimension, d'abord.
De référence à partir de : MSDN Quadrillage de la propriété
cht.PlotArea.Width...
Je ne voulais pas dire minuscule à tous les David... 1. Avez-vous le commentaire de tous les 4 properties: à gauche, en haut, en hauteur, en largeur? 2. Le message d'erreur persiste? 3. Voyez-vous un quelconque objet graphique est créé à tous? 4. Il n'y a plus qu'un graphique que vous créez? 5. Pouvez-vous obtenir le "système" le nom du graphique vous sont ajout? Où avez-vous déclarer votre
cObj
?Désolé, mal lu le "bas" Si 1=Oui, 2=Non. L'erreur se produit sur TOUTES les propriétés de la dimension de la PlotArea à moins que je sélectionne l'plotarea. 3 - Oui. Et ?cobj.Le graphique.PlotArea.Largeur renvoie une valeur par défaut de la largeur de plus de 640. J'ai essayé de largeur aussi petit que 250 à la même erreur. 4 - Persiste, peu importe combien de cartes existent sur la feuille. 5 - ne sais Pas ce que cela signifie. 6 - voir OP pour la déclaration de cObj
Avez-vous des
option explicit
dans votre code? Je ne vois pasDim cObj as chart
J'avais accidentellement omis qu'à partir de l'extrait, j'ai collé à cette requête, mais oui, j'ai
Option Explicit
de la ligne 1 dans le module de code, suivi de quelquesPublic Const
déclarations et ensuite les sous-programmes à recevoir des données agrégées à partir d'un Python/objet com et de construire et de formater les cartes. Je pense faire ce genre d'application sans l'accord aurait été d'avoir des ennuis. 🙂OriginalL'auteur bonCodigo
Je sais que c'est vieux, et cette solution semble mauvais, mais il fonctionne. J'ai seulement pensé à le faire comme vous l'avez mentionné que l'intensification à travers des œuvres.
Timer
depuis PPT n'a pas deApplication.Wait
. J'ai testé ce lieu de ma maladroite solution, et il semble fonctionner correctement avec 1 seconde de pause.Vous pouvez même être en mesure de raccourcir trimestre une deuxième ou une demi-même, je n'ai pas l'expérience pour beaucoup, mais si vous vous sentez l'1 seconde semble plus lent que ce que vous aviez déjà en place, ou vous voulez juste pour aller plus vite, vous pouvez toujours essayer et de raccourcir l'attente/de la minuterie.
Sur le deuxième coup d'œil... encore de me donner une erreur.
J'ai été en mesure de la modifier légèrement et mettez la pause à l'intérieur d'une erreur piège qui va réessayer et incrémenter le temps d'attente dans .5 intervalles d'une seconde. Ce semble de travailler pour l'instant. Merci pour la suggestion!!
OriginalL'auteur user2140261
EDIT: Cela semble fonctionner pour certains types de graphique, mais il était toujours à la peine pour d'autres types de graphiques. J'ai continué à utiliser le 5x boucle avec
On Error Resume Next
et qui semble, malheureusement, le plus "fiable" solution à ce jour.Original: C'est basé sur User2140261 la réponse ci-dessus:
https://stackoverflow.com/a/16041640/1467082
Depuis que la question a d'abord été publié, l'application réside maintenant dans PowerPoint, je ne peux donc pas utiliser le
Applicaiton.Wait
. J'ai eu quelques erreurs intermittentes avec 1 seconde de pause, et 3 secondes était trop d'une pause, j'ai donc intégré l'erreur suivante piège. La même idée pourrait être utilisée dans Excel en conjonction avecApplication.Wait
.C'était ce bloc de code qui me donnait des ajustements, j'ai donc ajouté cette erreur de manipulation dans Powerpoint pour imiter la
Application.Wait
.OriginalL'auteur David Zemens
Je n'ai pas assez de réputation pour ajouter un commentaire, en utilisant les solutions ci-dessus j'ai réglé mon problème avec les Graphiques en secteurs VB.Net 2010 et Excel 2013. xlLine graphiques a jamais causé un problème, mais mon code plante à quand le même code était dirigé contre un xlPie graphique sur Excel 2013 (Tout était bien sur Excel 2007).
Maintenant mon code de travail:
OriginalL'auteur Kristian