25. Excelデータを使用しての自動化

データが Excel で提供されている場合、関数 UpdateChart および PresentationFromTemplate を使用して、そのデータを使用してプログラムで制御できます。

UpdateChart を使用すると、特定の要素のデータシートを Excel データと交換できます。PresentationFromTemplate を使用すると、「21. Excel データ リンク」で説明されているように、データを使用して Excel のデータ範囲にリンクされた think-cell 要素を含む PowerPoint テンプレートに基づく新しいプレゼンテーションを作成できます。

両方の機能へのインターフェイスは Office オートメーション モデルに統合されているため、Visual Basic for Applications (VBA) や C# など、Office をプログラミングできる任意の言語からアクセスできます。詳細な手順については、「はじめに」を参照してください。

think-cell へのエントリ ポイントは、think-cell アドイン オブジェクトです。これには Application.COMAddIns コレクションからアクセスできます。think-cell への呼び出しは、常に遅延結合です。詳細は Microsoft のサポート技術情報を参照してください。

自動化での事前バインディングと遅延バインディングの使用

このように、think-cell アドイン オブジェクトのタイプは単に Object であり、追加するタイプ ライブラリまたは参照はありません。オブジェクトを取得するだけで、呼び出す準備が整います。たとえば、Excel の VBA では次のようになります。

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

C# では、think-cell アドイン オブジェクトへの参照を dynamic として宣言することで遅延バインディングを実現できます。 これは、参照を var として宣言するときにコンパイラによって推論される型でもあるため、単純に次のように記述できます。

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

ここで xlapp は、think-cell がロードされている Excel.Application オブジェクトへの参照です。

25.1
グラフの更新
25.2
テンプレートからのプレゼンテーション

25.1 グラフの更新

25.1.1 署名

VBA
tcXlAddIn.UpdateChart( _ 
    target As Object, _ 
    strName As String, _ 
    rgData As Excel.Range, _ 
    bTransposed As Boolean _ 
)
C#
void tcXlAddIn.UpdateChart(
    object target,
    string strName,
    Excel.Range rgData,
    bool bTransposed
);

25.1.2 説明

この関数は、target 内の strName という名前のすべての要素を、rgData に含まれるデータで更新します。データがグラフで正しく解釈されるためには、範囲 rgData が既定のデータシート レイアウトまたはその転置されたバージョンに準拠している必要があります。Excel からのグラフ作成 および データレイアウトの調整 も参照してください。bTransposed をそれぞれ false または true に設定することで、既定バージョンまたは転置バージョンのどちらを使用するかが示されます。グラフ以外の要素、たとえば表の場合、bTransposed の値は無視されます。

target Presentation または SlideRange、または単一の SlideMaster、または CustomLayout でなければなりません。

グラフ名 strName は大文字と小文字を区別して整合されます。この機能は以前、 にあるUpdateChart Name24. オートメーション機能のご紹介 プロパティ コントロールを使用してPowerPoint に割り当てられていました。

正しい要素がターゲットにされていることを確認するには、pres として渡されたオブジェクトで UpdateChart 名strName に設定されている唯一の要素であることを確認してください。

この関数を呼び出すときに要素が何らかの Excel データの範囲にリンクされていると、リンクが切断されます。その後、要素はいかなる Excel の範囲にもリンクされません。

25.1.3 例

これらのサンプルを使用するには、24. オートメーション機能のご紹介 の説明に従ってプレゼンテーションを準備し、C:\Samples\UpdateChart\template.pptx として保存します。

VBA

このサンプルを使用するには、Excel ワークブックのモジュールに追加します。

Microsoft PowerPoint 16.0 オブジェクト ライブラリへの参照が必要です (詳細については Visual Basic for Applications を参照してください)。

ワークブックで UpdateChart_Sample を実行すると、最初のシートの範囲 A1:D5 に含まれるデータでプレゼンテーション テンプレートのグラフが更新されます。

Option Explicit 
 
Sub UpdateChart_Sample() 

    ' Get the range containing the new data 
    Dim rng As Excel.Range 
    Set rng = ActiveWorkbook.Sheets(1).Range("A1:D5") 

    ' Get the think-cell 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 be started. 
    ' Otherwise the existing one is used.

    Dim ppapp As Object 
    Set ppapp = New PowerPoint.Application 

    Dim pres As PowerPoint.Presentation 

    ' PowerPoint window visible 
    ' Set pres = ppapp.Presentations.Open( _ 
    '  Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    '  Untitled:=msoTrue) 

    ' PowerPoint window invisible 

    Set pres = ppapp.Presentations.Open( _
    Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    Untitled:=msoTrue, _
    WithWindow:=msoFalse)

    Call tcXlAddIn.UpdateChart(pres, "Chart1", rng, False) 

    ' Save the updated presentation 
    pres.SaveAs ("C:\\Samples\\UpdateChart\\template_updated.pptx") 
    pres.Close 

    ppapp.Quit 
End Sub

C#

このサンプルを使用するには、C# コンソール アプリ プロジェクト テンプレートの Program.cs 内のコードをそれに置き換えます。

