Word VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


15 / 306 ツリー ←次へ | 前へ→

【829】各ページ各行それぞれ違う文字列の挿入 あかよん 18/2/2(金) 10:58 質問[未読]

【838】Re:各ページ各行それぞれ違う文字列の挿入 あかよん 18/2/9(金) 12:47 質問[未読]
【839】Re:各ページ各行それぞれ違う文字列の挿入 亀マスター 18/2/10(土) 0:08 回答[未読]
【844】Re:各ページ各行それぞれ違う文字列の挿入 あかよん 18/2/13(火) 12:48 質問[未読]
【848】Re:各ページ各行それぞれ違う文字列の挿入 あかよん 18/2/14(水) 10:31 質問[未読]
【849】Re:各ページ各行それぞれ違う文字列の挿入 あかよん 18/2/14(水) 11:05 お礼[未読]

【838】Re:各ページ各行それぞれ違う文字列の挿入
質問  あかよん  - 18/2/9(金) 12:47 -

引用なし
パスワード
   >各ページは1〜10行目になんらかの文字列があり、続いて参照する項目があればそれが入る。その後、改行記号の連打ではなく空白(つまり改ページが入っている)ということでいいでしょうか。

はい。その通りです。
私はマクロの記録をちょっと手直しをしたことがあるくらいで、簡単なコードを理解するのも難しいレベルです。数百ページあり、必要に迫られてしまいまして、質問も拙いものばかりで大変お手数をおかけして申し訳ありません。

>1.カーソルを次の行に移動
>2.現在のカーソルが1行目かどうかを判定
>3.1行目なら先ほどの行が最終行だったということなので、前の行に戻る
>  1行目でなければ1行目になるまで1.〜2.を繰り返す
>4.現在の行(最終行)の末尾にカーソルを移動
>5.改行
>6.挿入したい文章を加える

 この3番目がどこにどのように繰り返しの記述を入れたらよいのか、どうしてもわかりません。よろしくお願いいたします。

Dim tempLine As Long
Dim tempColumn As Long

tempLine = Selection.Information(wdFirstCharacterLineNumber)
tempColumn = Selection.Information(wdFirstCharacterColumnNumber)

Selection.Move wdLine, 1     

Select Case Selection.Information(wdFirstCharacterLineNumber)
  Case 1 '1行目の時
    Selection.MoveUp Unit:=wdLine, Count:=1
    Selection.EndKey Unit:=wdLine
    Selection.TypeParagraph
    Selection.TypeText Text:="</item>"
  
  Case tempLine '最終ページの最終行の時
    Selection.EndKey Unit:=wdLine
    Selection.TypeParagraph
    Selection.TypeText Text:="</item>"
  
  Case Else
    
        ????  
    
End Select

【839】Re:各ページ各行それぞれ違う文字列の挿入
回答  亀マスター  - 18/2/10(土) 0:08 -

引用なし
パスワード
   >質問も拙いものばかりで大変お手数をおかけして申し訳ありません。
