Contents
したいこと
VSTOでエクセルのセルの内に画像を挿入する
VSTOでエクセルのセルの内に画像を貼り付ける
結論
Shape Interfaceの「Placement」プロパティーにXlPlacement Enumを設定する。
「xlMove」は、「オブジェクトはセルと共に移動するが、画像の大きさは変わらない。」
「xlMoveAndSize」は、「オブジェクトはセルと共に移動し、セルに合わせてサイズが変更されます。」(ただし、画像の大きさが変更されるのは画像とセルのサイズが同じか、大きい場合です。)
調査の経緯
手動ならどうするか
こういう場合、セルの中に手動で貼り付ける方法があるのでそこから調べます。
第134回 Excelのセルに画像を埋め込む等を参考にさせてもらいました。
写真を右クリック→[図の書式設定]→[セルに合わせて移動やサイズ変更をする]がそれにあたります。
ググる
「VSTO エクセル オブジェクト 位置関係」、「VSTO エクセル セル 画像 埋め込み」等でさがしてみましたが、見つかりませんでした。だいたいこういうやり方でヒットするんですが、ちょっと今回はヒットしませんでした。
過去の自分を思い起こす
そういえば、エクセル貼り付けした記事があったので、その中にヒントがないか探しました。
“AddPicture”関数の中が生成する”Microsoft.Office.Interop.Excel.Shape shape”にプロパティーがありそうなので、探してみました。
マイクロソフト公式を探す
Shape Interfaceを探していくとありました。「Placement」プロパティーがそれにあたるようです。
オブジェクトがその下のセルに関連付けられている方法を設定または返します。 読み取り/書き込みXlPlacement。Shape Interfaceより
ちょっと表現としてそのままではないのですが試してみる価値はありそうです。
一応、XlPlacement Enumも見てます。
xlMoveAndSize:オブジェクトはセルと共に移動し、セルに合わせてサイズが変更されます。「XlPlacement Enum」より
もうこれで間違いないので、サンプルを作成して動きを確かめてみます。
実際にやってみる – コード編
やってみた結果ををまとめて書きます。ベースは同じエクセルに画像を貼り付ける記事のコードです。
セルより大きい画像を貼り付ける場合
.........(「VSTO Excelでシートに画像を挿入・追加する」のコードとまったく同じ) // 倍率を100%にする ここも同じ shape.ScaleHeight(1.0F, Microsoft.Office.Core.MsoTriState.msoCTrue); shape.ScaleWidth(1.0F, Microsoft.Office.Core.MsoTriState.msoCTrue); // 今回追加の部分 shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlMoveAndSize;
セルと同じ大きさの画像を張り付ける場合
.........(「VSTO Excelでシートに画像を挿入・追加する」のコードと「セルA2選択」まで同じ) // セルA2選択 Microsoft.Office.Interop.Excel.Range range = activeSheet.Range["A2"]; // セルのサイズ取得 --- 追加 double widthCell = range.Width; double heightCell = range.Height; // 画像貼付 float Left = (float)range.Left; float Top = (float)range.Top; float Width = 0.0F;//(float)widthCell; // 変更 float Height = 0.0F; //(float)heightCell; //変更 Microsoft.Office.Interop.Excel.Shape shape = activeSheet.Shapes.AddPicture(fileName, Microsoft.Office.Core.MsoTriState.msoCTrue, Microsoft.Office.Core.MsoTriState.msoCTrue, Left, Top, Width, Height); // 倍率を100%にする shape.ScaleHeight(1.0F, Microsoft.Office.Core.MsoTriState.msoCTrue); shape.ScaleWidth(1.0F, Microsoft.Office.Core.MsoTriState.msoCTrue); //きっちり挿入の部分 shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlMoveAndSize;
実際にやってみる – 結果編
画像のプロパティーと関係があるか確認
予想だけで進んでいましがたが、上記のコードで実際に”Shape.Placement”のプロパティーが[セルに合わせて移動やサイズ変更をする]と一致しているかを確認しました。ちゃんとなっているようです。
セルより大きい画像を貼り付けた場合
実際にはりつけます。
Aのセルの大きさを変えてみます。正しくなっているようです。(activeSheet.Range[“A2”]に張り付けています。)
2のセルの大きさを変えてみます。正しくなっているようです。(activeSheet.Range[“A2”]に張り付けています。)
ちなみに小さくしてから、セルの大きさを変更すると画像のサイズは変わりません。そのような仕様の様です。
セルと同じ大きさの画像を貼り付けた場合
貼り付け・大きさ変更の結果を書きます。先ほどと同じように縦横でセルの大きさを変えてみましたが、セルのサイズ変更に伴って画像の大きさが変わっています。セルより小さくした場合の動きは先ほどと同じです。
まとめ
ある程度意図する形にはなりましたが、セルより小さい場合に連動させたい場合はどうするんだろうか?ひとまず、こういう仕様なんだろうと思って忘れておきます。また進展があったら追加します。