変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

WORD

[Excel VBA]WORD文書のコメントの頁番号を列挙する

今度はWORD文書のコメントの頁番号を列挙するマクロです。

EXCELのワークシートの「コメント行」セル名に「コメント」「コメント対象」「コメント頁番号」の列を追加して使用します。

コメントをワークシートに転記するマクロの内容は赤字頁番号()をコピってこんな感じに

Public Sub コメント字頁番号検索()
On Error GoTo err1
    '初期化
    Dim wordApp As Word.Application
    Set wordApp = CreateObject("Word.Application")
    Dim コメントの開始行 As Long
    コメントの開始行 = ActiveSheet.Range("タイトル行").row + 1
    Dim コメントの列 As Long
    コメントの列 = ActiveSheet.Range("タイトル行").Find("コメント").Column
    Dim コメント対象の列 As Long
    コメント対象の列 = ActiveSheet.Range("タイトル行").Find("コメント対象").Column    
    Dim 頁番号の列 As Long
    On Error Resume Next
    Err.Clear
    頁番号の列 = ActiveSheet.Range("タイトル行").Find("コメント頁番号").Column
    If Err.Number <> 0 Then
        頁番号の列 = ActiveSheet.Range("タイトル行").Find("頁番号").Column
    End If
    '検索対象のWORD文書を開く
    Dim wordFname As String
    wordFname = 検索対象のWORD文書名を調べる
    Dim wordDoc As Word.document
    Set wordDoc = 検索対象のWORD文書を開く(wordApp, wordFname)
    If TypeName(wordDoc) <> "Nothing" Then
        Dim row As Long
        row = コメントの開始行
        wordDoc.ActiveWindow.Selection.Start = 0
        wordDoc.ActiveWindow.Selection.End = 0
        Dim コメント As Word.Comment
        Dim 順番 As Integer
        順番 = 1
        Do While (コメント検索(wordDoc, 順番, コメント))
            Dim コメント対象テキスト As String
            コメント対象テキスト = コメント.Range.text
            コメント対象テキスト = Replace(コメント対象テキスト, vbCr, "")
            コメント対象テキスト = Replace(コメント対象テキスト, vbLf, "")
            コメント対象テキスト = Trim(コメント対象テキスト)
            If コメント対象テキスト <> "" Then
                'コメント
                ActiveSheet.Cells(row, コメントの列).Value = コメント.Range.text
                'コメントの対象テキスト
                コメント.Scope.Copy
                ActiveSheet.Cells(row, コメント対象の列).Select
                ActiveSheet.Paste
                Dim pasteRows As Integer
                pasteRows = Selection.Count
                Dim st, ed
                st = コメント.Scope.Start
                ed = コメント.Scope.End
                Dim 開始頁番号 As Integer
                wordDoc.ActiveWindow.Selection.Start = st
                wordDoc.ActiveWindow.Selection.End = st
                開始頁番号 = wordDoc.ActiveWindow.Selection.Information(wdActiveEndAdjustedPageNumber)
                Dim 終了頁番号 As Integer
                wordDoc.ActiveWindow.Selection.Start = ed
                wordDoc.ActiveWindow.Selection.End = ed
                終了頁番号 = wordDoc.ActiveWindow.Selection.Information(wdActiveEndAdjustedPageNumber)
                '右セルに頁番号を書き込む
                Dim 頁番号説明文 As String
                If 開始頁番号 <> 終了頁番号 Then
                    ActiveSheet.Cells(row, 頁番号の列).Value = 開始頁番号 & "~" & 終了頁番号 & "頁"
                Else
                    ActiveSheet.Cells(row, 頁番号の列).Value = 開始頁番号 & "頁"
                End If
                row = row + pasteRows
            End If
        Loop
    End If
exit1:
    Call MSWORDをそのまま閉じる(wordApp)
    Exit Sub
err1:
    MsgBox Err.Description
    GoTo exit1
End Sub

コメント検索は、順序の順にコメントを引き渡し、無くなったらFalseを返す様にしました。

パラメータのByRef指定を使って順序とコメントの内容を更新する方法は余り使わなくなった手法かもしれません。

Private Function コメント検索(ByRef wordDoc As Word.document, ByRef 順番 As Integer, ByRef コメント As Word.Comment) As Boolean
    With wordDoc.Comments
        If 順番 > .Count Then
            コメント検索 = False
            Exit Function
        End If
        Set コメント = wordDoc.Comments(順番)
        順番 = 順番 + 1
    End With
    コメント検索 = True
End Function

実際には、コメント検索やワークシートに【返信(Replies)】と【解決(Done)】の処理があった方が使い道がありそうですけどね。



[Excel VBA]WORD文書の赤色属性を含む文字の頁番号を列挙する

先の[Excel VBA]WORD文書の赤字の頁番号を列挙するでは、赤字以外の属性(抹消線など)があるテキストをヒットしなかったので、改訂版です。

今回はWORDの「高度な検索」の「書式」で「赤字」だけ設定する方法を使います。

と云っても、赤文字頁番号検索()少し変えたダケです。(笑

Public Sub 赤文字頁番号検索()
On Error GoTo err1
    '初期化
    Dim wordApp As Word.Application
    Set wordApp = CreateObject("Word.Application")
    Dim 赤字の開始行 As Long
    赤字の開始行 = ActiveSheet.Range("タイトル行").row + 1
    Dim 赤字の列 As Long
    赤字の列 = ActiveSheet.Range("タイトル行").Find("赤字").Column
    Dim 頁番号の列 As Long
    On Error Resume Next
    Err.Clear
    頁番号の列 = ActiveSheet.Range("タイトル行").Find("赤字頁番号").Column
    If Err.Number <> 0 Then
        頁番号の列 = ActiveSheet.Range("タイトル行").Find("頁番号").Column
    End If
    '検索対象のWORD文書を開く
    Dim wordFname As String
    wordFname = 検索対象のWORD文書名を調べる
    Dim wordDoc As Word.document
    Set wordDoc = 検索対象のWORD文書を開く(wordApp, wordFname)
    If TypeName(wordDoc) <> "Nothing" Then
        Dim row As Long
        row = 赤字の開始行
        wordDoc.ActiveWindow.Selection.Start = 0
        wordDoc.ActiveWindow.Selection.End = 0
        Do While (高度な赤字検索(wordDoc))
            Dim 赤字 As String
            赤字 = wordDoc.ActiveWindow.Selection.text
            赤字 = Replace(赤字, vbCr, "")
            赤字 = Replace(赤字, vbLf, "")
            赤字 = Trim(赤字)
            If 赤字 <> "" Then
                wordDoc.ActiveWindow.Selection.Copy
                ActiveSheet.Cells(row, 赤字の列).Select
                ActiveSheet.Paste
                Dim pasteRows As Integer
                pasteRows = Selection.Count
                Dim st, ed
                st = wordDoc.ActiveWindow.Selection.Start
                ed = wordDoc.ActiveWindow.Selection.End
                Dim 開始頁番号 As Integer
                wordDoc.ActiveWindow.Selection.Start = st
                wordDoc.ActiveWindow.Selection.End = st
                開始頁番号 = wordDoc.ActiveWindow.Selection.Information(wdActiveEndAdjustedPageNumber)
                Dim 終了頁番号 As Integer
                wordDoc.ActiveWindow.Selection.Start = ed
                wordDoc.ActiveWindow.Selection.End = ed
                終了頁番号 = wordDoc.ActiveWindow.Selection.Information(wdActiveEndAdjustedPageNumber)
                '右セルに頁番号を書き込む
                Dim 頁番号説明文 As String
                If 開始頁番号 <> 終了頁番号 Then
                    ActiveSheet.Cells(row, 頁番号の列).Value = 開始頁番号 & "~" & 終了頁番号 & "頁"
                Else
                    ActiveSheet.Cells(row, 頁番号の列).Value = 開始頁番号 & "頁"
                End If
                row = row + pasteRows
            End If
        Loop
    End If
exit1:
    Call MSWORDをそのまま閉じる(wordApp)
    Exit Sub
err1:
    MsgBox Err.Description
    GoTo exit1
End Sub

後は、高度な赤字検索()を追加するだけです。

中身はWORDで「高度な検索」の「書式」で「赤字」だけ設定した時のマクロ記録内容を少し調整したものです。

Private Function 高度な赤字検索(wordDoc As Word.document) As Boolean

    With wordDoc.ActiveWindow.Selection.Find
        '書式関連を初期化
        .ClearFormatting
        .Font.Color = wdColorRed
        '文字関連を初期化
        .text = ""
        .Replacement.text = ""
        .Forward = True
        .Wrap = wdFindStop '文書の終わりで中断
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = True
        '検索
        .Execute
        '結果を取得
        高度な赤字検索 = .Found
    End With

End Function

検索対象のWORD文書名を調べる検索対象のWORD文書を開くMSWORDをそのまま閉じるは前の記事のままです。

Font.ColorとFont.ColorIndexのいづれを使うのか良いのかは悩ましいです。

後、デバッグ中は起動したMS-WORDをタスクマネージャから終了していましたが、上記のwordAppを外部変数にして、マクロ画面から終了させた方が便利そう。

Dim wordApp As Word.Application
・・・
Set wordApp = CreateObject("Word.Application")
・・・
public sub マクロ実行中に起動したMSWORDを強制終了
    Call MSWORDをそのまま閉じる(wordApp)
End Sub 


【修復】[MS-Word2013]マクロで図形を描く

EXCELみたいに
四角形(□)を置くところの操作を「マクロの記録」させてみた。
あれソースが貼り付かない?
MS-WordのVBAソースを範囲指定して、Ctrl+Cしてもクリップボードに入らない。
マウスを右クリックしてコンテンツ・メニューからコピーしなければいけない。
んで、ペースト。

Sub Macro1()
'
' Macro1 Macro
'
'
End Sub

何も記録されていなかった。
ぴゅぅ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜orz
図形に関しては何も記録しないっぽい。
ヘルプを読んでみる。

マクロを作成または記録する

Microsoft Office Word 2007 では、マクロを作成することによって、よく使用する作業を自動化することができます。マクロとは、特定の作業を完了するために必要な一連のコマンドや命令を、1 つのコマンドにまとめたものです。
バージョンが間違っているが、MS-Office 2010も同様で多分時効が過ぎている。
とてもフレンドリーな説明文も2007向けなので2013に脳内で変換しなければいけない。

  • マクロに記録する操作を実行します。
  •   マクロの記録中に、マウスを使用してコマンドやオプションをクリックすることはできますが、文字列を選択することはできません。

文字列を選択するには、キーボードを使用する必要があります。・・・
そう、マウス操作を記録してくれないのだ。
だから「文字列を選択する」にもキーボードで「文字列を選択する」必要があるのだ。
 
では、WORDのマクロで図形を描くにはどうしたらいいんだろう。
図形をクリップボードに記憶した後に、マクロ記録しながらペーストしてみると・・・

ActiveDocument.Shapes.Range(Array("Group 7")).Select
Selection.PasteAndFormat (wdPasteDefault)

しかし依然として図形を作る部分は記録されないので事前設定が必要。
EXCELでは

ActiveSheet.Shapes.AddShape(msoShapeRectangle, 404.25, 81, 72.75, 59.25).Select

のように「マクロの記録」が取れる。
EXCELとWORDのVBAの「オブジェクト・ブラウザー」のShapeのメソッドをザーっと見た限りでは、WORDの図形(Shape)は別物らしい。
それでも、MS-WORD用にアレンジしてみると・・・

ActiveDocument.Shapes.AddShape(msoShapeRectangle, 404.25, 81, 72.75, 59.25).Select

ちゃんと貼れる。
同様にEXCELで図形の操作をマクロで記録し、WORD用に手直してみた結果。

Sub 四角形を貼ってみる()
'
Application.ActiveDocument.Shapes.AddShape(msoShapeRectangle, 273, 55.5, 88.5, 76.5).Select
Dim id As Long
id = ActiveDocument.Shapes.Count
Dim shape As shape
Set shape = ActiveDocument.Shapes(id)
'テキスト編集(TextFrame.ContainingRange.Text)
shape.TextFrame.ContainingRange.Text = "あいうえお"
'枠色(Line.ForeColor etc)
'shape.Line.ForeColor.ObjectThemeColor = wdThemeColorAccent5
shape.Line.ForeColor.RGB = RGB(255, 0, 0)
shape.Line.DashStyle = msoLineDash
'背景色(Fill.ForeColor)
'shape.Fill.ForeColor.ObjectThemeColor = wdThemeColorAccent6
shape.Fill.ForeColor.RGB = RGB(64, 128, 0)
'
End Sub

なお、MS-WORDの操作マクロは「共通設定」に記録されてしまうので、ゴミは消しておくこと。
一気に図形の属性(色など)を変えるには

複数選択Selection.ShapeRange(マウスでもマクロでもOK)した後に
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(200, 32, 32)
Selection.ShapeRange.Line.ForeColor.RGB = RGB(64, 200, 0)

とすると良さそうだ。
いづれにしても、日頃からVBAで訓練(遊ぶ)しないと、
ちょっと操作をマクロ記録して手直してして、大量に・・・は、無理っぽい。
だが
ここまでやるなら、
あのプリミティブすぎる iText クラスライブラリィを駆使しガリガリとJavaコードでPDFを作る方が手っ取り早く思えてしまう。
否。

AddShape("Rectangle", mouse.x, mouse.y, default, default)
SetForeColor()
SetBackColor()
Layout()

まで書くのであれば、
現場で作るお手軽フォーム・エディタの「ツールボックスから図形を貼る」コマンドのソース
とほぼ同じ分量になってしまう。


  • カテゴリー:
  • WORD


top