Wordつづき(2)
あいかわらずWordで悪戦苦闘しています。ほんっとわかりません(;´▽`A``
でもまだあきらめません。使いこなせればとてもいいものとわかっている以上もうすこし食い下がる。。
さて,個人情報を含まない形で作成中のファイルをもってきたので,それで試してみました。
shapeのduplicateメソッドは使うこととしました。
ページ指定をparagraphsであつかうのはばかげているので,そのへんを必死にさがしていたら
Word VBA 簡易リファレンス及び使用例(VB6.0) - VBレスキュー(花ちゃん)
こちらでいい情報が書いてありました。 GoToメソッドはrangeオブジェクトを返すらしいじゃないですか。
なのでたとえば2ページ目を指定したい場合は
ドキュメントオブジェクト.GoTo(wdGoToPage,wdGoToAbsolute,2)
と書ける。そしてrangeオブジェクトってことはそのままPasteつけれるじゃないか(/・ω・)/
無知なわたしとしては,この情報は歓喜に値するもの。まさにこれがほしかった。
ページ内ではleftやtopプロパティ,または絶対位置を指定するそれに類するものでなんとでもなる。
ページ移動で苦闘していたので,光が見えた気がします。
それでやりなおしたのがこのコード
今回はExcelからの流し込み部分に興味ないのでそのへんは除かれまたはコメントアウトしています。
必要なページ数はマクロでやるんじゃなく,マクロ実行する前にctrl+enterで先に確保しておく想定です。
Sub 名簿作り() Application.ScreenUpdating = False 'Dim EX As Excel.Application, WB As Excel.Workbook, DataArray As Variant 'Set EX = New Excel.Application 'Set WB = Workbooks(ThisDocument.Path & "\H30名簿データ.xlsx") Dim NewDoc As Document: Set NewDoc = Documents.Add(Template:=ThisDocument.FullName) Dim Shp(1 To 9) As Shape, TableName As Variant, i As Long TableName = Array("dummy", "1組", "2組", "3組", "4組", "5組", "6組", "7組", "8組", "9組") Set Shp(1) = NewDoc.Shapes("元") Shp(1).Name = TableName(1) For i = 2 To 9 Set Shp(i) = Shp(1).Duplicate Shp(i).Name = TableName(i) Next For i = 1 To 5 Shp(i).Left = 180 * (i - 1) Next For i = 6 To 9 Shp(i).Select: Selection.Cut NewDoc.GoTo(wdGoToPage, wdGoToAbsolute, 2).Paste Shp(i).Left = 180 * (i - 6) Next End Sub
表はこんな感じです。1つだけ準備して"元"という名前を付けています。
55行4列 一つ調整するだけでもWordはけっこう反乱を起こしますがこれが9クラス分となるとどれだけWordがいらいらする相手になるか想像できるもの(;´▽`A``
マクロ実行前
マクロ実行後
データ流し込んだりは,個人情報の関係で職場でしかできません。テストデータを用意するのはめんどくさい(;´▽`A``あとは切り取り線も用意したりするかなぁ。
とにかく,それっぽく動き出した。。
捕足
Wordは画面更新させながらマクロを動かすと,かなり表示に力を注いでいるのでScreenUpdatingはFalseにしました。
Array関数で名前のリストを作っていますが,ダミーを0番目にいれることで1スタートできるよう調整するようになりました。
まずDuplicateメソッドで増やした後,移動させるというように整理しました。
2ページ目に移す奴はカット&ペーストで処理するようにしました。
だいぶ いやなところは減りました。
引き続き取り組んでいこう。