TOP > blog > Adobe InDesign vbs スクリプトによる表組操作 no1
インデザイン
2020/06/24

Adobe InDesign vbs スクリプトによる表組操作 no1

管理者用
blog

先日、InDesignの自動化の表組において、画像をレイアウトする方法を紹介しました。
単純に、出来ると思っていた画像のレイアウトでしたが、苦戦した事をお話しました。
このNAVIの中でも、表組のスクリプトの紹介記事はあるのですが、まとめ直すこととしました。
記事が、長くなりそうでしたので、何回かに分けて紹介します。

Adobe InDesigh表組編

インデザインレイアウトを自動化をVBAスクリプトで紹介いたします。
vbsスクリプトで行うつもりでしたが、開発環境が整っているExcel VBAを使用する事としました。
今回は、インデザインの表組に絞っております。
説明に出てくるスクリプトは、マクロにサンプルスクリプトとして登録してます。
スクリプトには、MsgBox の記述をステップ毎に入れており、メッセージボックスを表示して止まるようにしてます。
スクリプトの記述とインデザインの動きを見てください。

スクリプトは、サンプルスクリプトとして、ダウンロード 出来るようにしてます。
ダウンロードするファイルは、エクセルファイルです。

  サンプルExcelファイル

    ダウンロードは、⇒ こちらから

  インデザインのバージョンによて、マクロの1部を書き換える必要があります。
  赤で示す、オブジェクト名を書き換えてください。

MsgBox "インデザインを起動します。"
Set myInDesign = CreateObject("InDesign.Application") '起動する・・・・ *(注1)

2020   "InDesign.Application"
2019   "InDesign.Application.cc.2019"
2018   "InDesign.Application.cc.2018"
cc   "InDesign.Application.CC.J"

サンプルスクリプト実行事例

 

1.表のレイアウト

 スクリプトで行う場合も、同じ手順を記述します。
マクロ tableSampleScript を実行してください。
まずは、インデザインの立ち上げからのスクリプトから、開始します。

 

1-1.インデザインの立ち上げとドキュメントの作成


Rem Ind表操作.vbs  InDesignの表操作のスクリプト
MsgBox "インデザインを起動します。"
Set myInDesign = CreateObject("InDesign.Application") 'インデザインを起動する・・・・ *(注1)
Rem "A4サイズ新規ドキュメントを作成します!"
Set myDocument = myInDesign.Documents.Add '新規ドキュメント作成
Rem ===既存のインデザインファイルを使用する場合は===
'dir_mei = "M:\NAVI_VBA"
'INDD_name = dir_mei & "\テストサンプル.indd"
'Set myDocument = myInDesign.Open(INDD_name)
'=============================
Me_size_GH = 297
Me_size_GY = 210
With myDocument.DocumentPreferences
.PageHeight = CStr(Me_size_GH) & "mm"
.PageWidth = CStr(Me_size_GY) & "mm"
.FacingPages = False
End With

1-2.テキストフレーム作成

インデザインが立ち上がり、ドキュメントを作成されてます。
そのドキュメントに、表をレイアウトするテキストフレームを作成します。


MsgBox "表を入れるテキストフレームを作成します。"
Rem テキストフレームサイズを設定
Set myTextFrame = myDocument.TextFrames.Add

Rem テキストフレームサイズを変更
YS = 25
XS = 25
YE = 200
XE = 185
myTextFrame.GeometricBounds = Array(CStr(YS) + "mm", CStr(XS) + "mm", CStr(YE) + "mm", CStr(XE) + "mm")

1-3.テキストフレームに表を作成

サンプルスクリプトでは、2列×3行の表に設定してます。
さらに、作成した表の全てのセルに、文字”A” を書き込んでます。


Rem テキストフレームに、テーブルを作成
MsgBox "2." & vbCr & vbCr & "テキストフレームに表作成します。"
Set myTable = myTextFrame.InsertionPoints.Item(-1).Tables.Add

