2023/06/18

セル範囲と一緒にコピーされる図形




Excelワークシート上でセル範囲をコピーした際、その範囲に存在する図形等も一緒にコピーされます。範囲内に「完全に含まれている図形」であればコピーされるのは理解できます。しかし、範囲を少しはみ出ているだけであればコピーされたり、逆に範囲を跨いでいるのにコピーされない場合もあります。
今回は、その図形がコピーされる・されないという現象を整理します。

1.図形がコピーされる条件

1ー1.図形もコピーされる現象の整理

コピー範囲に跨る感じで適当に図形を配置し、コピペ(例:Ctrl+c → Ctrl+v など)したのが図01です。範囲に一部が掛かっている図形(①②)はコピペされる一方で、範囲に掛かっていてもコピーされない図形(④)もありますし、完全に跨っているのにコピーされない図形(③)もあります。
セル範囲をコピペすると図形もコピーされる
図01

もちろん、貼り付けた範囲の右下に「貼り付けのオプション」を選択できるマーク(図01のJ8セル辺り)が出ますので、それをクリックすることで様々な貼り付けオプション(図02)を選択することは可能です。
貼り付けオプションの内容
図02

オプションの中で「数値・数式・値」の系統(図02の赤字のマーク)を選択すると、コピーのセル範囲に掛かっていた図形は貼り付きません。面白い事に「罫線なし」を選択しても、図形はコピーされない結果になります。

1ー2.図形がコピーされる条件

標準の「貼り付け」でコピペ(Ctrl+c → Ctrl+v でも同じ)した時、図形がセル範囲と一緒にコピーされる条件は、以下の2つが両方とも成立する場合です。
 (1) コピーするセル範囲に、図形の一部が掛かっている
 (2) コピーするセル範囲の一つ外側のセル範囲の内側に、完全に収まっている図形 
図03

図01の場合だと以下の様に、一緒にコピーされない図形は「一つ外側のセル範囲」からはみ出しているのが分かります。
コピーされない図形は、1つ外側のセル範囲をオーバーしている
図04

図形がセル範囲に掛かる状態は様々ですので、色々確かめてみると図05のようになります。
上記条件の(1)が緑色の〇×で、(2)が赤色の〇×になります。緑色・赤色が両方とも〇の場合のみ一緒にコピーされます。
コピーされる図形、されない図形
図05

コピー範囲の「一つ外側のセル範囲」が無い状態、例えば図06のような上下左右の基準線を含んだセル範囲の場合は、図形は1つ外側のセル範囲に「収まっている」ことになります。考えてみれば当たり前で、図形は上下左右の基準線の内側にしか存在できないためです。
上下左右の基準線を含むセル範囲の場合
図06

なお境界線ですが、図07のように「1つ外側のセル範囲の境界線」にピッタリ接している図形は「1つ外側のセル範囲内」と判断されますが、「コピーするセル範囲の境界線」に外側から接している図形は「コピーするセル範囲内には無い」と判断されます。
境界線ぴったりの図形の場合
図07

図06では上下左右の基準線を跨ぐ(?)図形について説明しましたが、図形が存在する(≒幅や高さがある)のであれば、セル範囲内に図形は入っている事になるので、図07で言うところの「コピー範囲の境界線」の内側に図形が入っている事になります。

1ー3.セル範囲に完全に含まれている図形のみをコピーする方法

もし「セル範囲内に全体が収まっている図形」のみをコピーしたい場合は、図08のように「コピーしたいセル範囲の1つ外側の行・列」を「行高さ・列幅をゼロ または非表示」にすることで実現できます。ちょっとでもコピー範囲からはみ出ている図形は、1つ外側のセル範囲よりも確実に外に出ているためです。
内包している図形のみをコピーする方法
図08

2.一緒にコピーされる図形を選別するコード(例)

