人に聞けない痔の悩み、これでスッキリ >>

はじめまして。
定期的に数十のインデザインファイルを開き、各ファイルで使った画像を片っ端から手作業で削除する作業を行う係りが自分に回ってきてしまいました。

日頃IllustratorとPhotoshopを多用しているので、「こんなのマクロでしょ」と思いきや、インデには何故かマクロ機能がなく、代わりにスクリプトで何とかできる「かも」ということが分かりました。

やりたいことは以下の通りなのですが、簡単にできるものでしょうか?
1.特定のフォルダ内にある全インデファイルを開く
2.全てのファイルで使われている画像データを削除
3.全ファイルを上書き保存
osはwindowsなのでVBで対応すべく書籍を買い込み学習を開始しました。
どなたかヒントをいただければ幸いです。
それにしてもアドビさん、なぜインデにはマクロ機能つけてくれなかったの(T . T)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

マクロというかスクリプトというか、


結局の所、自動処理ですから、
呼び方が違うだけだと思うです。


>やりたいことは以下の通りなのですが、簡単にできるものでしょうか?
簡単です。

>1.特定のフォルダ内にある全インデファイルを開く

Set MyInDesign = CreateObject("InDesign.Application.CS4_J")
Set MyDoc = MyInDesign.open("C:\test.indd")

これでCドライブのtest.inddファイルが開きます。
フォルダ内のinddファイルをDIR文などで取得して、
インデザインにopenさせればOKでしょう。

>2.全てのファイルで使われている画像データを削除

先程のMyDocに画像が配置されていれば、
msgbox MyDoc.Links.count
と書けば、配置されている画像の個数が取得できます。

for N = MyDoc.Links.count to 1 step -1
MyDoc.Links(N).parent.delete
next N

と、逆順にループさせて、削除させれば良いでしょう。
parent=親という意味なので、画像の入っている枠ごと
削除することになります。

>3.全ファイルを上書き保存

SVPT = "C:\testtest.indd"
MyDoc.Save SVPT

これでファイル名を指定して保存できます。
    • good
    • 0
この回答へのお礼

素晴らしい回答をありがとうございます。さっそく試させていただきます。お答えのようなスクリプトが書けるようになると理想的ですが、生粋のDTPオペレーターに言語まで要求するのかと思うと、インデザインの要求水準って高いですね。頑張らないと!
ありがとうございましたm(_ _)m

お礼日時:2013/08/10 01:42

Adobeのアプリは『JavaScript』を使用し自動化する事が出来ます。


但し『マクロ』として存在している訳で無く『一から』作成する必要が
有ります。

http://www.openspc2.org/book/InDesignCS6/

ここではライブラリを提供してます。

Macでは『AppleScript』で簡単に動作を記録して作業出来るアプリが有ります
    • good
    • 0
この回答へのお礼

ありがとうございました。
IllustratorやPhotoshopにはアクション機能がついていて、質問ではそれをマクロと書いてしまいました。調べたところ、どうやらこれらのアクション機能はバッチ処理の類に入るそうです。私がしたいことはこの機能で十分な気がしたのでボヤいてしまいました。ご回答、参考にさせていただきます。

お礼日時:2013/08/10 01:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q本当にPublicな変数(配列で)

複数のフォームがあるVisualBasicのプログラムを作っているのですが、そのすべてのフォームからアクセス(値の変更も含める)できる配列の変数というのはないのでしょうか?
 Public 文を使ってみると、「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」
というエラーメッセージがでます。
解決法を教えてください。

Aベストアンサー

「オブジェクトモジュールのパブリックメンバとしては」はダメなので、
メニューの プロジェクト(P) → 標準モジュールの追加(M)
で標準モジュールを追加しては、どうですか。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QWordマクロを使った保存方法

一太郎で作成したファイルをWindowsでWordで開くように設定しあります。Wordで開いた後に【名前をつけて保存】ファイル名はそのまま使用したいので【保存】【ファイルを閉じる】と言う操作をマクロを使ってやろうとしてるのですが、マクロを実行しようとするとファイルが閉じるだけで、保存されていません。
マクロの記録で上記の操作を一通り実行し記録の終了だけではダメでしょうか?

Aベストアンサー

こんにちは。Wendy02です。

>Application.Quit
>'Application.Quit
>は何が違うんでしょうか?

いえ、私の個人的な経験からです。どうも、アプリケーション(Word)をいきなり閉じてしまうということに抵抗があったから、コメントアウト(「'」を先頭につけること)していたのです。

すんなり終わってくれればよいのですが、何かが、プロセス上で残る可能性を心配して、問題なければ、そのコメントアウトを外してくれればよい、ということで書きました。

なお、テキストファイル全部をWord ドキュメントに変換して、閉じるのなら、以下のようにすればよいと思います。(Word .Doc は、そのままになります) 同じファイル名の場合は、枝番が付きます。

8114301a.txt
  ↓
8114301a.doc
  ↓
8114301a_1.doc '間違って同じテキストファイルを開けて行った場合

試してみてください。

'------------------------------------------------

Sub DocsSaves()
Dim wd As Variant
Dim FileName As String
Dim SaveName As String
Dim i As String
Const Ext As String = ".doc" '拡張子
Const MYPATH As String = "C:\Documents and Settings\[ユーザー名]\デスクトップ\Word\"

For Each wd In Application.Documents
 If InStr(wd.Name, ".txt") > 0 Then
 SaveName = Mid(wd.Name, 1, InStrRev(wd.Name, ".") - 1)
 
 '同名がある時は枝番をつける
 Do While Dir(MYPATH & SaveName & Ext) <> ""
   i = "_" & CStr(Val(Mid(i, 2)) + 1)
   SaveName = SaveName & i
 Loop
 
  wd.SaveAs MYPATH & SaveName, FileFormat:=wdFormatDocument
  SaveName = ""
  i = ""
 End If
  wd.Close False
Next wd
 Application.Quit
End Sub

'------------------------------------------------

もしかしたら、余計な部分を入れてしまったかもしれません。その時はおっしゃってください。

こんにちは。Wendy02です。

>Application.Quit
>'Application.Quit
>は何が違うんでしょうか?

いえ、私の個人的な経験からです。どうも、アプリケーション(Word)をいきなり閉じてしまうということに抵抗があったから、コメントアウト(「'」を先頭につけること)していたのです。

すんなり終わってくれればよいのですが、何かが、プロセス上で残る可能性を心配して、問題なければ、そのコメントアウトを外してくれればよい、ということで書きました。

なお、テキストファイル全部をWord ドキュメン...続きを読む

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

QInDesignの半角文字列を全角に変換する方法

InDesign CSで、半角の文字列を全角に自動的に変換する設定方法についてお聞きします。

InDesignに流し込んだ日本語の文章の中で、2桁の半角数字と、4桁の半角の数字が一緒に混じっています。このうち、4桁の半角数字だけを全角に自動的に変換する設定がInDesignにあるのでしょうか? 手動でいちいち変換するのが大変なので、自動的に変換する設定があれば便利だなと思っています。

ネットで調べたのですが、今ひとつ分かりませんでした。
不勉強で申し訳ないのですが、設定方法があれば教えて頂ければ幸いです。
よろしくお願いします。

Aベストアンサー

検索と置換のダイアログから、文字種変換を選び、

“検索文字列”を「半角英数字」
“置換文字列”を「全角英数字」にして検索をかけ、
2桁は無視し、4桁は置き換えていく

というのはどうですか。

QInDesignを使用したデータ結合について

InDesignを使用したデータ結合について
InDesignを使用して冊子の編集をしているのですが、データ結合がうまくいきません。具体的に言いますと、左右のページでデザインが異なっているために、一括でデータの結合をしてしまうと、デザインがずれてしまうのです。へたくそですがお絵かき添付をいたしましたので参考にしてください。
デザインはマスターページで保存しており、そのマスターを1ページから適用しているのですが、その状態でデータ結合をしてしまうと、右側のページばかりができてしまいます。csvファイルで保存してあるデータを左、右、左、右と言う風に適用していくことはできないのでしょうか?
初心者で勉強不足ということもあるのですが、どうぞご回答のほどよろしくお願いいたします。

Aベストアンサー

マスターページを見開きで作成して
マスターページの適用を行えばいいのではないでしょうか。
必ずマスターを見開きで使用しなくても
片方のページだけの適用もできますよ。

Q急いでいます。XDWファイルの開き方教えてください。

急いでいます。XDWファイルの開き方教えてください。

メールに添付されたファイル(拡張子XDW)を開こうとすると
「指定されたファイルに対してこの操作を行うプログラムが関連つけられていません。
コントロールパネルの[関連付けを設定する]でプログラムを関連づけてください。」と出ます。

調べて、フジゼロックスの Docu Worksというソフトをダウンロードしてみたんですが
(したつもりですができてるのか…??)なにも変わりません。

関連付けの方法はここを見ましたがよくわかりません…
http://homepage3.nifty.com/nanahoshi/filetype/filetype.html

これが見れるまで、寝られなそうです…
もしわかる方いらっしゃいましたら助けてください。

Aベストアンサー

http://docuworksn.blog108.fc2.com/blog-entry-2.html

Q表の罫線は「表の属性」「セルの属性」どちらで作る?

InDesignの表の罫線に関してなのですが、「表の属性→行の罫線(列の罫線)」で作るのがいいのか、「セルの属性→罫線と塗り」の、どちらで作るのが一般的なのでしょうか?
そもそも、この二つは何が違うのでしょうか?
よろしければ、教えてください。

Aベストアンサー

どちらが一般的というのはありません。
私は全体的な(規則的な)部分は「表の属性」で行い、細かい部分的な修正は「セルの属性」で行っています。違いはというと、「セルの属性」は設定のオーバーライド(上書き)が前提に対して、「表の属性」はオーバーライドが選択可能なところかと思います。

QFilter関数を用いた結果、何も検索されなかった場合

Filter関数を用いた結果、何も検索されなかった場合

以下のプログラムを実行したところ、セルはまっさらのまま。
  Sub Macro3()
    Dim a As Variant
    a = Array(1, 2, 3, 4, 5)
    ActiveCell.Value = Filter(a, 8)
  End Sub

そこで
  If Filter(A,8) = "" Then ・・・(1)
    ActiveCell.Offset(1, 0).value = False
  Else表示
    ActiveCell.Offset(1, 0).value = True
  endif
を書き加えてみましたところ、
  実行時エラー'13':
  型が一致しません
とのエラーが出ます。

(1)を
  If ActiveCell.value = "" Then
と書く分には問題ないのですが、だからと言って、Filter(A,8)の値は""で表せないのですね。

とりあえずこの五行はエラーが出ているので削除しました。

次に
  ActiveCell.Offset(1, 0).Value = IsEmpty(Filter(A, 8))
を書き加えると、アクティブセルの一つ下は「False」となります。Filter(A,8)では何も抽出されないのですから、空か否かを問われたら「True」のはずなのですが・・・やはり何か戻り値があるのですね・・・

ではエラー値が戻っているのかと
  ActiveCell.Offset(2, 0).Value = IsError(Filter(A, 8))
を書き加えると、「False」ですからエラー値ではありません。

  If Filter(A,8) = Null Then ・・・(2)
    ActiveCell.Offset(3, 0).value = False
  Else表示
    ActiveCell.Offset(3, 0).value = True
  endif
を書き加えたところ、またも
  実行時エラー'13':
  型が一致しません
とのエラーが出ます。

(2)を
  If Filter(A,8) = Error Then
と書き換えてみても同じです。

試しに(2)を
  If Cvar(Filter(A,8)) = Null Then
としてみたり
  If Filter(A,8) = Cvar(Null) Then
としてみたり
  If Cvar(Filter(A,8)) = Cvar(Null) Then
としてみたりしましたが、同じエラーが出ます。

Ubound(Filter(A,8)の値は-1です。これをもってこの場合の戻り値とするしかないのでしょうか。filter関数の戻り値が分からないからUbound関数を使っていることがモロばれで、嫌なんです。

  If Filter(A,8) = なんとか Then
のなんとかに入る戻り値をどなたか教えてください。

Filter関数を用いた結果、何も検索されなかった場合

以下のプログラムを実行したところ、セルはまっさらのまま。
  Sub Macro3()
    Dim a As Variant
    a = Array(1, 2, 3, 4, 5)
    ActiveCell.Value = Filter(a, 8)
  End Sub

そこで
  If Filter(A,8) = "" Then ・・・(1)
    ActiveCell.Offset(1, 0).value = False
  Else表示
    ActiveCell.Offset(1, 0).value = True
  endif
を書き加えてみましたところ、
  実行時エラー'13':
  型が一致しません
とのエ...続きを読む

Aベストアンサー

Filterの結果がどうなるのか理解できていないと思います。

Filterの結果は複数件数の可能性がありますので配列(Array)で結果が返ります。
よって該当データがなくてもエラーになりません。

該当データがあったのか、無かったのかの判断は配列が何件あるかを調べれば良いです。
該当件数を調べるのは「UBound」を使用してください。
makojiさんのデータを例にすると
  UBound(Filter(a, 8)) … -1
  UBound(Filter(a, 3)) … 0
になります。

プログラム的には
 If UBound(Filter(a, 8)) = -1 Then
   ActiveCell.Offset(1, 0).Value = False
 Else
   ActiveCell.Offset(1, 0).Value = True
 End If


人気Q&Aランキング