このページに含まれるプログラム、ファイル等については、
Wordでは自動更新するテキストとしてフィールドを設定することが出来ます。例えば、総ページ数や現在の時刻を常に更新した形でテキストに記述することが出来ます。
ただ、「文章作成日」は書いてるときには更新されるほうが便利ですが、最終稿を仕上げた後に印刷するたびに日付が変わっていくのは困りますし、総ページ数は開くたびになぜか「1」に戻ってしまう不都合が生じたりします。というわけで、書き込み終了後のフィールドを通常のテキストに変換するプチプログラムです。
Public Sub FieldUnlink()
Selection.Fields.Unlink
End Sub
Private Sub AddFieldAsConst(Field As String)
With Selection
.Fields.Add(Range:=.Range, Type:=wdFieldEmpty, Text:=Field).Unlink
End With
End Sub
Public Sub AddNumPages()
AddFieldAsConst "NUMPAGES "
End Sub
Public Sub AddTime()
AddFieldAsConst "TIME \@ ""AMPMh時m分s秒"" "
End Sub
Private Sub AddFieldAsConst(Field As String)
Dim NewField As Field
Set NewField = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty, Text:=Field)
NewField.Unlink
End Sub
ワードで文章の中で何箇所かを行き来したい場合があります。そんな時役に立つのが次のプログラムです。RecordRangeStackで記録した場所にSeekRangeStackで飛んで、いらなくなった記録位置はDeleteRangeStackで消去するという手順になると思います。ボタンで登録すると便利でしょう。
Option Explicit
Option Base 1
Private Const MAX As Integer = 255 '記録できる最大量
Private RangeStack(MAX) As Range '記録のための配列
Private seekNo As Integer '直前にジャンプした記録番号
Private num As Integer '記録数
'位置の記録。最終の記録番号の後に追加されます。
Public Sub RecordRangeStack()
If num >= MAX Then '記録数確認
MsgBox "記録することが出来ません。", vbOKOnly, "記録容量オーバー"
Else
num = num + 1 '記録数の増加
seekNo = 0 'ジャンプ位置の初期化。次回、ジャンプするときは
'直前に記録したところにジャンプします。
Set RangeStack(num) = Selection.Range '位置の記録
End If
End Sub
'位置記録の消去。直前にジャンプした記録番号を消去し、
'番号をつめます。
Public Sub DeleteRangeStack()
Dim i As Integer
If num <= 0 Then '記録の有無のチェック
MsgBox "記録がありません。", vbOKOnly, "記録なし"
Else
If seekNo < num Then
'直前にジャンプした番号に+1の番号に記録した位置をコピーします。
'これを最後の記録-1まですることによって、記録が1つ減ることになります。
For i = seekNo To num - 1
Set RangeStack(i) = RangeStack(i + 1)
Next i
End If
Set RangeStack(num) = Nothing '最終記録位置の消去
num = num - 1 '記録数の減少
End If
End Sub
'位置記録へのジャンプ。新しい記録から徐々に古い記録までジャンプします。
Public Sub SeekRangeStack()
If num <= 0 Then '記録の有無のチェック
MsgBox "記録がありません。", vbOKOnly, "記録なし"
Else
seekNo = seekNo - 1 '一つ古い記録へ移動
If seekNo < 1 Then seekNo = num '1より小さい(1番目へのジャンプの後)なら、
'最新記録位置へ移動
RangeStack(seekNo).Select '記録位置の選択
End If
End Sub
決まった単語を入力するのにその単語をマクロを使って貼り付けている人はいますか?普通の入力でもそうなのですが、その単語が下付きとか上付きとかで終わる場合は、次の入力文字がその書式の影響を受けてしまいます。また、せっかくマクロで作って入力したのに選択範囲の書式を受け継いでしまい、希望と異なるフォント(下線等も含めて)で入力されてしまうことがあると思います。そこで、貼り付け前のフォントの書式に従わず、貼り付け後の入力を貼り付け前の書式に従わせるマクロと言うのを作りました。
Sub CO2()
Const Text As String = "CO2"
Const Dummy As String = "e"
Const LenDummy As Integer = 1
Dim LenText As Long, r As Range
LenText = Len(Text)
Application.ScreenUpdating = False
With Selection
.TypeText Text & Dummy
.MoveLeft wdCharacter, LenText + LenDummy, wdExtend
ActiveDocument.Range(.Start, .End - LenDummy).Font.Reset '元の書式を生かす場合は不要
.Characters(3).Font.Subscript = True
.Collapse wdCollapseEnd
.TypeBackspace
End With
Application.ScreenUpdating = True
End Sub
今回は、VBAプログラムを駆使すればワード(エクセルでもそうですが)の機能を知らなくても用を足す事は出来る。でも、知っていればずっと楽。という話(実話)です。
「変更点に蛍光ペンで色を付けているので、チェックしてください。」と言う何十ページにもおよぶファイルが届きました。おいおい、と思いながら、ページスクロールをするのですが、全部チェックできたのかどうかわからない。で、一つずつチェックするプログラムを作りました。
Sub ColorCheck()
Dim bgc As Word.WdColorIndex
Application.ScreenUpdating = False
Selection.Collapse wdCollapseStart
Do While Selection.Range.HighlightColorIndex = wdNoHighlight
Selection.MoveRight wdCharacter, 1, wdMove
Loop
Application.ScreenUpdating = True
End Sub
Sub ColorCheck2()
Dim check As Boolean, col As WdColorIndex
Application.ScreenUpdating = False
Selection.Collapse wdCollapseStart
Selection.MoveRight wdCharacter, 1, wdExtend
col = Selection.Range.HighlightColorIndex
If col <> wdNoHighlight Then '既に色がついている部分ならとばす。
Selection.EndKey wdStory, wdExtend
SubColorCheck Selection.Range, col
End If
Selection.EndKey wdStory, wdExtend
check = SubColorCheck(Selection.Range)
Selection.Collapse wdCollapseStart
Application.ScreenUpdating = True
If check = False Then MsgBox "見つかりませんでした。" '見つからなかったときの処理
End Sub
Private Function SubColorCheck(r As Range, Optional DefaultColor As WdColorIndex = wdNoHighlight) As Boolean
Const MultipleColor As Long = 9999999
Dim Center As Long
Dim col As WdColorIndex
col = r.HighlightColorIndex
If col = MultipleColor Then '色付き/無しの部分を両方含む場合
With r
Center = Round((.Start + .End) / 2) '範囲を2つに分けてさらに検索を実施
If SubColorCheck(ActiveDocument.Range(.Start, Center), DefaultColor) Then
SubColorCheck = True '前半にあった場合
Else '前半になかった場合は後半についても処理を行う。
SubColorCheck = SubColorCheck(ActiveDocument.Range(Center, .End), DefaultColor)
End If
End With
Else
If col = DefaultColor Then '色無し(指定色)の部分のみ含む場合
SubColorCheck = False
Else '色付き(指定色以外)の部分のみ含む場合
r.Select
SubColorCheck = True '見つかったので、全ての処理が終了される。
End If
End If
End Function
Sub ColorCheck3()
With Selection.Find
.ClearFormatting
.Highlight = True
.Text = ""
.Forward = True
.Wrap = wdFindAsk
.Format = True
End With
Selection.Find.Execute
End Sub
必要に迫られて、VBAで行数を数えようと思いましたが、適当なプロパティが見つかりませんでした。例によって無理やりVBAで勘定しています。もっといい方法を知っている方は教えてください。
ちなみに普通に知ろうと思えば、ファイル(F)→プロパティ(I)の詳細情報で知ることが出来ます。(最終行が0文字(リターンコードのみ)の場合はカウントされません。)
Function LineCount() As Long
Const MaxLong As Long = 2147483647
Dim now As Range
Dim l As Long
Set now = Selection.Range
Application.ScreenUpdating = False
ActiveDocument.Range(0, 0).Select
l = Selection.MoveDown(wdLine, MaxLong, wdMove)
now.Select
Application.ScreenUpdating = True
LineCount = l + 1
End Function
Sub 行数()
MsgBox LineCount & " 行です。"
End Sub
参加者全員の報告書を一度にコピーしたりする場合に、2面印刷や両面印刷がしたいなぁとか全部いっぺんに印刷処理したくなる場合がありますよね。印刷処理に限らず、読み込んだ文章をすべてつなげて保存したいことがあると思います。そんなときに手作業でやっていたことを自動で行うプログラムです。
Sub MergeFile(Optional dummy As Integer = 0)
Dim d As Document, nDoc As Document
Dim s As Range
Set nDoc = Documents.Add
For Each d In Documents
If Not d Is nDoc Then
Set s = nDoc.Content
s.Collapse Direction:=wdCollapseEnd
s.InsertBreak wdSectionBreakNextPage
d.Range.Copy
Set s = nDoc.Content
s.Collapse Direction:=wdCollapseEnd
s.Paste
End If
Next d
Selection.Delete
End Sub
無断転載を禁じます。