ユーザーにとって、図形はシート上に自由に配置できる便利なものなので、上記のような「コピーするセル範囲」と「その1つ外側のセル範囲」を意識して配置してくれるとは思えません。ですので、セル範囲をコピペするようなプログラムを実行する際には、一緒にコピペされる図形を選別し、処理をする必要が出てきます。
下記の図09は、コピーするセル範囲と一緒に「コピーされてしまう図形」を選別し、処理するものです。
  1. '========== ⇩(1) 一緒にコピーされる図形を選別 ============
  2. Sub selectCopyShape()
  3.  Dim S As Shape       '←対象となる1つの図形
  4.  Dim selectR As Range    '←コピーするセル範囲
  5.  Dim shapeR As Range    '←図形があるセル範囲
  6.  Dim outsideR As Range   '←1つ外側のセル範囲
  7.  Dim outsideTL As Range   '←コピー範囲の左上角セルの1つ外側のセル
  8.  With ActiveSheet
  9.   Set selectR = .Range("D3:H7")
  10.   Set outsideTL = selectR(1)
  11.   On Error Resume Next
  12.    Set outsideTL = outsideTL.Offset(-1, 0)
  13.    Set outsideTL = outsideTL.Offset(0, -1)
  14.   On Error GoTo 0
  15.   Set outsideR = Range(outsideTL, selectR(selectR.Count).Offset(1, 1))
  16.   For Each S In .Shapes
  17.    Set shapeR = Range(S.TopLeftCell, S.BottomRightCell)
  18.    If Not Intersect(selectR, shapeR) Is Nothing Then
  19.     If Intersect(outsideR, shapeR).Address = shapeR.Address Then
  20.      S.Visible = msoFalse
  21. '     S.Visible = msoTrue
  22.     End If
  23.    End If
  24.   Next S
  25.  End With
  26. End Sub
図09

08行目「With ActiveSheet」では、以下のコードをアクティブシートを基準にしていきます。
まず10行目「Set selectR = .Range("D3:H7")」で、コピーするセル範囲を変数selectRに設定しています。
12~17行目は、コピーするセル範囲の「1つ外側のセル範囲」を計算しています。手順は図10のようになります。
1つ外側のセル範囲の計算法
図10

コピーするセル範囲は10行目で代入したselectRです。その範囲の左上角セルは1番目のセルになりますので「selectR(1)」となります。これを「Offset(-1,0)」と「Offset(0,-1)」を使って、1つ外側のセル範囲の左上角セルに持っていきます。
一方、コピーするセル範囲の右下セルは、範囲内では最後のセル位置になりますので「selectR(selectR.Count)」となります。この右下セルは、ワークシートのセル範囲の限界一杯(Excel2007以降の場合、1048576行目×16384列目)で無い限り取得可能です。この左上セルと右下セルを含むセル範囲が「1つ外側のセル範囲」ということになります。
しかし、上下左右の4方向に「1つ外側のセル範囲」が取れるとは限りません。図11の状態の時です。
上端・左端が基準線いっぱいの時
図11

例えば図11の左図のように上端一杯の場合は「Offset(-1,0)」はエラーとなりますので、これは無視するようにします。また図11の右図は上端・左端とも一杯です。「Offset(-1,0)」と「Offset(0,-1)」の両方ともエラーが出ますので、両方とも無視することになります(コピーするセル範囲の左上セル=1つ外側のセル範囲の左上セル)。
つまり、エラーが出ないOffsetを実行することで「1つ外側のセル範囲の左上セル」が得られることになります。
12行目「Set outsideTL = selectR(1)」は、コピーするセル範囲(selectR)の1番目のセル(=左上角のセル)を変数outsideTL(outsideのTop & Left の略)に代入しています。
14行目「Set outsideTL = outsideTL.Offset(-1, 0)」では、左上角セルを「1つ上側」に移動させ、15行目「Set outsideTL = outsideTL.Offset(0, -1)」では左上角セルを「1つ左側」に移動させています。
ただし図11のようにワークシートの上端・左端にコピーするセル範囲がある場合には、Offsetで移動できませんのでエラーが出ます。この対応として13行目「On Error Resume Next」で、エラーをスルーさせています。エラーが出た場合には、その行は実行されませんので「その位置に立ち止まる」ことになります。
Offsetで移動させた左上のセル位置「outsideTL」を使用し、17行目「Set outsideR = Range(outsideTL, selectR(selectR.Count).Offset(1, 1))」で、一つ外側のセル範囲を変数outsideRに代入します。この時の右下セル位置は、コピー範囲の右下セルの1つ外側となる「selectR(selectR.Count).Offset(1, 1)」です。
19~29行目の間で、シート上の1つ1つの図形を調べて処理していきます。
19行目「For Each S In .Shapes」では、アクティブシート上の図形を1つ1つ取り出し、変数Sとしています。
20行目「Set shapeR = Range(S.TopLeftCell, S.BottomRightCell)」は、取り出した図形の左上角(TopLeftCell)と右下角(BottomRightCell)のセル位置を調べ「図形を含むセル範囲」をshapeRとします。
ここまでで、「コピーするセル範囲(selectR)」「一つ外側のセル範囲(outsideR)」「図形のセル範囲(shapeR)」の関係は、例えば図12のようになります。
3種類の各セル範囲
図12