MsgBox "3." & vbCr & vbCr & "  2列、3行の表にします"
'2列、3行の表にします
myTable.ColumnCount = 2
myTable.BodyRowCount = 3

MsgBox "3.1" & vbCr & vbCr & "  各セルに A を書き込みます"
'各セルに A を書き込みます
myTable.Columns.Item(1).Contents = "A"
myTable.Columns.Item(2).Contents = "A"

2.列/行の追加

行や列の追加方法を見ていきます。

 

2-1.行を追加

表の下に1行追加されます。


MsgBox "4." & vbCr & vbCr & "  行を追加 1"
'列と行を1列ずつ追加します。
myTable.Rows.Add

行を指定して追加


MsgBox "5." & vbCr & vbCr & "  行を追加 2"
'列と行を1列ずつ追加します。
myTable.Rows.Item(2).Rows.Add

 

2-2.列を追加

全てのセルに、文字”B”を書き込んでから 1行追加 


MsgBox "6." & vbCr & vbCr & "  列を追加1"
myTable.Rows.Item(1).Contents = "B"
myTable.Rows.Item(2).Contents = "B"
myTable.Rows.Item(3).Contents = "B"
myTable.Rows.Item(-2).Contents = "B"
myTable.Rows.Item(-1).Contents = "B"
myTable.Columns.Add

表の列を指定して追加


MsgBox "7." & vbCr & vbCr & "  列を追加 2"
'表の途中に 行、列を追加します。
myTable.Columns.Item(1).Columns.Add

3.表のサイズを設定

作成した表のサイズを設定します。 

3.1表全体のサイズ

表全体の幅、高さを設定します。
各セルのサイズは、列や行の数で当分されたサイズになります。
10行の表に対し、高さを50mmに設定した場合、各行の高さは5mmになります。
ここでは、4列×5行の表に対し設定してます。


MsgBox "8." & vbCr & vbCr & "  表のサイズを変更します。" & vbCr & vbCr & "全て列の幅を80mm、 行を30mmに設定します。"

myWidth = "160mm"
myHeight = "100mm"
myTable.Width = myWidth
myTable.Height = myHeight

3.2 特定の列、行の列幅行幅の設定

1行目、1列目、高さ、幅をを10mmに設定


MsgBox "9." & vbCr & vbCr & "  1列、1行目の幅、高さを10mmに設定します。"
myTable.Columns.Item(1).Width = "10mm"

MsgBox "9.1" & vbCr & vbCr & "  1行、1行目の幅、高さを10mmに設定します。"
myTable.Rows.Item(1).Height = "10mm"

4.セルの数をカウント

セル数は、Countプロパティから求める事が出来ます。

 


MsgBox "9.2 " & vbCr & vbCr & "  表の行数 " & vbCr & "列数 " & vbCr & "セル数 を数えます"
Table_RowCount = myTable.Rows.Count
Table_ColumnCount = myTable.Columns.Count
Table_CellsCount = myTable.Cells.Count

MsgBox "10 " & vbCr & vbCr & "  エクセルの表をインデザインの表に " & vbCr & "していきます " & vbCr & "まずは1行の表を用意します"

 

5.エクセルの表をインデザインにレイアウト

エクセルの表をインデザインにレイアウトします。
ここでは、番号・会社名・肩書き・名前 の4項目を対象に行ってます。

エクセルの内容により、書き込むデータへの変換関数を使用してます。

5.1 エクセルデータの取り込み

1行の表を作成し、エクセルから1行ずつ読み込み相対するセルに書き込んでいく。
そして、1行を追加し繰り返す。


MsgBox "10 " & vbCr & vbCr & "  エクセルの表をインデザインの表に " & vbCr & "していきます " & vbCr & "まずは1行の表を用意しますい。"

