Excel データによる自動化

Windows では、thinkcell API 関数を使用して、Excel のデータを含む thinkcell プレゼンテーションをプログラムで作成できます。

Excel データを使用した自動化の概要

Windowsのみ

Excel の自動化は、毎回データを手動で更新せずに大規模なレポートを定期的に生成する必要がある場合に特に役立ちます。小規模なグラフ作成やアドホックなグラフ作成には、Excel データ リンク の使用をお勧めします。

PowerPoint テンプレートのコピーを作成し、Excel ブックにリンクされている、コピーされたプレゼンテーション内のすべての thinkcell 要素を更新するには(Excel データ リンク を参照)、PresentationFromTemplate 関数を使用します。

PowerPoint テンプレート内の特定の thinkcell 要素を、Excel にリンクされているかどうかにかかわらず更新するには、UpdateBatch API を使用します。UpdateBatch は UpdateChart(非推奨)に置き換わりました。ただし、既存のコードで UpdateChart を使用している場合、そのコードは引き続き機能します。

thinkcell API と Office Automation

thinkcell API は Microsoft の Component Object Model(COM)に統合されているため、Visual Basic for Applications(VBA)や C# など、Office をプログラムできる任意の言語から API にアクセスできます。VBA と C# の使用方法については、thinkcell APIを使い始める を参照してください。

thinkcell へのエントリーポイントは、thinkcell アドイン オブジェクトです。このオブジェクトには、Application.COMAddIns コレクション経由でアクセスできます。thinkcell への呼び出しは常に遅延バインディングです(Microsoft Learn を参照)。したがって、thinkcell アドイン オブジェクトの型は単に Object であり、型ライブラリや参照を追加する必要はありません。オブジェクトを取得したら、呼び出しを行う準備が整います。たとえば、Excel の VBA では、次のコードを使用します。

Dim tcXlAddIn As Object 
Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

C# では、thinkcell アドイン オブジェクトへの参照を dynamic として宣言することで、遅延バインディングを実現できます。参照を var として宣言すると、コンパイラーはそのオブジェクトの型を dynamic と推論するため、次のコードをそのまま使用できます。ここで、xlapp は thinkcell を読み込む Excel.Application オブジェクトへの参照です。

var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;

Excel とテンプレートのデータ レイアウトを一致させる

データを対応するグラフに正しく表示するには、Excel でのデータ レイアウトが、テンプレート内のグラフのデータシート レイアウトと一致している必要があります(リンクされた範囲のデータレイアウトを入れ替え、編集する を参照)。たとえば、テンプレート グラフに 100%= 行を追加すると、thinkcell は Excel データの 2 行目を、割合の計算元となる合計として解釈します。

次の表は、一般的なデータ レイアウト オプション、データ レイアウト内での位置、既定の設定をまとめたものです。特定のグラフのデータ レイアウトを確認するには、グラフをダブルクリックしてデータシートを開きます。

データ レイアウト オプション

内容

位置

既定の設定

Series

系列ラベル

列 1

選択済み

Category

カテゴリ ラベル

行 1

選択済み

100%=

割合計算用の合計

行 2(Category が選択されている場合)
行 1(Category が選択されていない場合)

未選択

要素の書式を Excel に一致させる

数値書式、塗りつぶし、フォントの色など、要素の書式を Excel ブック内の書式に一致させることができます。PresentationFromTemplate または UpdateBatch を呼び出す前に、Excel ブックで必要な書式を適用します。次に、PowerPoint テンプレートで、要素の数値書式、フォント書式、塗りつぶし、または罫線を Excel ブックに一致させます(要素の書式をリンクされたデータ範囲に合わせる を参照)。

PresentationFromTemplate

Windowsのみ

PresentationFromTemplate 関数は、PowerPoint テンプレートのコピーを作成し、Excel ブックにリンクされている、コピーされたプレゼンテーション内のすべての thinkcell 要素を更新します。リンクされた thinkcell 要素の詳細については、Excel データ リンク を参照してください。

PresentationFromTemplate シグネチャ

VBA

tcXlAddIn.PresentationFromTemplate( _ 
	Workbook As Excel.Workbook, _ 
	Template As String, _ 
	PpApplication As PowerPoint.Application _ 
) As PowerPoint.Presentation

C#