22行目「If Not Intersect(selectR, shapeR) Is Nothing Then」では、「図形のセル範囲(shapeR)」と「コピーするセル範囲(selectR)」に重なりが有るか否かを調べています。図12で言えば②③④は重なりがありますので、次の23行目のコードに進みます。一方①や⑤は重なりが無いので処理は行われません。
23行目「If Intersect(outsideR, shapeR).Address = shapeR.Address Then」では、「図形のセル範囲(shapeR)」と「1つ外側のセル範囲(outsideR)」が重なっているセル範囲のアドレスと「図形のセル範囲(shapeR)」のアドレスを比較し、等しいか否かを調べています。アドレスが等しいと言うことは、1つ外側のセル範囲内に、図形のセル範囲が「完全に含まれている」ことを意味します。つまり図12では③が除外され、②④が対象(=セル範囲コピーと一緒にコピーされる図形)ということになります。
図形が絞り込めましたので、その図形に対する処理を行います。例えば24行目「S.Visible = msoFalse」のようにすれば「図形が見えなくなる(≒コピーされなくなる)」事になりますし、25行目「S.Visible = msoTrue」を使えば、一旦見えなくなった図形が再び見えるようになります。
なお、コピー範囲に完全に含まれる図形だけを取り出すには、23行目を「If Intersect(selectR, shapeR).Address = shapeR.Address Then」のようにし、「図形のセル範囲(shapeR)」のアドレスを、「図形のセル範囲(shapeR)」と「コピーするセル範囲(selectR)」が重なっているセル範囲のアドレスと比べれば良いことになります。
但しこの場合、22行目「If Not Intersect(selectR, shapeR) Is Nothing Then」とコード内容がほぼ重複するので、1行にまとめたくなります。しかし、図12での①⑤の図形のように「selectRとの重なりが全く無い」場合は「アドレスが取得できずにエラー」となるので、その前段階で「On Error Resume Next」等でのエラー回避は必要となります。

3.セル範囲をコピぺするコード

結論から言うと、CopyメソッドやPasteメソッドでは図形が一緒に貼り付くのに対し、PasteSpecialメソッドを使うと図形は無視されます。今回の「一緒にコピーされる図形」というテーマからはちょっと離れますが、無関係では無いので説明します。

3ー1.Copyメソッド

セル範囲のコピーには「Copyメソッド」を使用します。構文は以下のようになります。
 Rangeオブジェクト.Copy (Destination)
Rangeオブジェクトが「コピー元」となり、引数Destination(貼り付け先のRangeオブジェクト)は省略可能です。
引数を指定した時には、コピー元の範囲に図形があれば一緒にペーストされます。この場合、コピーした内容はクリップボードには入りません。
引数を省略すると、コピー内容がクリップボードに入りますので、以下の貼り付けメソッド(Paste 又は PasteSpecial)を使って貼り付けることになります。どちらのメソッドを使うかで、図形の貼り付け有無の他、様々な貼り付けが可能です。
なお引数Destinationには、複数セルを含むセル範囲(例:Range("A1:D10") )も指定可能ですが、有効なのは先頭セル(範囲の左上角のセル)のみです。コピーしたセル範囲の大きさが、その有効なセルを左上基準にして貼り付くことになります。
引数Destinationを指定し、コピーと同時に貼り付けする時のコード例は図13のようになります。
43行目「Range("B3:C5").Copy Range("F3:G5")」では、B3~C5セルの範囲をF3~G5にコピペしています。
  1. '========== ⇩(2) Copyメソッド ============
  2. Sub CopyPaste01()
  3. '(ここで図形の処理:例えば図09のような図形の非表示化)
  4.  Range("B3:C5").Copy Range("F3:G5")
  5. '(ここで図形の処理:例えば図09のような図形の再表示)
  6. End Sub
図13

