Live-Forum - Die aktuellen Beiträge
Datum
Titel
18.04.2024 18:04:29
18.04.2024 16:33:24
Anzeige
Archiv - Navigation
1632to1636
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zelle oberhalb eines Diagramms

Zelle oberhalb eines Diagramms
23.07.2018 15:36:28
Rudi
Hallo,
eine meiner seltenen Fragen:
Kann mir jemand sagen, warum chartobjects(1).Topleftcell.Offset(-1) nicht funktioniert?
Ist nicht lebenswichtig aber interessiert mich.
Sub aaa()
Dim r As Range
Set r = ActiveSheet.ChartObjects(1).TopLeftCell
MsgBox r.Address '$A$7
MsgBox r.Offset(-1).Address  'Fehler Die Metode 'Offset' für das Objekt 'Range' ist  _
fehlgeschlagen
MsgBox Cells(r.Row - 1, r.Column).Address '$A$6
End Sub

Gruß
Rudi

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
probier mal MsgBox r.Offset(-1,0).Address owT
23.07.2018 15:40:29
Matthias
Korrektur
23.07.2018 15:44:11
Matthias
MsgBox Range(r.Address).Offset(-1).Address
einen Workaraund...
23.07.2018 16:47:50
Rudi
... habe ich doch schon.
MsgBox Cells(r.Row - 1, r.Column).Address '$A$6
Trotzdem Danke
Vermutung Read-only
23.07.2018 18:04:12
ChrisL
Hi Rudi
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/shape-topleftcell-property-excel?f=255&MSPPError=-2147217396
Returns a Range object that represents the cell that lies under the upper-left corner of the specified object. Read-only.
Würde jedenfalls erklären, warum die Workarounds trotzdem funktionieren.
Wäre es nicht Read-only könnte man über eine Änderung der TopLeftCell das Diagramm verschieben und das geht m.W. nicht.
cu
Chris
Anzeige
Da ist was dran, ...
23.07.2018 18:26:42
Luc:-?
…Chris,
denn Rudi hat eine wichtige Meldung unterschlagen. Das, was er in das Pgm reinschrieb, ist nur das, was vom VBE-Intellisense angezeigt wird. Lässt man das Pgm laufen, kommt (unter Xl14/2010) aber noch das:
Systemfehler &H80010108. Das aufgerufene Objekt wurde von den Clients getrennt.
Folglich wird man wohl ein separates Range-Objekt verwenden müssen, bspw auch so:
Sub xxx()
Dim obCh As ChartObject
With ActiveSheet
Set obCh = .ChartObjects(1)
.Range(obCh.TopLeftCell.Address).Offset(-1).Select
End With
Set obCh = Nothing
End Sub
🙈 🙉 🙊 🐵 Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
AW: Vermutung Read-only
23.07.2018 22:23:57
Rudi
Hallo,
ist ja nicht so, dass ich nicht selbst weiter forsche.
ReadOnly kann es nicht sein, da es bei einem Shape (z.B. Rechteck) funktioniert.
Der Schreibschutz bezieht sich nur darauf, dass man das Objekt nicht per Zuweisung einer neuen TopLeftCell verschieben kann.
Beim Shape ist das Parent-Objekt der TopLeftCell das Shape.
Beim Diagramm ist das Parent-Objekt der TopLeftCell das Diagramm.
MsgBox Sheets(1).Shapes(1).TopLeftCell.Offset(-1) 'geht
MsgBox Sheets(1).ChartObjects(1).TopLeftCell.Offset(-1) 'geht nicht
Wahrscheinlich mal wieder eine der unerklärlichen Inkon(sist)(tin)enzen :-) seitens M$
Gruß
Rudi
Anzeige
Read-only - Ja, Vgl m.Shape - Nein, ...
24.07.2018 02:25:40
Luc:-?
…Rudi;
trotz zT gleicher Eigenschaften sind die beiden Objekte nicht vglbar. Die Inkonsistenz entsteht anschei­nend durch den Ver­such, diese objektbildende Eigenschaft separierend anderweitig zu benutzen. Das ChartObject-Objekt ist ein Container für ein darin ein­gebettetes Chart-Objekt, das sowohl als eigenes Blatt angelegt oder eben auch auf diese Weise in ein normales Blatt integriert wdn kann. Während bei anderen, direkt in ein Blatt eingebetteten Objekten wie zB der Abbildung eines ZellBereichs eine Verwen­dung dieser Eigenschaft problemlos ist, kommt es bei diesem Container-Objekt offensichtlich zu einem Verlust der Bindung an das darin eingebettete Chart-Objekt, worauf die von mir zuvor genannte F-Meldung hinzuweisen scheint. Das mag daran liegen, dass hier, ähnlich den Rahmen bei MS-Word, eine etwas andere Art von ZeichnungsObjekt als Container benutzt wird.
Interessant wird es, wenn man dieses Container-Objekt mit einem normalen Shape gruppiert. Der Container wird dann bzgl bestimm­ter Eigenschaften durch das Shape ersetzt, d.h., .TopLeftCell des ChartObject-Objekts liefert nicht mehr die Zelle unter der linken oberen Ecke desselben, sondern die unter der oberen linken Ecke des Shapes! Zwar reagiert das Container-Objekt immer noch genauso auf die WeiterVerwendung dieses Range-Objekts, aber es kann nun durch die gleichwertige Eigenschaft des Shape-Objekts ersetzt wdn, die dieses Verhalten nicht zeigt.
Dein WorkAround erzeugt ebenso wie der von mir zuvor gezeigte keinen neuen Bezug auf dasselbe Objekt, sondern ein neues gleichartiges. Vglbares geschieht offensichtlich bei Ersetzung des Containers durch ein mit ihm gruppiertes Shape.
Gruß, Luc :-?
Anzeige
Der Ersatz erfolgt übrigens auch, ...
24.07.2018 03:22:38
Luc:-?
…wenn das ChartObject-Objekt gar nicht auf dem Shape-Objekt liegt!
Luc :-?
AW: Der Ersatz erfolgt übrigens auch, ...
24.07.2018 10:31:12
ChrisL
Hallo zusammen
Danke für die Ergänzungen resp. für das Teilen der Analyseergebnisse :)
Dass sich ChartObject und Shape (warum auch immer) unterschiedlich verhalten, könnte ich mir vorstellen. Was mich jetzt aber trotzdem an meiner Read-Only-Theorie zweifeln lässt, sind die nachfolgenden beiden Testfälle:
Sub Versuch1()
Dim r As Range, rr As Range
Set r = Sheets(1).ChartObjects(1).TopLeftCell
Set rr = r
MsgBox rr.Offset(-1).Address
End Sub
'-----------------------------
Sub Versuch2()
Dim r As Range
Set r = RangeByVal(Sheets(1).ChartObjects(1).TopLeftCell)
MsgBox r.Offset(-1).Address
End Sub

