Don hat mehrere Diagramme in einer Arbeitsmappe. Jedes Diagramm enthält zwei Textfelder mit Datumsangaben der aktuellen Daten und Datumsangaben, an denen das Diagramm aktualisiert wurde. Don möchte den gesamten Text in diesen Diagrammtextfeldern mit einem Makro ändern, kennt jedoch nicht die richtige Technik, um die Aufgabe auszuführen.

Dies kann natürlich mit einem Makro erfolgen, aber Sie sollten verstehen, dass es eine Möglichkeit gibt, dies ohne ein Makro zu tun. Wenn Sie möchten, können Sie das, was in einem Textfeld angezeigt wird, mit dem Inhalt einer Zelle verknüpfen. Dies bedeutet, dass Sie jedes Ihrer Textfelder „dynamisch“ gestalten können, sodass Sie lediglich die Inhalte in der zugeordneten Zelle ändern müssen. Diese Zelle kann einen Textwert, einen numerischen Wert, ein Datum oder eine Formel enthalten – das spielt keine Rolle.

So erreichen Sie diese Technik: Wählen Sie das Textfeld aus, das Sie einer Zelle zuordnen möchten, indem Sie einmal darauf klicken. Die bekannten Ziehpunkte sollten außerhalb des Textfelds angezeigt werden. Geben Sie dann in der Formelleiste eine Zellreferenz ein. Sie können dies tun, indem Sie es wie folgt eingeben:

=$C$15

Dadurch wird der Inhalt des Textfelds mit dem Inhalt der Zelle C15 verknüpft. Wenn Sie möchten, können Sie auch alles löschen, was sich in der Formelleiste befindet, und bei aktivierter Formelleiste auf die Zelle klicken, die Sie verknüpfen möchten. Die Adresse für die Zelle sollte in der Formelleiste angezeigt werden. Drücken Sie die Eingabetaste und die Aufgabe ist erledigt.

Geben Sie nun etwas in die zugehörige Zelle ein. Was auch immer Sie eingeben, sollte sofort im Textfeld angezeigt werden.

Bevor einige mögliche makrobezogene Antworten bereitgestellt werden können, benötigen Sie einige Hintergrundinformationen zum Excel-Objektmodell, auf das über VBA zugegriffen werden kann.

Es gibt zwei Arten von Diagrammen, die in einer Arbeitsmappe enthalten sein können: ein Diagrammblatt und ein eingebettetes Diagramm. Diagrammblätter werden durch ein Diagrammobjekt dargestellt und gehören zur Diagrammsammlung. Eingebettete Diagramme werden dagegen durch ein Diagrammobjekt dargestellt, das zur ChartObjects-Auflistung gehört, die wiederum zu einem Arbeitsblattobjekt gehört.

Wenn Sie ein Textfeld auf einem tatsächlichen Diagrammblatt platzieren, kann auf folgende Weise darauf zugegriffen werden:

Sub FindTextBoxes1()

Dim c As Chart     Dim s As Shape     Dim sMsg As String     Dim sName As String

For Each c In ActiveWorkbook.Charts         For Each s In c.Shapes             If s.Type = msoTextBox Then                 sMsg = s.TextFrame2.TextRange.Text                 sName = s.Name                 MsgBox "Text: " & sMsg, vbOKOnly, sName             End If         Next s     Next c End Sub

Dieses Makro durchläuft jedes Diagrammblatt und dann jedes Textfeld auf jedem Diagrammblatt. Was auch immer in jedem Textfeld ist, wird dann in einem Meldungsfeld angezeigt. Wenn Sie ändern möchten, was in einem Meldungsfeld enthalten ist, müssen Sie lediglich die Text-Eigenschaft des TextRange-Objekts festlegen.

Textfelder in eingebetteten Diagrammen sind eine andere Geschichte. Warum? Weil es möglich ist, dass das Textfeld nicht wirklich Teil des Diagramms ist, sondern Teil des Arbeitsblatts. Mit anderen Worten, das „übergeordnete Element“ des Textfelds kann entweder das eingebettete Diagramm oder das Arbeitsblatt sein.

Eine gute Möglichkeit, um herauszufinden, ob das Textfeld Teil des eingebetteten Diagramms ist, besteht darin, ein ähnliches Makro wie das gerade dargestellte zu erstellen. Dieser kann jedoch jedes eingebettete Diagramm in jedem Arbeitsblatt durchlaufen und jede Form (Textfeld) in diesem Diagramm finden.

Sub FindTextBoxes2()

Dim w As Worksheet     Dim c As ChartObject     Dim s As Shape     Dim sMsg As String     Dim sName As String

For Each w In ActiveWorkbook.Worksheets         For Each c In w.ChartObjects             For Each s In c.Chart.Shapes                 If s.Type = msoTextBox Then                     sMsg = "This text box is a child of the "

sMsg = sMsg & "embedded chart" & vbCrLf                     sMsg = sMsg & "Text: " & s.TextFrame2.TextRange.Text                     sName = s.Name                     MsgBox sMsg, vbOKOnly, sName                 End If             Next s         Next c         For Each s In w.Shapes             If s.Type = msoTextBox Then                 sMsg = "This text box is a child of the "

sMsg = sMsg & "worksheet" & vbCrLf                 sMsg = sMsg & "Text: " & s.TextFrame2.TextRange.Text                 sName = s.Name                 MsgBox sMsg, vbOKOnly, sName             End If         Next s     Next w End Sub

Wenn Sie das Makro ausführen, wird für jedes Textfeld ein Meldungsfeld angezeigt, das den eingebetteten Diagrammen wirklich untergeordnet ist. Anschließend wird ein Meldungsfeld für alle Textfelder angezeigt, die dem Arbeitsblatt untergeordnet sind. Wie im vorherigen Makro wird überprüft, ob das Shape-Objekt wirklich ein Textfeld ist, bevor Informationen dazu angezeigt werden. Dies ist besonders wichtig, wenn Sie durch jede Form im Arbeitsblatt gehen, da alle eingebetteten Diagramme auf dem Blatt auch als Teil der Shapes-Sammlung betrachtet werden.

Um den in einem Textfeld enthaltenen Text zu ändern, müssen Sie wie zuvor lediglich die Text-Eigenschaft des TextRange-Objekts ändern.

_Hinweis: _

Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.

ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.

Dieser Tipp (13377) gilt für Microsoft Excel 2007, 2010 und 2013.