Rem Excelのデータを入力していきます
'4列、1行の表にします
myTable.ColumnCount = 4
myTable.BodyRowCount = 1

MsgBox "10.2" & vbCr & vbCr & "  Sheet1の番号、会社名、名前を使って表にします。"
EndRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row

For cuntC = 1 To EndRow Step 1
        clum1 = Sheet1.Cells(cuntC, 1)
        myTable.Rows.Item(cuntC).Cells.Item(1).Contents = mojiHanbetsu(clum1)
        clum2 = Sheet1.Cells(cuntC, 2)
        myTable.Rows.Item(cuntC).Cells.Item(2).Contents = mojiHanbetsu(clum2)
        clum3 = Sheet1.Cells(cuntC, 5)
        myTable.Rows.Item(cuntC).Cells.Item(3).Contents = mojiHanbetsu(clum3)
        clum4 = Sheet1.Cells(cuntC, 6)
        myTable.Rows.Item(cuntC).Cells.Item(4).Contents = mojiHanbetsu(clum4)
        myTable.Rows.Item(-1).Rows.Add
Next cuntC

MsgBox "10.3" & vbCr & vbCr & "  列を調整します。"
myTable.Columns.Item(2).Width = "65mm"
myTable.Columns.Item(3).Width = "30mm"
myTable.Columns.Item(4).Width = "25mm"

 

5.2 エクセル文字変換関数

テーブルに書き込むデータは、全て文字列となっている必要がある。
従って、エクセルデータが数値の場合、何も無い 
Null データの場合などの場合の変換関数を用意した。

 


Function mojiHanbetsu(moji)
    mojiA = moji
    If moji = "" Then
        mojiA = ""
    Else
        If IsNumeric(moji) Then
            mojiA = Str(moji)
        Else
            mojiA = moji
        End If
    End If
    mojiHanbetsu = mojiA
End Function

 

6.表の結合と分割


表の結合と分割によって、複雑な表を作成できます。
しかし、複雑になればなるほど、コントロールしたいセルの特定が難しくなる。
複雑化した表の場合、何番目の列と指定しても、行によっては、分割/結合により何番目が異なってくる。
自動化で表を操作する場合、その点を十分理解しておく必要があります。

分割の場合、分割方向、縦方向/横方向 かの指定を行って実行します。
縦・横の定数は以下の通りです。

縦に分割の場合 1986359924 ' (&H76657274)
横に分割の場合 1752134266 ' (&H686F727A)
また、エクセルVBAの場合、変数名で指定できます。
縦に分割の場合 idHorizontalOrVertical.idVertical
横に分割の場合 idHorizontalOrVertical.idHorizontal

ここからのサンプルスクリプトで、結合と分割を使って帳票らしき形のものを作ってみました。
実際の帳票を枠だけ作ってます。文字を入れるとリアルになるのですが、ここではスキップします。
また、罫線の線種の設定も行う必要がありますが、これも割愛しました。

6.1 列、行の結合

まずは、結合の事例から見ていきます。
18行、6列の表を作り、列の幅を整えます。
そして、いくつかの結合を行い、署名・印 などのスペースを作ります。



MsgBox "11." & vbCr & vbCr & "  次から表の分割や結合を行います" & _
vbCr & "6x18の表で見ていきます"

myTable.Delete

Set myTable = myTextFrame.InsertionPoints.Item(-1).Tables.Add
myTable.ColumnCount = 6
myTable.BodyRowCount = 18
myWidth = "180mm"
myHeight = "110mm"
myTable.Width = myWidth
myTable.Height = myHeight

Table_RowCount = myTable.Rows.Count
Table_ColumnCount = myTable.Columns.Count
Table_CellsCount = myTable.Cells.Count

MsgBox "11.1 " & vbCr & vbCr & "  各列の幅を設定します。"
myTable.Columns.Item(1).Width = "55mm"
myTable.Columns.Item(2).Width = "15mm"
myTable.Columns.Item(3).Width = "15mm"
myTable.Columns.Item(4).Width = "5mm"
myTable.Columns.Item(5).Width = "30mm"
myTable.Columns.Item(6).Width = "35mm"

