WORDオブジェクトモデルの使用方法

解決


Macro難  2008-09-12 04:17:21  No: 31922

アプリからWordを起動してページ内容をコピーする処理を作成しています。
全てのページをコピーする事はできたのですが、
複数ページ存在する場合にページ指定を行ってコピーする方法で悩んでいます。
何か良い方法はないでしょうか?
よろしくお願いします。

全ページの全内容をコピーするところまで作成したソースです。

  MSApplication := CreateOLEObject('Word.Application');
  try
    MSApplication.Visible := False;
    MSApplication.Documents.Open(sName);
    MSApplication.Selection.WholeStory;
    MSApplication.Selection.Copy;
  finally
    MSApplication.Quit;
    MSWorkSheet := unAssigned;
  end;


アバウト  2008-09-15 21:30:12  No: 31923

はづき:「おはようございます、昨日はごちそう様でした…」
真琴  :「あっ、ハヅキさん、おはようございます」
はづき:「あんなに美味しいバーベキュー初めて食べました、アタシ」
勝爺  :「そうでしょう? 近い内にまたご招待しましょうね」
はづき:「それが…、実はアタシ…今日、東京に帰ることになりました」
真琴  :「あ、そうなんだ…、もうコッチには戻らないンですか?」
はづき:「ええ、最初はこんな長く居る予定じゃなかったのに、ココが好きになって」
真琴  :「ハヅキさん、だったら、もう少しココに…」
はづき:「ダメなんです、もうコレ以上病院での定期検査を延ばせなくて…これからしばらくは病院生活です」
真琴  :「それなら、来年の夏にまた来てくださいね」
勝爺  :「そう、待ってますよ」
はづき:「はい、必ず来年もまた夏に来ます、じゃあ、母が待ってますからこれで…」

春子:「おっはよう〜、途中でハヅキさんに会ったけど、東京に帰るらしいネ」
真琴:「うん、また来年の夏に来るって…、ハルコさん、チョット教えてくれる?」
春子:「ン? 来年の夏にリープする方法とか? そんなのやめた方がイイと思うよ」
真琴:「違うよ^^; ハルコさん、これナンだけど…」

function CopyWordPage(WordApp: Variant; Page: Integer): Boolean;
var
  vS, vR: Variant;
begin
  result := False;
  if Page = 0 then exit;
  try
   vS := WordApp.ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, Page);
   vR := WordApp.ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, Page+1);
   WordApp.ActiveDocument.Range(vS.Start, vR.Start).Select;
   WordApp.Selection.Copy;
   result := True;
  except
   raise Exception.Create('コピー失敗');
  end;
end;

春子:「ふ〜ん、この関数はWordのページを指定してコピーするってわけネ」
真琴:「そぅ、でもコレだと、どうしても最終ページの選択が出来ないの」
春子:「それはそうよ、これじゃ最終ページで"Page+1"が範囲外になっちゃう」
真琴:「やっぱり、最終ページだけは別の方法にしなくちゃダメかなぁ…」
春子:「まぁね」
真琴:「それに、ページが最終かどうかの判定方法も分からないし…」
春子:「そう? "Page+1"が範囲外なら vR.StartとvS.Startが等しくなるよ、マコト」
真琴:「えっ、そうなの?」
春子:「だから….Range().Select;の後にコレを追加」

   .......
   if (vR.Start = vS.Start) then begin   //最終ページの場合
    Cnt := WordApp.Selection.MoveDown(Count:=10000, Unit:=wdLine, Extend:=wdExtend);
    ShowMessageFmt('最終ページの全行数(%d行)を選択', [Cnt]);
   end;
   .......

真琴:「ナルホド〜…、でも、Count:=10000って、ナンで10000なの?」
春子:「最終ページの行数が分からないから、適当に大きな数を書いておけばイイの」
真琴:「そんなアバウトで大丈夫? 引数の順番もアバウトだし…」
春子:「アバウトは懲りたのかな? 適当な時間目標で時の迷子になっちゃったから」
真琴:「あんな怖い想いはもうコリゴリ、でもこの場合はOKなのね」
春子:「マコトは省略してるけど、GoToメソッドでも"What:="、"Which:="、"Count:="などキチンと書けば、引数の順序は適当で大丈夫」
真琴:「その等号はDelphiと同じだし、引数の順番がアバウトなんて面白いよね」
春子:「面白いといえば…」
真琴:「え? ナンなの?」


Macro難  2008-09-17 00:48:14  No: 31924

アバウト さん
具体的なソースを示していただいてありがとうございます。
ほぼ解決に向かいそうな完璧な内容です。

Range.GoTo ←これはMSDNのオートメーションを解説しているところで
目にしていたのですが、全く使い方を理解できていなかったようです。
大変勉強になりました。

あとはページの総数なのですが、エクセルのWorksheetsにあるCountのような
プロパティは存在しますか?

質問ばかりで申し訳ありませんが、よろしくお願いします。

Excelはある程度制御できていたので同じイメージだろうと
甘く見ていましたが、Wordは難しいです・・・


Macro難  2008-09-17 02:03:23  No: 31925

総ページ数ですが、サンプルの関数を流用すれば簡単に求められますね・・・
vS.Start = vR.Start となるまでループさせて計算する事にしました。

今後の為に総ページ数取得プロパティが存在するのであれば
知っておきたいのですが、指定ページをコピーする件については解決とします。

諦めに近い状態だったのですが大変助かりました。
ありがとうございました。


Mr.XRAY  2008-09-18 00:57:15  No: 31926

総頁(ページ)数ですが

>https://www.petitmonte.com/bbs/answers?question_id=1251

ではどうでしょうか?
ただし,これは,TWordApplicationを使用したコードです.


Macro難  2008-09-18 04:56:41  No: 31927

総ページ数の件は確認してみます。
ありがとうございます。

ページのコピー処理なのですが、ちょっとした問題が発生しました。
複数ページの場合は問題なかったのですが、
1ページしか存在しない場合におかしな事になってしまいました。。。

たとえば、1ページ30行だったとして途中の10行目にクリップアートを挿入していると
MoveDownが10行目で止まってしまいます。
複数ページの最終ページだと問題ありませんでした。

そこで、vR.Start = vS.Startだった場合の処理を
次のように変更するとこの現象を回避できました。

WordApp.Selection.EndKey(Unit:=wdStory, Extend:=wdExtend);

教えて頂いたGotoメソッドの使用方法を足掛かりに
いろいろ理解できるようになってきました。
重ね重ねお礼申し上げます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加