У Дона есть несколько диаграмм в книге. Каждая диаграмма содержит два текстовых поля с датами текущих данных и датами обновления диаграммы. Дон хотел бы изменить весь текст в этих текстовых полях диаграммы с помощью макроса, но не знает, как правильно выполнить задачу.

Это, конечно, можно сделать с помощью макроса, но вы должны понимать, что есть способ сделать это и без макроса. Вы можете, если хотите, связать то, что отображается в текстовом поле, с содержимым ячейки. Это означает, что вы можете сделать каждое из ваших текстовых полей «динамическим», чтобы все, что вам нужно было сделать, это изменить то, что находится в связанной ячейке. Эта ячейка может содержать текстовое значение, числовое значение, дату или формулу — на самом деле это не имеет значения.

Вот как достичь этой техники: выберите текстовое поле, которое вы хотите связать с ячейкой, щелкнув по нему один раз. Знакомые маркеры должны появиться за пределами текстового поля. Затем в строке формул введите ссылку на ячейку. Вы можете сделать это, введя его так:

=$C$15

Это связывает содержимое текстового поля с содержимым ячейки C15. Вы также можете, если хотите, удалить все, что находится на панели формул, и, когда панель формул активна, щелкните ячейку, которую вы хотите связать. Адрес ячейки должен появиться в строке формул. Нажмите Enter, и задача выполнена.

Теперь введите что-нибудь в соответствующую ячейку. Все, что вы вводите, должно немедленно отображаться в текстовом поле.

Прежде чем можно будет дать некоторые потенциальные ответы, связанные с макросами, вам понадобится немного информации об объектной модели Excel, доступной через VBA.

В книге могут содержаться диаграммы двух типов: лист диаграммы и встроенная диаграмма. Листы диаграммы представлены объектом Chart и принадлежат коллекции Charts. С другой стороны, встроенные диаграммы представлены объектом Chart, который принадлежит коллекции ChartObjects, которая, в свою очередь, принадлежит объекту рабочего листа.

Если вы разместите текстовое поле на реальном листе диаграммы, то к нему можно будет получить доступ следующим образом:

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

Этот макрос проходит через каждый лист диаграммы, а затем через каждое текстовое поле на каждом листе диаграммы. Все, что находится в каждом текстовом поле, затем отображается в окне сообщения. Если вы хотите изменить содержимое окна сообщения, все, что вам нужно сделать, это установить свойство Text объекта TextRange.

Другое дело — текстовые поля на встроенных диаграммах. Зачем? Поскольку возможно, что текстовое поле на самом деле не является частью диаграммы, а является частью рабочего листа. Другими словами, «родительским элементом» текстового поля может быть либо встроенная диаграмма, либо рабочий лист.

Хороший способ узнать, является ли текстовое поле частью встроенной диаграммы, — создать макрос, аналогичный только что представленному. Однако этот может пройти по каждой встроенной диаграмме на каждом листе и найти каждую фигуру (текстовое поле) в этой диаграмме.

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

Когда вы запустите макрос, вы увидите окно сообщения для каждого текстового поля, которое действительно является дочерним элементом встроенных диаграмм. Затем вы увидите окно сообщения для любых текстовых полей, которые являются дочерними для рабочего листа. Как и в предыдущем макросе, этот макрос проверяет, действительно ли объект Shape является текстовым полем, перед отображением любой информации о нем. Это особенно важно при пошаговом обходе каждой фигуры на листе, потому что любые встроенные диаграммы на листе также считаются частью коллекции фигур.

Как и раньше, чтобы изменить текст, содержащийся в текстовом поле, все, что вам нужно сделать, это изменить свойство Text объекта TextRange.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (13377) применим к Microsoft Excel 2007, 2010 и 2013.