図13のコードを標準モジュールに置けばアクティブなシート上のセル範囲に対してのコピペを行い、シートモジュールに置けばそのシート上のセル範囲に対してコピペが実行されます。
この「引数を付けたCopyメソッド」では、コピー元のセル範囲内に図形があった場合(1章:図形がコピーされる条件)には一緒に貼り付けてしまいますので、もし不要な場合にはその前後(42行目・44行目 辺り)で図09のような処理が必要となります。

3ー2.Pasteメソッド

貼り付けの内、まずPasteメソッドの構文は以下のようになります。
 Worksheetオブジェクト.Paste (Destination, Link)
パラメータは2つありますが、同時設定は不可です。「パラメータ無し」または「どちらか一方のパラメータ」のみ設定可です。
Destinationパラメータは「貼り付けセル範囲」でRangeオブジェクトを指定します。省略した場合は、アクティブなセル範囲となります。
Linkパラメータは「貼り付けるデータをリンクにするか否か」の設定で、リンク貼り付けの場合はTrueを指定します。既定はFalse(直接、数値や文字列を貼り付ける)です。
Copyをした後、Pasteメソッドで貼り付ける時のコード例は図14のようになります。
53行目「Range("B3:C5").Copy」でB3~C5セルの範囲をコピーし、54行目「ActiveSheet.Paste Range("F3:G5")」でクリップボードの内容をF3~G5セルに貼り付けています。
  1. '========== ⇩(3) Pasteメソッド ============
  2. Sub CopyPaste02()
  3. '(ここで図形の処理:例えば図09のような図形の非表示化)
  4.  Range("B3:C5").Copy
  5.  ActiveSheet.Paste Range("F3:G5")
  6. '(ここで図形の処理:例えば図09のような図形の再表示)
  7. End Sub
図14

この「Pasteメソッド」も、コピー元のセル範囲内に図形があった場合には一緒に貼り付けてしまいますので、もし不要な場合にはその前後で図09のような処理が必要となります。

3ー3.PasteSpecialメソッド

貼り付けの内、PasteSpecialメソッドの構文は以下のようになっています。
 Rangeオブジェクト.PasteSpecial (Paste, Operation, SkipBlanks, Transpose)
