アプリから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;
はづき:「おはようございます、昨日はごちそう様でした…」
真琴 :「あっ、ハヅキさん、おはようございます」
はづき:「あんなに美味しいバーベキュー初めて食べました、アタシ」
勝爺 :「そうでしょう? 近い内にまたご招待しましょうね」
はづき:「それが…、実はアタシ…今日、東京に帰ることになりました」
真琴 :「あ、そうなんだ…、もうコッチには戻らないンですか?」
はづき:「ええ、最初はこんな長く居る予定じゃなかったのに、ココが好きになって」
真琴 :「ハヅキさん、だったら、もう少しココに…」
はづき:「ダメなんです、もうコレ以上病院での定期検査を延ばせなくて…これからしばらくは病院生活です」
真琴 :「それなら、来年の夏にまた来てくださいね」
勝爺 :「そう、待ってますよ」
はづき:「はい、必ず来年もまた夏に来ます、じゃあ、母が待ってますからこれで…」
春子:「おっはよう〜、途中でハヅキさんに会ったけど、東京に帰るらしいネ」
真琴:「うん、また来年の夏に来るって…、ハルコさん、チョット教えてくれる?」
春子:「ン? 来年の夏にリープする方法とか? そんなのやめた方がイイと思うよ」
真琴:「違うよ^^; ハルコさん、これナンだけど…」
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と同じだし、引数の順番がアバウトなんて面白いよね」
春子:「面白いといえば…」
真琴:「え? ナンなの?」
アバウト さん
具体的なソースを示していただいてありがとうございます。
ほぼ解決に向かいそうな完璧な内容です。
Range.GoTo ←これはMSDNのオートメーションを解説しているところで
目にしていたのですが、全く使い方を理解できていなかったようです。
大変勉強になりました。
あとはページの総数なのですが、エクセルのWorksheetsにあるCountのような
プロパティは存在しますか?
質問ばかりで申し訳ありませんが、よろしくお願いします。
Excelはある程度制御できていたので同じイメージだろうと
甘く見ていましたが、Wordは難しいです・・・
総ページ数ですが、サンプルの関数を流用すれば簡単に求められますね・・・
vS.Start = vR.Start となるまでループさせて計算する事にしました。
今後の為に総ページ数取得プロパティが存在するのであれば
知っておきたいのですが、指定ページをコピーする件については解決とします。
諦めに近い状態だったのですが大変助かりました。
ありがとうございました。
総頁(ページ)数ですが
>https://www.petitmonte.com/bbs/answers?question_id=1251
ではどうでしょうか?
ただし,これは,TWordApplicationを使用したコードです.
総ページ数の件は確認してみます。
ありがとうございます。
ページのコピー処理なのですが、ちょっとした問題が発生しました。
複数ページの場合は問題なかったのですが、
1ページしか存在しない場合におかしな事になってしまいました。。。
たとえば、1ページ30行だったとして途中の10行目にクリップアートを挿入していると
MoveDownが10行目で止まってしまいます。
複数ページの最終ページだと問題ありませんでした。
そこで、vR.Start = vS.Startだった場合の処理を
次のように変更するとこの現象を回避できました。
WordApp.Selection.EndKey(Unit:=wdStory, Extend:=wdExtend);
教えて頂いたGotoメソッドの使用方法を足掛かりに
いろいろ理解できるようになってきました。
重ね重ねお礼申し上げます。
ツイート | ![]() |