PowerPoint.Presentation tcXlAddIn.PresentationFromTemplate(
	Excel.Workbook Workbook,
	string Template,
	PowerPoint.Application PpApplication
);

PresentationFromTemplate の説明

PresentationFromTemplate は次の引数を取ります。

  • Workbook は、データを含む Excel ブックを指します。
  • Template は、データを入力したい要素を含む PowerPoint テンプレートを指します。要素にデータを入力するには、その要素が Workbook 内の範囲にリンクされている必要があります(Excel データ リンク を参照)。Template には、Workbook の場所からの相対パスまたは絶対パスを指定できます。
  • PpApplication は、新しいプレゼンテーションを生成する PowerPoint インスタンスを指します。

PresentationAsTemplate は Template のコピーを作成し、要素を自動更新するように設定しているかどうかにかかわらず、コピーされたプレゼンテーション内で Workbook にリンクされているすべての要素を更新します(リンク要素内のデータの管理 を参照)。

新しいプレゼンテーションでは、PresentationFromTemplate は、意図しない追加更新を防ぐため、更新された要素の Excel リンクを意図的に解除します。ただし、この関数が更新しない要素は Excel リンクを保持します。つまり、複数の Excel ブックからリンクを更新できます。そのためには、新しいプレゼンテーションを作成した後、次のブックを指定して PresentationFromTemplate を再度呼び出し、作成したばかりのプレゼンテーションをテンプレートとして使用します。

PresentationFromTemplate の例

これらの例を使用するには、まず Excel ブックの最初のシートにある範囲 G1:K4 にリンクされた積み上げ縦棒グラフを含むプレゼンテーションを作成します(Excel からグラフを作成する を参照)。プレゼンテーションを C:\Samples\PresentationFromTemplate\template.pptx として保存し、ブックを同じディレクトリに data.xlsx として保存します。

VBA

この例では、Sheet1 で、プロシージャ PresentationFromTemplate_Sample() が H3 の値を i=1 から 10 まで変更します。H3 は、積み上げ縦棒グラフの最初の系列の最初の値にリンクされています。H3 の新しい値ごとに、PresentationFromTemplate_Sample() は次を実行します。

  1. template.pptx のコピーを作成します。
  2. コピーされたプレゼンテーションで、新しい値を使ってグラフを更新します。
  3. グラフの Excel リンクを解除します。
  4. テンプレートと同じディレクトリに、新しいプレゼンテーションを output_i.pptx として保存します。

この例を使用するには、先ほど作成した Excel ブック data.xlsx で、次のプロシージャを含むモジュールを作成します。このモジュールには、Microsoft PowerPoint 16.0 Object Library への参照が必要です(Visual Basic for Applications を参照)。

Option Explicit

Sub PresentationFromTemplate_Sample()
	' Get the range to modify. It is more efficient
	' to do this once rather than within the loop.
	Dim rng As Excel.Range
	Set rng = ActiveWorkbook.Sheets(1).Cells(3, 8)
	
	' Get the thinkcell add-in object
	Dim tcXlAddIn As Object
	Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object
	
	' Get a PowerPoint instance. Hold on to this
	' object as long as you want to access the
	' generated presentations. There can only be a
	' single PowerPoint instance. If there is no
	' PowerPoint running, one will start.
	' Otherwise the existing one is used.
	Dim ppapp As Object
	Set ppapp = New PowerPoint.Application
	
	Dim i As Integer
	For i = 1 To 10
		' Modify the range value.
		' Note: Avoid selecting the cell prior to
		' changing it. It is very slow and has
		' undesirable side-effects.
		' BAD:
		' rng.Select
		' ActiveWindow.Selection.Value = 0
		' GOOD:
		rng.Value = i
	
		' Generate a new presentation based on the
		' linked template.
		Dim pres As PowerPoint.Presentation
		Set pres = tcXlAddIn.PresentationFromTemplate( _
			Excel.ActiveWorkbook, "template.pptx", ppapp _
		)
	
		' If you want to modify the new presentation
		' before saving it this is the place to do it.
	
		' Save the new presentation
		pres.SaveAs "C:\Samples\PresentationFromTemplate\output_" & i & ".pptx"
	
		' Explicitly close the presentation when we
		' are done with it to free its memory.
		' Letting the object go out of scope is not
		' sufficient.
		pres.Close
	Next
End Sub

C#