PasteSpecialの場合は、貼り付ける範囲はPasteSpecialの前にRangeオブジェクトとして指定します。
指定できるパラメータは図15の4つです。4つとも省略可能です。
パラメータ内容
Paste何を貼り付けるか(図16
Operation貼り付けの際の演算方法(図20
SkipBlanks空白セルを無視
Transpose行列の入れ替え
図15

パラメータを全て省略すると、Rangeオブジェクトで指定したセル範囲にクリップボードのデータがそのまま貼り付きます。
但し「コピー範囲にあった図形は除外」され、セルのデータのみが貼り付きます。ここがPasteメソッドとの違いです。
なおPasteSpecialには、Worksheetオブジェクトのメソッドも存在します。但しこちらは、クリップボードのデータを「画像として」貼り付けるもので、他のアプリのデータを貼り付ける等の時に使用します。今回は説明を割愛します。

3ー3ー1.Pasteパラメータ

Pasteパラメータには「何を貼り付けるか」を指定します(図16)。
定数内容
xlPasteAll-4104すべて(既定)
xlPasteFormulas-4123数式
xlPasteValues-4163
xlPasteFormats-4122書式
xlPasteComments-4144コメント
xlPasteValidation6入力規則
xlPasteAllExceptBorders7罫線を除く全て
xlPasteColumnWidths8列幅
xlPasteFormulasAndNumberFormats11数式と数値の書式
xlPasteValuesAndNumberFormats12値と数値の書式
xlPasteAllUsingSourceTheme13コピー元のテーマを使用してすべて貼り付け
xlPasteAllMergingConditionalFormats14すべての結合されている条件付き書式
図16

なお、PasteSpecialメソッドのPasteパラメータの内、例えばxlPasteAllは「すべてを貼り付ける」等とMicrosoftのサイトでも説明されていますが、列幅は例外です。そこで、Pasteパラメータに何を設定すると何が貼り付くのかを整理したのが図17です。
〇印が元データのものが貼り付く、×印が貼り付かないことを意味しています。
Paste:=数式値 セル書式数値書式コメント入力規制罫線列幅条件付書式
Paste
Special
-4104(すべて)×
-4123(数式)×××××××
-4163(値)××××××××
-4122(書式)×××××
-4144(コメント)××××××××
 6(入力規則)××××××××
 7(罫線を除く全て)××
 8(列幅)××××××××
11(数式と数値の書式)××××××
12(値と数値の書式)×××××××
13(Copy元テーマで全て貼付)×
14(全ての条件付き書式)× ※1
Copyメソッドのみ(貼付先指定)×
Copy + Pasteメソッド×
※1:貼り付け先の条件付き書式に、コピー元の条件付き書式が加えられる
図17

図17の一番下側には、Copyメソッドのみ、及びCopy+Pasteメソッドでのコピペについても併せて載せました。〇×状態を見る限りでは「xlPasteAll(すべて)」と同じですが、PasteSpecialメソッドでは「図形はコピーされない」ところが異なっています。
また注釈(※1)にも書きましたが、「xlPasteAllMergingConditionalFormats(値=14:全ての条件付き書式)」を指定した時には「コピー元のセル範囲に設定されていた条件付き書式が、貼り付け先の条件付き書式に追加」される形になります。それ以外では「条件付き書式は上書き」です。
図02で「『罫線なし』を選択しても図形は貼り付かない」と説明しましたが、この「罫線なし」のボタンは図23でも分かるように「「PasteSpecialメソッド」で動いているために「図形は対象外」となります。
またコピー元のセル範囲と貼り付け先のセル範囲は、通常は同じサイズ(=同じ行数×同じ列数)にすると思いますが、もし異なる場合は図18のように、Pasteパラメータの値によって動作が分かれます。
例えば、Pasteパラメータが「xlPasteAll(すべて)」の場合は、コピー元と貼り付け先の大きさが何であっても「コピー元の大きさ」が貼り付く事を意味します。またコピー元 ≦ 貼り付け先の場合に、貼り付け先の範囲にデータが存在する時には「既にデータがありますが、置き換えますか?」のメッセージが出ることを表します。
Paste:=指定セル範囲の大きさ
Copy元 > 貼付先Copy元 ≦ 貼付先
貼り付く
大きさ
貼付OK?
のメッセージ
貼り付く
大きさ
貼付OK?
のメッセージ
Paste
Special
-4104(すべて)出る出ない
-4123(数式)出る出ない
-4163(値)出る出ない
-4122(書式)出ない出ない
-4144(コメント)出る出ない
 6(入力規則)出る出ない
 7(罫線を除く全て)出る出ない
 8(列幅)出る出ない
11(数式と数値の書式)出る出ない
12(値と数値の書式)出る出ない
13(Copy元テーマで全て貼付)出る出ない
14(全ての条件付き書式)出る出ない
Copyメソッドのみ(貼付先指定)出る出ない
Copy + Pasteメソッド出る出ない
図18

前述のCopyメソッドやPasteメソッドでは、貼り付け先のセル範囲(Destinationパラメータ)の先頭セルのみが有効で、そのセルを左上基準として「コピー元のセル範囲データが貼り付く」と説明しました。しかし図18のように、Pasteパラメータに「xlPasteFormats(書式:値= -4122)」を指定した場合は「貼り付け先として指定したセル範囲」に対して、書式が貼り付けられます。
また、セル範囲のサイズが異なるのですから、貼り付け先セル範囲では「貼り付けデータの過不足」が発生します。貼り付け先のサイズが大きい場合は、図19の左側のように「不足する部分には、コピー元の書式を繰り返して貼り付け」を行い、貼り付け先のサイズが小さい場合には、図19の右側のように「必要なサイズに書式をトリミング」するようです。
Copy元と貼り付け先でサイズが異なる時
図19

また、貼り付け先のセルにデータが存在する場合は「データを上書き」してしまうため、「既にデータがありますが、置き換えますか?」というメッセージが出ますが、メッセージが出るのは「コピー元のサイズ > 貼り付け先のサイズ」の場合のみというのが少し不思議に思います。なおサイズの大小は「行数または列数のどちらか一方でも大きい」時が「大」となっているようです。
なお書式貼り付け(Paste:= xlPasteFormats(値= -4122))の場合にはメッセージは出ません。これは空白セルであってもセル書式は存在するため「貼り付け先は、必ず上書き」せざるを得ないという特性を考慮してのものと思われます。

3ー3ー2.Operationパラメータ

Operationパラメータには、図20の「貼り付けの際の演算方法」を指定します。
定数内容
xlPasteSpecialOperationNone 又は xlNone-4142しない(既定)
xlPasteSpecialOperationAdd 又は xlAdd2加算
xlPasteSpecialOperationSubtract 又は xlSubtract3減算
xlPasteSpecialOperationMultiply 又は xlMultiply4乗算
xlPasteSpecialOperationDivide 又は xlDivide5除算
図20

なおセル値が「数値と見なせる文字列」の場合は正しく演算をするようですが、数値とは見なせない文字列の場合には、それがコピー元か貼り付け先かで結果が違います。
コピー元が文字列の場合は、それは「数値ゼロ」と見なしての演算となるようです。また貼り付け先が文字列の場合は、コピー元の値は無視して「貼り付け先の文字列が残る」結果となります。
もしOperationパラメータを使って演算をする場合は、コピー元・貼り付け先のセル値のチェック・処理を事前に行うことが必要そうです。

3ー3ー3.SkipBlanks、Transposeパラメータ

SkipBlanksパラメータは「空白セルを無視」するか否かを指定します。空白セルを無視する場合はTrue、無視しない場合はFalse(既定値)です。「空白セルを無視」とは、図21のようにコピー元のセル範囲に空白セルがあった場合、貼り付け先では元の値が残ることを意味します。
SkipBlanksパラメータをTrueにした時の挙動
図21

また、Transposeパラメータは「行列の入れ替え」をするか否かを指定します。入れ替える場合はTrue(既定値=False)を指定します。
Copy後にPasteSpecialメソッドで貼り付ける時のコード例は図22のようになります。
  1. '========== ⇩(4) PasteSpecialメソッド ============
  2. Sub CopyPaste03()
  3.  Range("B3:C5").Copy
  4.  Range("F3:G5").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  5. End Sub
図22

62行目「Range("B3:C5").Copy」でコピーをして、クリップボードに保管します。
次に63行目「Range("F3:G5").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False」で、貼り付けをしています。貼り付けの条件は「列幅を除く全て」+「演算は無し」+「空白セルは無視せず」+「行列の入れ替え無し」となります。
どのパラメータ値も規定値なので、63行目は「Range("F3:G5").PasteSpecial」でも同じことになります。

3ー4.メニューから見たコピペのメソッド

セル範囲をコピーした後、Excel上部のリボンの「ホーム」タブ→「クリップボード」グループ→「貼り付け」ボタンを選択すると、図23の左側のようなメニューが表示され、ボタンで貼り付けオプションを選択することが可能です。なお、貼り付け後の右下に出る「貼り付けのオプション」ボタンをクリックしても、ほぼ同様のメニューが現れます。
貼り付けオプションのアイコンとVBAメソッドの対照表
図23

図23は、各ボタンがPasteメソッド及びPasteSpecialメソッドのどのパラメータを使っているかを示したものですが、メソッドとしてはPasteとPasteSpecialが混在している事がわかります。
またメニュー中段の右端の「値と元の書式」ボタンは、Pasteパラメータを変えながら重ね書きをしている事もわかります。
またメニューの一番下の「形式を選択して貼り付け」をクリックすると、図24のようなダイアログが現れ、更に細かい貼り付けが可能です。
形式を選択して貼り付けの項目とVBAメソッドの対照表
図24

ダイアログの上段はPasteパラメータ、中段はOperationパラメータ、下段はSkipBlanksパラメータとTransposeパラメータを切り替える内容になっています。このダイアログで貼り付けオプションを選んだ際には、図形は除外される事となります。

4.まとめ

今回は主に、セル範囲のコピペ時に「図形が一緒に貼り付けられる条件」について紹介をしましたが、PasteメソッドとPasteSpecialメソッドでは図形の処理が異なる所まで踏み込んでしまいました。一見単純そうなコピペではありますが、注意しなければいけない箇所が多くあることを再認識しました。
なお、今回はサンプルファイルを添付しませんでした。実行状態を試される方は適当なデータを作り、サンプルコードのコピペでお願いします。

アプリ実例・関連する項目

1行1データの表を複数行1データとして印刷する
図形も貼り付けられるスケジュール帳
ListObjectの絞り込みデータの配列化