Private Function RangeByVal(ByVal r As Range) As Range
Set RangeByVal = r
End Function

Nach meinem Verständnis sollten die beiden Varianten (ByVal) eine "Kopie" der Range-Variable generieren und somit die Range von der Chart "entkoppeln". Dennoch erhalte ich die Fehlermeldung.
Mache ich einen Denkfehler?
cu
Chris
Anzeige
Das hatte ich im Vorfeld meiner AW zT ...
24.07.2018 15:35:55
Luc:-?
…auch getestet, Chris,
vor allem eine neue Kopie des Bezugs, die aber dann immer noch direkt auf die an das ChartObject gebundene Zelle verweist. Mit ReadOnly wird das tatsächlich nichts zu tun haben, denn das ist diese Eigenschaft bei Shapes auch. Das Problem könnte, durch deinen 2.Versuch unterstrichen, dann aber eher darin liegen, dass eine echte Entkopplung nur durch Setzen eines neuen Bezugs auf die quasi gleiche Zelle erreicht wdn kann. In deinem 2.Versuch findet wohl deshalb keine Entkopplung statt, weil alles quasi im selben Pgm abläuft. Auf diese Art kann man wohl nur Entkoppeln, wenn ein 2.Pgm durch ein Ereignis ausgelöst, nicht aber aus dem 1. aufgerufen wird. Das hatte ich in anderen Zusammenhängen schon feststellen müssen.
Allerdings ist das ja nun nicht unbedingt nötig, denn ein einfaches .TopLeftCell.Select genügt ja auch schon. Wenn man dem ein ActiveWindow.RangeSelection.Offset(-1).Select folgen lässt, hat man ebenfalls eine Entkopplung erreicht. Also einer der 1%-Fälle, bei denen ein (vorheriges) .Select sinnvoll ist. ;-)
Gruß, Luc :-?
Anzeige
AW: Das hatte ich im Vorfeld meiner AW zT ...
24.07.2018 17:57:59
ChrisL
Hi Luc
Danke für die Rückmeldung.
Habe mir noch ein paar Beiträge via Netzsuche angeschaut. Das Problem wurde von den Beantwortern immer als "Bug" bezeichnet und damit kann ich leben.
Aus Neugier werde ich morgen noch kurz diese Variante testen:
ActiveSheet.Shapes(ActiveChart.Parent.Name).TopLeftCell

