ドンは、ワークブックに複数のグラフを持っています。各グラフには、現在のデータの日付とグラフが更新された日付が記載された2つのテキストボックスが含まれています。これらのグラフのテキストボックス内のすべてのテキストをマクロで変更したいのですが、タスクを実行するための適切な手法がわかりません。

もちろん、これはマクロを使用して実行できますが、マクロを使用せずに実行する方法があることを理解する必要があります。必要に応じて、テキストボックスに表示されている内容をセルの内容に関連付けることができます。これは、各テキストボックスを「動的」にして、関連するセルの内容を変更するだけで済むことを意味します。そのセルには、テキスト値、数値、日付、または数式を含めることができますが、実際には問題ではありません。

この手法を実現する方法は次のとおりです。セルを1回クリックして、セルに関連付けるテキストボックスを選択します。おなじみのハンドルがテキストボックスの外側に表示されます。次に、数式バーにセル参照を入力します。次のように入力すると、これを行うことができます:

=$C$15

これにより、テキストボックスの内容がセルC15にあるものに関連付けられます。必要に応じて、数式バーにあるものをすべて削除し、数式バーをアクティブにして、リンクするセルをクリックすることもできます。セルのアドレスが数式バーに表示されます。 Enterキーを押すと、タスクが完了します。

次に、関連するセルに何かを入力します。入力した内容はすべて、テキストボックスにすぐに表示されます。

いくつかの潜在的なマクロ関連の回答を提供する前に、VBAからアクセスできるExcelのオブジェクトモデルに関する背景情報が少し必要です。

ブックに含めることができるグラフには、グラフシートと埋め込みグラフの2種類があります。チャートシートはChartオブジェクトで表され、Chartsコレクションに属します。一方、埋め込みグラフは、ChartObjectsコレクションに属する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

このマクロは、各チャートシートをステップスルーし、次に各チャートシートの各テキストボックスをステップスルーします。各テキストボックスにあるものはすべて、メッセージボックスに表示されます。メッセージボックスの内容を変更する場合は、TextRangeオブジェクトのTextプロパティを設定するだけです。

埋め込まれたグラフのテキストボックスは別の話です。どうして?テキストボックスが実際にはグラフの一部ではなく、ワークシートの一部である可能性があるためです。言い換えると、テキストボックスの「親」は、埋め込みグラフまたはワークシートのいずれかです。

テキストボックスが埋め込みグラフの一部であるかどうかを確認する良い方法は、今提示したものと同様のマクロを作成することです。ただし、これは、各ワークシートに埋め込まれた各グラフをステップスルーして、そのグラフ内の各形状(テキストボックス)を見つけることができます。

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オブジェクトに関する情報を表示する前に、Shapeオブジェクトが実際にテキストボックスであることを確認します。シートに埋め込まれたグラフもShapesコレクションの一部と見なされるため、これはワークシートの各図形をステップスルーするときに特に重要です。

以前と同様に、テキストボックスに含まれるテキストを変更するには、TextRangeオブジェクトのTextプロパティを変更するだけです。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(13377)は、Microsoft Excel 2007、2010、および2013に適用されます。