「イラストレーターを開く」の GetAiDoc() で、指定されたイラストレーターのファイルを開いて、アプリケーション・オブジェクト AiDoc を取得することができました。このオブジェクトを利用すると、VBA からイラストレーターを操作したり、その状態を取得したりすることができます。
とりあえず、レイヤーをいじってみました。
その前提として、パブリックなオブジェクト AiDoc を取得しておく必要があります。これは、GetAiDoc(aiFilePath) でよいのですが、ファイル・パスを手入力するのもなんですので、ファイル選択ダイアログを使った SelectAiFile() を用意しました(エラー処理などははしょっていますので、実装する際には気を付けてください)。
標準モジュール SelectAiFile()
'----- AiDoc の取得
Public AiDoc As Object
Public Function SelectAiFile()
Dim filePath
filePath = fileSelect("Illustratorファイル", "*.ai")
SelectAiFile = GetAiDoc(filePath)
End Function
'----- ファイル選択ダイアログ
Private Function fileSelect(fileType, filterStr)
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.clear
.Filters.Add fileType, filterStr, 1
.Title = "[" & fileType & "] を選択してください"
.AllowMultiSelect = False
.InitialFileName = ThisWorkbook.Path
If Not .Show Then Exit Function
fileSelect = .SelectedItems(1)
End With
End Function
さて、これで AiDoc を読み込むことができました。AiDoc のプロパティはわんさかありますが、その中に Layers というのがあって、これがレイヤーのコレクションになっています。オブジェクト・ブラウザーで覗いてみると、そのメンバーの layer には、さらに Layers や PathItems や TextFrames、GroupItems など、これもわんさかあって、それぞれにいくつものメソッドが用意されています。これらを駆使できれば、さぞかし面白いことができると思われますが、それは必要に駆られたときに挑戦するとして、ここではレイヤーをちょっといじってみました。
次の LayerVisibility() は、個々のレイヤーを表示したり隠したりするプロパティです。
LayerVisibility(レイヤー名または番号) = True で表示、= False で隠します(ここで対象となるレイヤーは、AiDoc 直下のレイヤーだけで、その下の子孫レイヤーは無視されるかエラーとなります)。
操作した結果は、イラストレーター画面がアクティブにならないと視覚的には反映されませんのでご注意。
標準モジュール LayerVisibility()
Public Property Let LayerVisibility(layerName, sw)
AiDoc.Layers(layerName).Visible = sw
End Property
次に、入れ子状態になったレイヤーの一覧表をつくってみました。
たとえば、左図のようなレイヤー構成の場合、ワークシートに右図のような表を作ってくれます。
layerList という名前のワークシートを用意しておくと、その B2 セルから始まって右に子ども、下に兄弟のツリー型のリストを作成します。
標準モジュール MakeLayerList()
Public Sub MakeLayerList()
ThisWorkbook.Worksheets("layerList").Activate
ActiveSheet.Cells.ClearContents
displayLayerList AiDoc, 2, 2
End Sub
Private Sub displayLayerList(layer, row, column)
Dim visibleChar, n
With layer
If .Layers.count = 0 Then Exit Sub
For n = 1 To .Layers.count
visibleChar = "・"
If .Layers(n).Visible Then visibleChar = "〇"
ActiveSheet.Cells(row, column).value = _
visibleChar & .Layers(n).Name
displayLayerList .Layers(n), row, column + 1
row = row + 1
Next
row = row - 1
End With
End Sub
これが、何の役に立つかと言われれば、ほとんど何の役にも立ちません。しかし、何となくアプリケーション・オブジェクトのメンバーのいじり方のイメージがわかって、次は TextFrame の文字を入れ替えてみようとか、新しく Layer にパスを追加してみようとか、展開していくための入口にはなります。