https://www.mrexcel.com/forum/excel-questions/858467-vba-find-top-left-cell-active-chart.html
Müsste eigentlich gehen, aber neue Erkenntnisse bringt es trotzdem nicht. Darum werde ich ausnahmsweise auf eine erneute Rückmeldung verzichten :)
cu
Chris
Anzeige
Ja, das fktioniert, ...
24.07.2018 20:26:01
Luc:-?
…Chris,
allerdings nur für ein aktives, also ausgewähltes Diagramm. In der folgd Form fktioniert es immer:
Sub zzz()
Dim obCh As Chart, shCh As Shape
With ActiveSheet
Set obCh = .ChartObjects(1).Chart
Set shCh = .Shapes(obCh.Parent.Name)
shCh.TopLeftCell.Offset(-1).Select
End With
Set obCh = Nothing: Set shCh = Nothing
End Sub
Das konnte man nach meinem GruppierungsExperiment mit zusätzlichem Shape fast erwarten und deutet darauf hin, dass das ChartObject sehr speziell mit dem eingebetteten Chart verbunden ist und deshalb dieser Fehler verursacht wird.
Als Bug würde ich das übrigens nur sehen, falls es noch unter Xl9/2k fktioniert hätte. Ab Xl10 wurde ja etliches verändert und dabei könnte das „unter die Räder gekommen“ sein. Falls es aber schon damals nicht ging, ist es entweder ein Uralt-Bug oder liegt daran, dass eingebettete Diagramme überhaupt zu den ältesten Form-Objekten in Xl gehören und damals dafür eine etwas andere Methode benutzt wurde, die zum bei normalen Shapes möglichen Vorgehen inkompatibel ist. Das ChartObject ist ja auch ein eigener ObjektTyp, der aber auch Komponenten aufweist, die ihn als Unterkategorie des allgemeineren ObjektTyps Shape erscheinen lassen. Aber das mag ja erst nachträglich so geordnet worden sein…
Luc :-?
Anzeige
...und es geht natürlich auch das:
25.07.2018 15:20:34
Luc:-?
.Shapes(.ChartObjects(1).Name).TopLeftCell.Offset(-1).Select
Luc :-?
AW: probier mal MsgBox r.Offset(-1,0).Address owT
23.07.2018 16:26:26
Robert
Hallo Rudi,
das ist aber ein merkwürdiges Verhalten. Auf das Range-Objekt, das durch die TopLeftCell-Eigenschaft geliefert wird, kann man anscheinend die Offset-Anweisung nicht anwenden. Erklären kann ich es mir nicht, deshalb lasse ich den Post mal offen. Ein Workaround wäre vielleicht:
MsgBox Range(r.Address).Offset(-1, 0).Address

Das funktioniert zumindest.
Gruß
Robert
und was soll das jetzt ? owT
23.07.2018 16:27:41
Matthias
AW: Was meinst Du denn damit?
23.07.2018 16:37:10
Robert
Hallo Matthias,
eine Antwort auf die Frage von Rudi, wieso sein Code nicht funktioniert, habe ich nicht. Deshalb wollte ich den Post offen lassen. Dein Vorschlag, bei der Offset-Anweisung die Row-und die Column-Anzahl der Verschiebung anzugeben, löst das Problem nicht. Zumindest bei mir taucht auch dann der Fehler auf.
Deshalb hatte einen Vorschlag, für ein Workaround des Problems gemacht, damit Rudi seinen Code ans laufen kriegt.
Was meinst Du also dann mit Deiner Frage, was das jetzt soll? Das soll ein Vorschlag zu einer Lösung sein, ich dachte, dies wäre mit meinem Post auch deutlich geworden. Ich hatte lediglich versäumt, den Betreff anzupassen. Passiert mir leider häufiger.
Gruß
Robert
Anzeige
AW: Nachtrag und Entschuldigung
23.07.2018 16:45:14
Robert
Sorry Matthias,
ich habe eben erst Deinen Korrektur-Post richtig gelesen. Da hast Du Rudi ja schon den Vorschlag gemacht, den ich dann noch mal nachgeliefert habe. Jetzt verstehe ich auch Deine Anmerkung, insofern war mein Post wirklich überflüssig. Dafür möchte ich mich entschuldigen.
Gruß
Robert
AW: Spalte A: einen Schritt nach links? owt
23.07.2018 16:42:46
Fennek
delete owT
23.07.2018 16:44:44
Fennek

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige