Word VBA質問箱 IV

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

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


4 / 45 ページ ←次へ | 前へ→

【859】改行がないワード文章に100桁毎に改行を入...
質問    - 18/8/14(火) 22:14 -

引用なし
パスワード
    半角数字と空白のみが混在するワードに100桁毎に改行を入れたい
と思っています。(空白も1文字としてカウントする)

 例えは・・・
            ↓ここ(9)が100桁目     ↓ここ(8)が200桁目
 12345空空空空679・・・ 9【改行】1234567空空空34・・・8【改行】1234567

というような感じです。数字と空白の羅列自体には規則性はなく、また全体で何文字あるかは、不明というのが条件です。(255文字の時もあれば、35432文字の場合もあるような感じ。)  

 このようなワードマクロを組むことは可能でしょうか?可能であれば、
是非ともご教示ください。宜しくお願い致します。
・ツリー全体表示

【858】Re:word vbaで文字列を置換したい、見つか...
お礼  あお  - 18/6/11(月) 14:25 -

引用なし
パスワード
   本日会社で試したところ教えていただいたやり方でできました。本当にありがとうございました!

▼あお さん:
>こんにちは、いつもお世話になっています。
>wordのVBAで以下で置換をしようとしていて以下は問題なく動きます。
>word.application.selection.find.execute findtext:=置換前の文字列,replace:=wdreplaceall,replacewith:=置換後の文字列
>文字が見つからなかったときもエラーにならずに終了してしまうのですが、見つからなかったときはフラグを立てたいと思っています。
>そのようなことはできますでしょうか?
>wordは初心者、検索してExcelvbe内に書いてます。
・ツリー全体表示

【857】Re:word vbaで文字列を置換したい、見つか...
発言  あお  - 18/6/8(金) 20:52 -

引用なし
パスワード
   亀マスターさん、ありがとうございました!
月曜に会社でやってみます!!
聞く人もおらず調べても見つからず苦戦して久しぶりに投稿いたしました。
本当に助かります、教えてもらったページもよく読んでおきます(今後はここらで解決できるよう頑張ります)
また、月曜に投稿します


▼亀マスター さん:
>Executeメソッドは検索成功時にTrueを返し、失敗時にFalseを返します。
>ですので、以下のような形で判定できます。
>
>If Word.Application.Selection.Find.Execute FindText:="文字列A", Replace:="文字列B" = True Then
>  '成功時の処理
>Else
>  '失敗時の処理
>End If
>※Ifの中で=Trueはなくても動きますが、わかりやすくするためにあえて入れています。
>
>また、FindオブジェクトのFoundプロパティも同様の値を返すので、以下のようにしてもOKです。
>
>With Word.Application.Selection.Find
>  .Execute FindText:="文字列A", Replace:="文字列B"
>  If .Found = True Then
>    '成功時の処理
>  Else
>    '失敗時の処理
>  End If
>End With
>
>
>ht tps://msdn.microsoft.com/ja-jp/vba/word-vba/articles/find-execute-method-word
>ht tps://msdn.microsoft.com/ja-jp/vba/word-vba/articles/find-found-property-word
・ツリー全体表示

【856】Re:word vbaで文字列を置換したい、見つか...
回答  亀マスター  - 18/6/8(金) 20:14 -

引用なし
パスワード
   Executeメソッドは検索成功時にTrueを返し、失敗時にFalseを返します。
ですので、以下のような形で判定できます。

If Word.Application.Selection.Find.Execute FindText:="文字列A", Replace:="文字列B" = True Then
  '成功時の処理
Else
  '失敗時の処理
End If
※Ifの中で=Trueはなくても動きますが、わかりやすくするためにあえて入れています。

また、FindオブジェクトのFoundプロパティも同様の値を返すので、以下のようにしてもOKです。

With Word.Application.Selection.Find
  .Execute FindText:="文字列A", Replace:="文字列B"
  If .Found = True Then
    '成功時の処理
  Else
    '失敗時の処理
  End If
End With


ht tps://msdn.microsoft.com/ja-jp/vba/word-vba/articles/find-execute-method-word
ht tps://msdn.microsoft.com/ja-jp/vba/word-vba/articles/find-found-property-word
・ツリー全体表示

【855】word vbaで文字列を置換したい、見つからな...
質問  あお  - 18/6/8(金) 14:35 -

引用なし
パスワード
   こんにちは、いつもお世話になっています。
wordのVBAで以下で置換をしようとしていて以下は問題なく動きます。
word.application.selection.find.execute findtext:=置換前の文字列,replace:=wdreplaceall,replacewith:=置換後の文字列
文字が見つからなかったときもエラーにならずに終了してしまうのですが、見つからなかったときはフラグを立てたいと思っています。
そのようなことはできますでしょうか?
wordは初心者、検索してExcelvbe内に書いてます。
・ツリー全体表示

【854】Re:ExcelからWord図形を検索する
発言  マナ  - 18/3/21(水) 13:31 -

引用なし
パスワード
   ▼かず さん:

>わたしの2010では判定できています。

こんな感じで確認しました。

Sub 動作確認()
  Dim doc As Document
  Dim sp As Shape
  
  Set doc = ActiveDocument

  For Each sp In doc.Range.ShapeRange
    If sp.Type = msoGroup Then
      グループ内調査 sp
    Else
      吹き出し取得 sp
     End If
  Next
  
End Sub

Private Sub 吹き出し取得(sp As Shape)

  Select Case sp.AutoShapeType
    Case 53 To 59, 105 To 124, 137
      MsgBox sp.TextFrame.TextRange.Text
      MsgBox sp.Anchor.Information(wdActiveEndPageNumber)
  End Select

End Sub

ところで、吹き出し以外でも、図形にコメント挿入できますが問題ないのでしょうか。
・ツリー全体表示

【853】Re:ExcelからWord図形を検索する
発言  マナ  - 18/3/21(水) 13:20 -

引用なし
パスワード
   ▼かず さん:

>Q1
>Word のバージョンが2010 になると AutoShapeType プロパティ
>が使えるオブジェクトを変えないといけないのでしょうか?

グループ化された図形で試して、使えないと判断しただけでは?
わたしの2010では判定できています。

>Q2 吹き出しがある箇所を、何ページの何行目科の位置と、
>  その図形自体へのハイパーリンクとして、上記リストでは
>  4列目と5列目に記載したいと思います

わたしにはできません。
解決したら、報告お願いします。
・ツリー全体表示

【852】ExcelからWord図形を検索する
質問  かず  - 18/3/17(土) 23:55 -

引用なし
パスワード
   Word文書の納品前チェックをしており、本来は削除されているはずの
吹き出しが残っていないか、チェックするマクロを組みたいと思って
います。

Q1
自宅Windows10 Excel2007 Word2007 の環境で
Excel VBAからWordを起動してWordの図形=Shape の
中から 吹きだしを 取り出して リストすることまでできたのですが
これを会社(Windows7 Excel2010) で実行すると 図形の
判定=> AutoShapeTypeでの判定ができず そこを書き換えが必要なようです
★印部分です

Word のバージョンが2010 になると AutoShapeType プロパティ
が使えるオブジェクトを変えないといけないのでしょうか?
Word2013や2016 でも変えないといけないとすると少々面倒ですが
そういうものでしょうか?
----リスト-----------------
Sub test()
  Dim doc As Document
  Dim x As Word.Shape
  Dim y As Shape
  
  Dim wb As Workbook
  Dim wk As Worksheet
  Dim cFiles As Variant
  Dim C As Comment
  Dim cPath As String
  Dim cFile As String
  Dim i As Long
  Dim j As Long
  Dim iR As Long

  Dim w As Variant
  Dim sh As Worksheet
  Dim cc As Range
  Dim r As Range
  Dim z As Variant
  Dim flag As Boolean
  
  Dim isp As InlineShape
  Dim msg As String

  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Application.ShowWindowsInTaskbar = False
  Application.EnableEvents = False

  Set wk = ActiveSheet
  Cells.Delete
  iR = 1
  wk.Range("A" & iR & ":" & "D" & iR).Value = Array("種類", "パス", "文字列", "リンク")
  
  cPath = ThisWorkbook.Path & "\"
  cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.doc*""").StdOut().ReadAll(), vbNewLine)
  For i = 0 To UBound(cFiles) - 1
      cFile = Mid(cFiles(i), InStrRev(cFiles(i), "\") + 1)
      If Left(cFile, 2) <> "~$" Then

         With CreateObject("word.application")
           '.Visible = True
           .documents.Open Filename:=cFiles(i), ReadOnly:=True
          
           Set doc = ActiveDocument
           ' アクティブ文書の全Shapeにループを回す
           For Each x In ActiveDocument.Shapes
             ' ★ ↑会社ではActiveDocument.Range.ShapeRange 
             ' Shapeが吹き出しだったら
             If ((x.AutoShapeType >= 53 And x.AutoShapeType <= 59) Or _
               (x.AutoShapeType >= 105 And x.AutoShapeType <= 124) Or _
               x.AutoShapeType = 137) Then
               iR = iR + 1
               wk.Cells(iR, "A").Value = "吹出し"
               wk.Cells(iR, "B").Value = cFiles(i)
               wk.Cells(iR, "C").Value = x.TextFrame.TextRange.Text
               'wk.Cells(iR, "D").Value = x.Top
               wk.Hyperlinks.Add Anchor:=wk.Cells(iR, "D"), Address:=cFiles(i), SubAddress:="'" & .Name '&  "'!" & x.TopLeft.Address(False, False)
                  
               wk.Cells(iR, "D").Font.Underline = xlUnderlineStyleSingle
               wk.Cells(iR, "D").Font.ColorIndex = 5
             End If
           Next x

        
         End With

      End If
  Next i
  Columns("A:D").AutoFit
  Rows("1:" & iR).AutoFit
  
  'ThisWorkbook.Activate
  Range("B2").Select
  ActiveWindow.FreezePanes = False
  ActiveWindow.FreezePanes = True
  
  Application.EnableEvents = True
  Application.ShowWindowsInTaskbar = True
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub

Q2 吹き出しがある箇所を、何ページの何行目科の位置と、
  その図形自体へのハイパーリンクとして、上記リストでは
  4列目と5列目に記載したいと思います
  ぜひお知恵をお借りしたくよろしくお願いいたします
 一覧表にできないでしょうか
・ツリー全体表示

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

引用なし
パスワード
   ▼マナ さん:

1ページごとのデータと言われたので、ページと思いこんでいましたが、教えていただいた通りセクション区切りで検索したら検索できました。セクション区切りについてもよく知らずお恥ずかしいです。教えていただいたコードのmをbにしたら、できました。簡単にできるようになりました。どうもありがとうございました。
・ツリー全体表示

【850】Re:各ページ各行それぞれ違う文字列の挿入
発言  マナ  - 18/2/14(水) 19:51 -

引用なし
パスワード
   ▼あかよん さん:

本当に、「改ページ」がありますか?
「セクション区切り」ということはありませんか。
・ツリー全体表示

【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
・ツリー全体表示

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

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

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

引用なし
パスワード
   ご親切に参考サイトを教えていただき、ありがとうございました。
>特殊文字の一覧にある
>「任意指定のページ区切り」
>が相当します。
>直接、「^m」と入力してもよいです。
>
^pは検索されるのですが、^mは直接入力して検索しても一致なしになります。
特殊文字の検索で改ページが検索できないので、教えていただいたコードを実行しても最後のページしか最終行に挿入されないのではないかと思います。置換でできたら楽なのですが。
・ツリー全体表示

【846】Re:各ページ各行それぞれ違う文字列の挿入
発言  マナ  - 18/2/13(火) 19:54 -

引用なし
パスワード
   ▼あかよん さん:

確かに置換でできるならわざわざマクロ使うことなかったです。

で、改ページですが

特殊文字の一覧にある
「任意指定のページ区切り」
が相当します。
直接、「^m」と入力してもよいです。

こちらを参考にしてください。
ht tp://www4.synapse.ne.jp/yone/word2013/word2013_kensaku_tokusyu.html
・ツリー全体表示

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

引用なし
パスワード
   マナ さんもご親切にありがとうございます。
改ページを文字挿入&改ページにすればよいとは思ったものの、改ページを検索する方法がわかりませんでした。このまま実行してみましたところ、検索に引っかかっていないみたいで、最終ページの最終行のみ挿入されます。置換では難しいということでしょうか?
・ツリー全体表示

【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
・ツリー全体表示

【843】Re:前面で配置した図のアンカーの移動
お礼  はな  - 18/2/13(火) 8:09 -

引用なし
パスワード
   マナさん、ありがとうございます!
英語でよく分からないところもありますが
コピペし直せばってことでしょうか。
やってみます!!
・ツリー全体表示

【842】Re:各ページ各行それぞれ違う文字列の挿入
発言  マナ  - 18/2/10(土) 15:00 -

引用なし
パスワード
   ▼あかよん さん:

お邪魔します。
わたしも勉強中で間違っているかもしれませんが

>各ページの最終行の1行下に文字列を挿入したいのですが、ページの最終行というのはどのように判断するのでしょうか。

必ず改ページがあるなら、置換が使えませんか。


Option Explicit

Sub test()
  Dim r As Range
  Const s As String = "</item>"
  
  Set r = ActiveDocument.Range
  
  With r.Find
    .Text = "^m"
    .Replacement.Text = "^p" & s & "^m"
    .Execute Replace:=wdReplaceAll
  End With
  
  r.InsertAfter vbCr & s

End Sub
・ツリー全体表示

【841】Re:前面で配置した図のアンカーの移動
発言  マナ  - 18/2/10(土) 14:57 -

引用なし
パスワード
   ▼はな さん:
検索してみました。
ht tps://groups.google.com/forum/#!topic/microsoft.public.word.vba.general/sCdPFmViRkQ
・ツリー全体表示

【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行目の処理を終えた後に上記のループを加えます(ループの中にループができる形)

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

4 / 45 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
207512
(SS)C-BOARD v3.8 is Free