いえいえ、十分できていると思いますよ。
かくいう私も、偉そうなことを書いておきながらWord VBAはあまり得意ではないので、自分自身が勉強しながら回答しているという感じですので(^^ゞ

> この3番目がどこにどのように繰り返しの記述を入れたらよいのか、どうしてもわかりません。よろしくお願いいたします。

Do
  Selection.Move wdLine, 1
  Select Case Selection.Information(wdFirstCharacterLineNumber)
    Case 1 '1行目の時
      Selection.MoveUp Unit:=wdLine, Count:=1
      Selection.EndKey Unit:=wdLine
      Selection.TypeParagraph
      Selection.TypeText Text:="</item>"
    Case tempLine '最終ページの最終行の時
      Selection.EndKey Unit:=wdLine
      Selection.TypeParagraph
      Selection.TypeText Text:="</item>"
      Exit Sub '←ここを追加(ここでSubを抜ける。Doループの後に何かまだ処理をしたいならExit Do)
  End Select
Loop
※Selectionが最終行でなかった場合は何もせずに次のループに入るので、この場合はCase Else は不要。(中身のないCase Elseを書いても害はありませんが)

こんな感じでどうでしょう。

既に1〜10行目の処理を全てのページに対して済ませた後で最終行に参照項目を入れるなら、1ページ目の1行目にカーソルを戻し、そこからこのコードを実行すればいいでしょう。カーソル位置が最終行でなければそのまま次のループへ入ってSelection.Move wdLine, 1が繰り返され、最終行に行き着けば指定の文字列を追加した上で次のループに入り、最終ページの最終行になればそこでプログラムを終了します。

1〜10行目の処理→最終行に参照項目の設定→次のページの1〜10行目の処理・・・ということであれば、全てのページに1〜10行目の処理をするループの中で、10行目の処理を終えた後に上記のループを加えます(ループの中にループができる形)

自分では動作確認をしていませんので、不具合があるようでしたらまたおっしゃってください。

【844】Re:各ページ各行それぞれ違う文字列の挿入
質問  あかよん  - 18/2/13(火) 12:48 -

引用なし
パスワード
   わかりやすく考え方を説明していただき、どうもありがとうございました。10行目までの挿入後のデータなので、以下の教えていただいたコード通りに実行してみましたところ、最初ページの最終行の最後の文字の後ろ、改行記号の前のところにカーソルがあり、止まったまま動かなくなり強制終了させないといけなくなります。
最終ページの最後の行の処理のところで、1行目を除いてみても、3行目だけの挿入するだけにしても、同じように最後の文字で止まって動かなくなります。
どうしたらよいでしょうか。


Dim tempLine As Long
Dim tempColumn As Long

tempLine = Selection.Infomation(wdFirstCharacterLineNumber)
tempColumn = Selection.Infomation(wdFirstColumnNumber)

Do
  Selection.Move wdLine, 1
   Select Case Selection.Information(wdFirstCharacterLineNumber)
    Case 1 '1行目の時
      Selection.MoveUp Unit:=wdLine, Count:=1
      Selection.EndKey Unit:=wdLine
      Selection.TypeParagraph
      Selection.TypeText Text:="</item>"
            Selection.Go To What:=wdGoToNext, Count:=1 

     Case tempLine '最終ページの最終行の時
      Selection.EndKey Unit:=wdLine
      Selection.TypeParagraph
      Selection.TypeText Text:="</item>"
      Exit Sub
  End Select
Loop

【848】Re:各ページ各行それぞれ違う文字列の挿入
質問  あかよん  - 18/2/14(水) 10:31 -

引用なし
パスワード
   何日か職場のサーバーがダウンしていて、スマホで投稿していますので、肝心なところを書き間違えました。最初のページではなく、最後のページの最終行の最後の文字のところで、カーソルがチカチカとして、強制終了しないといけなくなります。よろしくお願いします。

【849】Re:各ページ各行それぞれ違う文字列の挿入
お礼  あかよん  - 18/2/14(水) 11:05 -

引用なし
パスワード
   比較する現在行が一番最初に取得した時のままになってしまっているんじゃないか?とループの中に☆の部分を入れて実行してみたら、できました。長々とご面倒をおかけして、申し訳ありませんでした。助けていただき、ありがとうございました。これから本番データで不安ですが、わかりやすく説明していただき、考え方は理解できましたので頑張ります。
>
>
>Dim tempLine As Long
>Dim tempColumn As Long
>
>tempLine = Selection.Infomation(wdFirstCharacterLineNumber)
>tempColumn = Selection.Infomation(wdFirstColumnNumber)
>
>Do

tempLine = Selection.Infomation(wdFirstCharacterLineNumber)  ←☆
tempColumn = Selection.Infomation(wdFirstColumnNumber)   ←☆


>  Selection.Move wdLine, 1
>   Select Case Selection.Information(wdFirstCharacterLineNumber)
>    Case 1 '1行目の時
>      Selection.MoveUp Unit:=wdLine, Count:=1
>      Selection.EndKey Unit:=wdLine
>      Selection.TypeParagraph
>      Selection.TypeText Text:="</item>"
>            Selection.Go To What:=wdGoToNext, Count:=1 
>
>      Case tempLine '最終ページの最終行の時
>      Selection.EndKey Unit:=wdLine
>      Selection.TypeParagraph
>      Selection.TypeText Text:="</item>"
>      Exit Sub
>  End Select
>Loop

15 / 306 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
206457
(SS)C-BOARD v3.8 is Free