この例では、プログラムが Excel を開き、data.xlsx を読み込みます。次に、Sheet1 で、プログラムは H3 の値を i=1 から 10 まで変更します。H3 は、積み上げ縦棒グラフの最初の系列の最初の値にリンクされています。H3 の新しい値ごとに、プログラムは次を実行します。

  1. template.pptx のコピーを作成します。
  2. コピーされたプレゼンテーションで、新しい値を使ってグラフを更新します。
  3. グラフの Excel リンクを解除します。
  4. テンプレートと同じディレクトリに、新しいプレゼンテーションを output_i.pptx として保存します。

この例を使用するには、C# Console App プロジェクト テンプレートで、Program.cs 内のコードを次のコードに置き換えます。このプログラムには、Microsoft PowerPoint 16.0 Object Library、Microsoft Excel 16.0 Object Library、および Microsoft Office 16.0 Object Library への参照が必要です(C# を参照)。

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication_PresentationFromTemplate
{
	class Program
	{
		static void Main()
		{
			var xlapp = new Excel.Application { Visible = true };
			var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
			var workbook = xlapp.Workbooks.Open("C:\\Samples\\PresentationFromTemplate\\data.xlsx");
			var ppapp = new PowerPoint.Application();
			for (var i = 1; i <= 10; ++i)
			{
				workbook.Sheets[1].Cells[3, 8] = i;
				
				PowerPoint.Presentation presentation = tcXlAddIn.PresentationFromTemplate(
					workbook,
					"C:\\Samples\\PresentationFromTemplate\\template.pptx",
					ppapp
				);
				
				presentation.SaveAs("C:\\Samples\\PresentationFromTemplate\\output" + i + ".pptx");
				presentation.Close();
			}
			ppapp.Quit();
			workbook.Close(false);
			xlapp.Quit();
		}
	}
}

UpdateBatch

Windowsのみ

UpdateBatch API を使用すると、PowerPoint テンプレート内のどの thinkcell 要素を新しい Excel データで更新するかを指定できます。要素が Excel にリンクされているかどうかにかかわらず更新できます。

UpdateBatch は UpdateChart(非推奨)に置き換わりました。UpdateChart を使用する既存のコードは引き続き機能しますが、代わりに UpdateBatch の使用をお勧めする理由は次のとおりです。

  • 表の画像に Excel データを入力するなどの新機能(表の画像を作成する を参照)は、UpdateBatch でのみ利用できます。
  • 新しい thinkcell バージョンでは、特に大きなプレゼンテーションの場合、UpdateChart が非常に遅くなることがあります。

UpdateBatch シグネチャ

VBA

tcXlAddIn.CreateUpdate() As Object

tcUpdate.AddRangeData(
	Target As Object, _
	Name As String, _
	Range As Excel.Range, _
	Transposed As Boolean _
)

tcUpdate.AddRangeImage(
	Target As Object, _
	Name As String, _
	Range As Excel.Range _
)

tcUpdate.Send()

C#

object tcXlAddIn.CreateUpdate();

void tcUpdate.AddRangeData(
	object Target,
	string Name,
	Excel.Range Range,
	bool Transposed
);

void tcUpdate.AddRangeImage(
	object Target,
	string Name,
	Excel.Range Range
);

void tcUpdate.Send();

UpdateBatch の説明

UpdateBatch には次の関数が含まれています。

  • CreateUpdate は、更新したいすべての要素と、それに対応する Excel データ範囲を保存するオブジェクトを作成します。
  • AddRangeData は、Excel データを入力したいグラフ、表、自動化テキスト フィールド、Harvey ball、チェックボックス、または画像の更新をスケジュールします。
  • AddRangeImage は、Excel データを入力したい表の画像の更新をスケジュールします(表の画像を作成する を参照)。
  • Send は Excel データを収集し、PowerPoint に送信してプレゼンテーションを作成します。コードが PowerPoint テンプレート内の Excel リンク要素を対象としている場合、これらのリンクは解除されます(Excel データ リンク を参照)。