MsgBox "11.2 " & vbCr & vbCr & "  次から表の分割や結合を行います" & _
vbCr & "  1列目の14行~17行を結合"
myTable.Rows.Item(14).Cells.Item(1).Merge myTable.Rows.Item(17).Cells.Item(1)

MsgBox "11.3 " & vbCr & vbCr & "  2列目の15行~18行を結合"
myTable.Columns.Item(2).Cells.Item(15).Merge myTable.Columns.Item(2).Cells.Item(18)

MsgBox "11.4 " & vbCr & vbCr & "  2行目~13行目の1-2列を横に結合"

For gyoSt = 2 To 13 Step 1
    myTable.Rows.Item(gyoSt).Cells.Item(1).Merge myTable.Rows.Item(gyoSt).Cells.Item(2)
Next

MsgBox "11.5 " & vbCr & vbCr & "  2行目から下に右2列で結合"
For gyoSt = 2 To 18 Step 1
    myTable.Rows.Item(gyoSt).Cells.Item(-4).Merge myTable.Rows.Item(gyoSt).Cells.Item(-1)
Next

MsgBox "11.6 " & vbCr & vbCr & "  1行目の左3セル結合"
myTable.Rows.Item(1).Cells.Item(1).Merge myTable.Rows.Item(1).Cells.Item(3)

6.2 横の分割

ここまでは、結合を使って、表を整えて来ましたが、最上部の体裁を整えるために、横への分割を行いました。
さらに、一部結合を行った上で高さを調整しました。

 



MsgBox "11.7 " & vbCr & vbCr & "  1行目を横に分割"
myTable.Rows.Item(1).Split 1752134266 ' (&H686F727A)   idHorizontalOrVertical.idHorizontal

MsgBox "11.8 " & vbCr & vbCr & "  左上分割した2行を結合"

myTable.Rows.Item(1).Cells.Item(1).Merge myTable.Rows.Item(2).Cells.Item(1)
    
MsgBox "11.9 " & vbCr & vbCr & "  1行目の高さを10mmに設定します。"
myTable.Rows.Item(1).Height = "10mm"
myTable.Rows.Item(2).Height = "10mm"

6. 縦の分割

MsgBox "11.10 " & vbCr & vbCr & "  右下3行を縦に分割"
myTable.Rows.Item(16).Cells.Item(-1).Split 1986359924  'idHorizontalOrVertical.idVertical
myTable.Rows.Item(17).Cells.Item(-1).Split 1986359924  'idHorizontalOrVertical.idVertical
myTable.Rows.Item(18).Cells.Item(-1).Split 1986359924  'idHorizontalOrVertical.idVertical

6.4 セルを数える

セルの、結合と分割を行いましたが、セル数を数えてみます。
当初 18行、6列、108セル でしたが、 19行、7列、43セルに変化しました。

MsgBox "12. " & vbCr & vbCr & " 表の行数 " & vbCr & "列数 " & vbCr & "セル数 を数えます"

Table_RowCount = myTable.Rows.Count
Table_ColumnCount = myTable.Columns.Count
Table_CellsCount = myTable.Cells.Count

MsgBox "行 = " & Table_RowCount & vbCr & "列 = " & Table_ColumnCount & vbCr & "セル= " & Table_CellsCount

 

セルに番号を附って見ました。
上から右に番号がふられている事を確認してください。


MsgBox "13." & vbCr & vbCr & "  複雑な表にセルの順番に数字を入れていきます"

For c = 1 To Table_CellsCount Step 1
    myTable.Cells.Item(c).Contents = Str(c)
Next

MsgBox "14." & vbCr & vbCr & "  数字の順番を確認してください。"

関連記事