Microsoft PowerPoint 16.0 オブジェクト ライブラリMicrosoft Excel 16.0 オブジェクト ライブラリMicrosoft Office 16.0 オブジェクト ライブラリへの参照が必要です (詳細については、C# を参照してください)。

結果のアプリケーションを実行すると、プレゼンテーション テンプレートのグラフが更新され、値が 1、2、3 の「系列 1」という名前の単一の系列が含まれるようになり、結果が template_updated.pptx として保存されます。

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

namespace ConsoleApplication_UpdateChart
{
    class Program
    {
        static void Main()
        {
            Excel.Application xlapp = new Excel.Application { Visible = true };

            Excel.Workbook workbook = xlapp.Workbooks.Add(1);
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
            worksheet.Cells[3, 1] = "Series 1";
            worksheet.Cells[3, 2] = 1;
            worksheet.Cells[3, 3] = 2;
            worksheet.Cells[3, 4] = 3;

            PowerPoint.Application ppapp = new PowerPoint.Application();
            PowerPoint.Presentation presentation = ppapp.Presentations.Open(
                    "C:\\Samples\\UpdateChart\\template.pptx",
                    Office.MsoTriState.msoFalse,
                    Office.MsoTriState.msoTrue
            );

            var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
            tcXlAddIn.UpdateChart(
                presentation,
                "Chart1",
                worksheet.get_Range("A1", "D3"),
                false
            );

            presentation.SaveAs("C:\\Samples\\UpdateChart\\template_updated.pptx");
            presentation.Close();
            ppapp.Quit();

            workbook.Close(false);
            xlapp.Quit();
        }
    }
}

25.2 テンプレートからのプレゼンテーション

25.2.1 署名

VBA
tcXlAddIn.PresentationFromTemplate( _ 
    wb As Excel.Workbook, _ 
    strTemplate As String, _ 
    ppapp As PowerPoint.Application _ 
) As PowerPoint.Presentation
C#
PowerPoint.Presentation tcXlAddIn.PresentationFromTemplate(
    Excel.Workbook wb,
    string strTemplate,
    PowerPoint.Application ppapp
);

25.2.2 説明

この関数は、Excel ワークブック wb とファイル名が strTemplate のテンプレートとの間のデータ リンクを使用して、リンク先の範囲のデータでリンクされた要素を更新することにより、そのテンプレートをインスタンス化します。その結果、PowerPoint インスタンス ppapp 内に新しいプレゼンテーションが作成されます。

strTemplate は完全なパスでも相対パスでもかまいませんが、その後、Excel のブックファイル の場所に関連付けられます。wb

Excel ブック wb にリンクされている strTemplate のすべてのグラフは、(自動更新に設定されているかどうかに関係なく) 更新されます。結果のプレゼンテーションでは、これらの要素がさらに変更されるのを防ぐために、それらのデータ リンクが壊れています。

wb 以外の Excel ブックにリンクされている strTemplate のグラフは変更されずにリンクされているため、この関数の結果を新しいテンプレートとして保存して次のブックでこの関数を再度呼び出すことで、複数の Excel ブックからリンクを更新できます。

Excel リンクを使用してグラフ セグメントの色またはテーブル セルのフォーマットを制御する場合は、配色を [トップでデータシートの塗りつぶしを使用] (配色 を参照) または [データシートを使用...] オプション (表の書式設定 を参照) にそれぞれ設定できます。同様に、Excel リンクで表示形式をコントロールするには、[Excel の書式設定を使用する] に設定します (数値形式参照)。

PresentationFromTemplate を呼び出す前に、Excel の各セルの背景色と数値形式を設定してください。

25.2.3 例

これらのサンプルを使用するには、まず Excel からのグラフ作成 で説明されているように、Excel ワークブックの最初のシートの範囲 G1:K4 にリンクされた積み上げグラフを含むプレゼンテーションを作成します。結果のプレゼンテーションを C:\Samples\PresentationFromTemplate\template.pptx として保存し、ワークブックを data.xlsx として同じディレクトリに保存します。

VBA

このサンプルを使用するには、上記で準備した Excel ワークブック data.xlsx のモジュールに追加します。

Microsoft PowerPoint 16.0 オブジェクト ライブラリへの参照が必要です (詳細については Visual Basic for Applications を参照してください)。

PresentationFromTemplate_Sample を実行すると、template.pptx に含まれるチャートの最初の系列の最初の値にリンクされているセル Sheet1!H3 の値が i=1 から 10 に変更され、その値を含むように更新されたテンプレート内のグラフで新しいプレゼンテーションが作成されます。 これはワークブックにリンクされなくなり、テンプレートと同じディレクトリに output_i.pptx として保存します。

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 think-cell 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 be started.
    ' 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#

このサンプルを使用するには、C# コンソール アプリ プロジェクト テンプレートの Program.cs 内のコードをそれに置き換えます。

Microsoft PowerPoint 16.0 オブジェクト ライブラリMicrosoft Excel 16.0 オブジェクト ライブラリMicrosoft Office 16.0 オブジェクト ライブラリへの参照が必要です (詳細については、C# を参照してください)。

結果のアプリケーションを実行すると、目に見えて Excel が開き、ワークブック data.xlsx が読み込まれ、template.pptx に含まれるグラフの最初の系列の最初の値にリンクされているセル H3 の値が i=1 から 10 に変更され、その値を含むように更新されたテンプレート内のグラフで新しいプレゼンテーションが作成されます。 これはワークブックにリンクされなくなり、テンプレートと同じディレクトリに output_i.pptx として保存します。

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();
        }
    }
}

共有する