AddRangeData と AddRangeImage は、次の引数を取ります。

  • Target は、データを入力する要素を含む PowerPoint テンプレートを指します。Target には、Presentation、SlideRange、Slide、Master、または CustomLayout を指定できます。
  • Name は、AddRangeData または AddRangeImage の名前を持つ要素を指します。UpdateBatch を実行する前に、PowerPoint テンプレート内で AddRangeData Name または AddRangeImage Name を使用して名前を割り当てる必要があります(レポート自動化用の PowerPoint テンプレートを作成する を参照)。名前では大文字と小文字は区別されません。Target 内の 2 つの要素に同じ名前が付いている場合、thinkcell はそれらに同じデータを入力します。
  • Range は、その要素のデータを含む Excel 範囲を指します。
  • Transposed(AddRangeData のみ):Excel 範囲の向きが、PowerPoint 内の要素のデータシートの既定の向きと一致する場合は、Transposed を False に設定します。一致しない場合は、Transposed を True に設定します。要素タイプごとの引数値の説明については、次の表を参照してください。

要素タイプ

Transposed の値

ガント、散布図、バブル チャートを除くすべてのグラフ

False = 要素のデータシートで、Range の行が系列を表し、列がカテゴリーを表します

True = 要素のデータシートで、Range の列が系列を表し、行がカテゴリーを表します

表

False = 表のレイアウトが Range と一致します

True = 表のレイアウトが Range に対して転置されています

ガント チャート

False = 要素のデータシートで、Range の行がアクティビティを表し、列が対応するアンカー ポイントを表します

True = 要素のデータシートで、Range の列がアクティビティを表し、行が対応するアンカー ポイントを表します

散布図とバブル チャート

False = 要素のデータシートで、Range の行がデータ ポイントを表し、列がディメンションを表します

True = 要素のデータシートで、Range の列がデータ ポイントを表し、行がディメンションを表します

UpdateBatch の例

次の VBA および C# のコード例では、PowerPoint テンプレート内の 3 つの要素を、Excel ブックの最初のシートにあるデータで更新します。例では、作成されたプレゼンテーションを template_updated.pptx として保存します。

これらの例を使用するには、thinkcell 要素を含む PowerPoint テンプレートと、要素に入力するデータを含む Excel ブックを作成します。

PowerPoint テンプレートを作成するには、次の手順に従います。

  1. PowerPoint テンプレートの例 の説明に従って、スライド タイトルとグラフを含む PowerPoint プレゼンテーションを作成します。
  2. プレゼンテーションに表の画像を追加します(表の画像を作成する を参照)。
  3. 表のミニ ツールバーを開きます。AddRangeImage Name に TableAsImage1 と入力します。Enter を選択します。
  4. プレゼンテーションを C:\Samples\UpdateBatch\template.pptx に保存します。

Excel ブックを作成するには、次の手順に従います。

  1. Excel ブックを開きます。
  2. A1 にスライド タイトルを入力します。
  3. A2:D5 にグラフ データを入力します。Excel のデータ レイアウトが、PowerPoint テンプレート内のグラフのデータシート レイアウトと一致していることを確認してください(Excel とテンプレートのデータ レイアウトを一致させる を参照)。
  4. A7:D10 に表データを入力します。塗りつぶしや罫線など、適用した表の書式設定は新しいプレゼンテーションに反映されます。
  5. ブックを C:\Samples\UpdateBatch\data.xlsx に保存します。

UpdateBatch プロシージャでパスを指定する場合は、ディレクトリ区切り文字として二重バックスラッシュ(\\)を使用します。

VBA

このコード例を使用するには、先ほど作成した Excel ブックで、次のプロシージャを含むモジュールを作成します。このモジュールには Microsoft PowerPoint 16.0 Object Library への参照が必要です。詳細については、Visual Basic for Applications を参照してください。

Option Explicit

