Wordの余白を除いたページ幅の中心位置の割り出し方について

Wordのページ中心位置に関する大いなる錯誤

偶然の一致だった

前回、コチラの記事で、

tmp = CLng(Word.PointsToMillimeters(objDoc_.PageSetup.PageWidth))
では、ページ横幅の中心位置を割り出しているのだが、なぜこれで中心が割り出せるのか分からない。

などと書いていた。

だが、id:imihitoさんからのご指摘

PageSetupは余白を含んだページの大きさを取得する

にある通り。すなわち、

余白を含めたページ幅(単位はpoint)のmillimeter換算値が、たまたま余白を除いたページ幅の半分(単位はpoint)とだいたい同じだっただけ

というオソロシイことが判明www

無知とはオソロシイ……。

コードの改良 その1

そんなわけで、まずは

余白を除いたページ幅の半分の割り出し

をば。

f:id:akashi_keirin:20170503081345j:plain

ページの幅に関するプロパティは画像に示した通り。

また、

f:id:akashi_keirin:20170503081338j:plain

この画像の通り、

  • X:余白を含めたページ幅
  • Y:左余白
  • Z:右余白
  • a:ハンコ画像の幅

とすると、まず余白を除いたページ幅の半分は、

(X - (Y + Z)) / 2

で求めることができる。

ハンコ画像を中心に持ってくるためには、ハンコ画像の左端をハンコ画像の幅の半分だけページ中心位置からずらしたところに持ってきたら良いので、

(X - (Y + Z)) / 2 - a / 2

整理して

(X - (Y + Z + a)) / 2

とすれば良いはず。

リスト1
Dim wdPageSetup As Word.PageSetup    '……(1)'
Set wdPageSetup = objDoc_.PageSetup
Dim tmpShape As Word.Shape    '……(2)'
Set tmpShape = objDoc_.Shapes.AddPicture(imgPath)    '……(3)'
With wdPageSetup
  tmpShape.Left = _
    (.PageWidth - (.LeftMargin + .RightMargin + tmpShape.Width)) / 2    '……(4)'
  tmpShape.Top = -(.TopMargin / 2)    '……(5)'
End With

まず、(1)では、id:imihitoさんのアドヴァイスに従って、

Dim wdPageSetup As Word.PageSetup
Set wdPageSetup = objDoc_.PageSetup

このように、WordのPageSetup型のオブジェクト変数を用意して、操作対象であるobjDoc_(Wordドキュメント)のPageSetupをオブジェクトとして格納している。へえ、こんなこともできるんですねえ。

んで、(2)。前回ハマったポイントです。

コチラは、id:imihitoさん、それからツイッターのフォロワーさんから一斉にツッコミが入ったポイントで、要するに、Excelさんの立場からすると

「Shape」ってオメー、それだけだとExcelのShapeだかWordのShapeだか分かんねーよ、バカ!!!!!!!!

ということのようですね。よく考えたら当たり前だ。だから、

Dim tmpShape As Word.Shape

と、WordのShapeであることを明示した。

id:imihitoさん、フォロワーさん、あざす!

(3)は、これまたid:imihitoさん、フォロワーさんの両方からご教示くださったポイント。お二方のアドヴァイスに従って、

Set tmpShape = objDoc_.Shapes.AddPicture(imgPath)

このように、いきなりハンコ画像を変数にセットした。実行時の挙動を見ていると、変数にセットするだけで勝手にLeft = 0, Top = 0の位置に配置されるようだ。一旦配置してからでないとダメだと思っていたのですよ。

これまたid:imihitoさん、フォロワーさん、あざす!

ここまできたら、後はハンコ画像の位置を決めるだけ。

まずは(4)の

tmpShape.Left = _
  (.PageWidth - (.LeftMargin + .RightMargin + tmpShape.Width)) / 2

で左余白を除いたページ左端からの距離を定め、

(5)の

tmpShape.Top = -(.TopMargin / 2)

でハンコ画像の上端の位置を定めている。上余白の半分だけ上にめり込ませるような感じにした。

前回のリスト1に比べてなんとスッキリしたコードになったことか!

あらためてid:imihitoさん、フォロワーさん、あざす!

実行結果

実行してみた。

f:id:akashi_keirin:20170503081353j:plain

Wordドキュメントに、

f:id:akashi_keirin:20170503081402j:plain

まずハンコが設置され、

f:id:akashi_keirin:20170503081407j:plain

水平移動、

f:id:akashi_keirin:20170503081411j:plain

そして、垂直移動して完成。

って、ん……???

f:id:akashi_keirin:20170503081411j:plain

なんか、ちょっと右にズレとるぞ……。「斡旋決定通知書」という見出しは中央揃えにしているので、「定」に重なるはずなんだが……。

結論

今度こそ、なぜちょっとだけ右にズレるのか分かりませぬ……。

@akashi_keirin on Twitter