Sub UpdateBatch_Sample()
	
	' Get the ranges that contain the new data
	Dim rngTitle As Excel.Range
	Set rngTitle = ActiveWorkbook.Sheets(1).Range("A1")
	Dim rngChart As Excel.Range
	Set rngChart = ActiveWorkbook.Sheets(1).Range("A2:D5")
	Dim rngTableAsImage As Excel.Range
	Set rngTableAsImage = ActiveWorkbook.Sheets(1).Range("A7:D10")

	' Get the thinkcell add-in object
	Dim tcXlAddIn As Object
	Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

	' Get a PowerPoint instance. Hold onto this object as long as
	' you want to access the new presentation. There can only be one
	' PowerPoint instance. If there is no instance, the script will
	' start one. Otherwise, the script uses the existing instance.
	Dim ppapp As Object
	Set ppapp = New PowerPoint.Application

	Dim pres As PowerPoint.Presentation

	' When the script ends, this code opens the new presentation
	' so that you can edit it further. To keep the presentation open,
	' also remove pres.Close and ppapp.Quit.
	' Set pres = ppapp.Presentations.Open( _
	' 	Filename:="C:\\Samples\\UpdateBatch\\template.pptx", _
	' 	Untitled:=msoTrue _
	' )

	' When the script ends, this code does not open the new presentation.
	Set pres = ppapp.Presentations.Open( _
		Filename:="C:\\Samples\\UpdateBatch\\template.pptx", _
		Untitled:=msoTrue, _
		WithWindow:=msoFalse _
	)

	Dim tcUpdate As Object
	Set tcUpdate = tcXlAddIn.CreateUpdate
          
	Call tcUpdate.AddRangeData(pres, "Title", rngTitle, False)
	Call tcUpdate.AddRangeData(pres, "Chart1", rngChart, False)
	Call tcUpdate.AddRangeImage(pres, "TableAsImage1", rngTableAsImage)
	Call tcUpdate.Send

	pres.SaveAs("C:\\Samples\\UpdateBatch\\template_updated.pptx")
	pres.Close

	ppapp.Quit

End Sub

C#

このコード例を使用するには、C# Console App プロジェクト テンプレートで、Program.cs のコードを次のコードに置き換えます。

このプログラムには、Microsoft PowerPoint 16.0 Object Library、Microsoft Excel 16.0 Object Library、および Microsoft Office 16.0 Object Library への参照が必要です。詳細については、C# を参照してください。

using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;

namespace ConsoleApplication_UpdateBatch
{
	class Program
	{
		static void Main()
		{
			
			PowerPoint.Application ppapp = new PowerPoint.Application();
			PowerPoint.Presentation presentation = ppapp.Presentations.Open(
				"C:\\Samples\\UpdateBatch\\template.pptx",
				Office.MsoTriState.msoFalse,
				Office.MsoTriState.msoTrue
			);
			
			Excel.Application xlapp = new Excel.Application { Visible = true };
			Excel.Workbook workbook = xlapp.Workbooks.Open(
				"C:\\Samples\\UpdateBatch\\data.xlsx",
				Office.MsoTriState.msoFalse,
				Office.MsoTriState.msoTrue
			);
			Excel.Worksheet worksheet = workbook.Sheets[1];
			
			var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
			var tcUpdate = tcXlAddIn.CreateUpdate();
			
			tcUpdate.AddRangeData(
				presentation,
				"SlideTitle",
				worksheet.get_Range("A1"),
				true
			);
			
			tcUpdate.AddRangeData(
				presentation,
				"Chart1",
				worksheet.get_Range("A2", "D5"),
				true
			);
			
			tcUpdate.AddRangeImage(
				presentation,
				"TableAsImage1",
				worksheet.get_Range("A7", "D10")
			);
			
			tcUpdate.Send();
			
			presentation.SaveAs("C:\\Samples\\UpdateBatch\\template_updated.pptx");
			presentation.Close();
			ppapp.Quit();
			
			workbook.Close(false);
			xlapp.Quit();
		}
	}
}

UpdateChart(非推奨)

Windowsのみ

UpdateChart は、特定の要素のデータシートを Excel データで更新します。

UpdateBatch は UpdateChart に代わるものです(UpdateBatch を参照)。UpdateChart を使用した既存のコードは引き続き動作しますが、新しいコードでは代わりに UpdateBatch の使用を推奨する理由は次のとおりです。

  • 表の画像に Excel データを入力するなどの新機能(表の画像を作成する を参照)は、UpdateBatch でのみ利用できます。
  • 新しい thinkcell バージョンでは、特に大きなプレゼンテーションの場合、UpdateChart が非常に遅くなることがあります。

UpdateChart のシグネチャ

VBA

tcXlAddIn.UpdateChart( _
	Target As Object, _
	ChartName As String, _
	Range As Excel.Range, _
	Transposed As Boolean _
)

C#

void tcXlAddIn.UpdateChart(
	object Target,
	string ChartName,
	Excel.Range Range,
	bool Transposed
);

トラブルシューティングが必要ですか?

ナレッジベースをご確認ください