このマクロは、ワード文書中のすべてのオブジェクトを一括選択するためのマクロ(Word VBA)です
オブジェクトをマウスで1つ1つ選択するのはとても大変です。
特に、ワード文書のページ数が多い場合は大変です。
そんなときに、このマクロが役立ちます
\Word VBAを学べる貴重な一冊 /
マクロの概要
この記事のマクロを実行すると、ページ数にかかわらず、以下のイラストのように、Word文書中のすべてのオブジェクトが一括選択されます。
これが基本挙動です。
一方で、オブジェクトの種類によっては、手動でもマクロでも全選択できないものがあります。
この点について、最初に説明します。
後述の理由から、マクロは3種類用意しました。
ワード文書中のオブジェクトについて
まず、ワード文書中のオブジェクトの種類について説明します。
この説明のために、最初に、ワード文書中のオブジェクトの一覧を出す方法について説明します。
オブジェクトの一覧を見る方法
以下のステップで、ワード文書中のオブジェクトをページ単位で一覧表示できます。
step
1「ホーム」タブを選択します
step
2「選択」→「オブジェクトの選択と表示」を選択します
「オブジェクトの選択と表示」を選択すると、以下のように、そのページに含まれているオブジェクトの一覧がワード文書の右側に表示されます。
この方法で右側に表示されるオブジェクトは、そのページに含まれているもののみです。
そのため、次のページのオブジェクトの一覧をワード画面右側に表示させるには、次のページに移動後に、どこでもいいのでページの中で左クリックする必要があります。
オブジェクトの種類
すこし話が逸れましたが、オブジェクトの種類に話を戻します。
上のイラストのように、ワード画面右側のオブジェクト一覧で、目のマーク(緑の線で囲った部分)があるものは、浮動オブジェクト(自由に動かせる)です。
目のマークがないものは、行内オブジェクト(行の中から出せない)です。
これら2種類のオブジェクトのうち、複数のオブジェクトを同時に選択できるのは、浮動オブジェクトだけです。
行内オブジェクトは、マクロでも手動でも、そのままでは複数を同時選択することができません。
まとめると、以下の表のようになります。
オブジェクトの種類 | 動かせるか | 複数同時選択できるか |
---|---|---|
浮動オブジェクト (Shape) | 〇 | 〇 |
行内オブジェクト (InlineShape) | × | × |
3種類のマクロの説明
上記の性質から、通常の方法でマクロを実行しても、選択されるのは浮動オブジェクトだけです。
そのため、行内オブジェクトを無理やりにでも選択したい場合は、浮動オブジェクトに変換後に選択するしかありません。
変換せずに、複数の行内オブジェクトを同時に選択できないんですか?
私は他の方法を知りません... おそらく、ワードの仕様です
以上のことを加味して、以下の3種類のマクロを用意しました。
マクロ番号 | マクロ名 | 行内オブジェクトから 浮動オブジェクトへの変換 | 選択されるオブジェクト |
---|---|---|---|
① | SelectOnlyShapeObjects | なし | 浮動オブジェクトのみ |
② | ConvertInlineShapesToShapesAndSelectOnlyNewShapes | あり | 行内オブジェクトから新たに変換された浮動オブジェクトのみ |
③ | ConvertInlineShapesToShapesAndSelectNewShapesAndOldShapes | あり | ・最初からある浮動オブジェクト ・行内オブジェクトから新たに変換された浮動オブジェクト (結果的に、文書中のすべてのオブジェクトが選択されます) |
マクロ②と③では、変換を行うため、レイアウトが崩れるリスクがあります。
特に、マクロ②と③では、この変換でファイルに変更が加わりますので、あらかじめバックアップをとるようにしてください。
各マクロを実行した場合の結果は、以下のとおりです。
マクロ①の実行結果
マクロ①を実行すると、以下のように浮動オブジェクトのみが選択されます。
マクロ②の実行結果
マクロ②を実行すると、以下のように、すべての行内オブジェクトが浮動オブジェクトに変換され、新たにできた浮動オブジェクトのみが選択されます。
マクロ①の実行結果と比較すると、新たに誕生した浮動オブジェクトのみが選択されているものの、レイアウトが崩れていることが分かります。
マクロ③の実行結果
マクロ③を実行すると、以下のように、すべての行内オブジェクトが浮動オブジェクトに変換され、新たにできた浮動オブジェクトも、最初から存在した浮動オブジェクトも、すべて選択されます。
マクロの用途
このマクロって何に使えるんですか?
例えば、以下のようなことができますよ
このマクロを実行すると、ワード文書中のオブジェクトがすべて選択されるため、
すべてのオブジェクトを一度に削除できます
すべてのオブジェクトをコピーまたは切り取りして、別のファイル(ワード、エクセル、パワーポイントなど)に一度に貼り付けることができます
すべてのオブジェクトに特定の書式を一度に適用できます
補足説明
マクロ②または③を実行した場合、ワード文書によっては以下のエラーメッセージがでる場合があります。
この場合、OKボタンを押してください(マクロの処理は続行されます)。
このメッセージがでた場合、そのワード文書には、浮動オブジェクトに変換できない行内オブジェクトが含まれています。
変換できなかった行内オブジェクトの数と、浮動オブジェクトに変換できた行内オブジェクトの数は、処理終了後に表示されるメッセージで確認してください。
変換できなかった行内オブジェクトは選択されません。
マクロの注意点
1点のみ、注意点があります。
このマクロは、「描画オブジェクトとテキストボックスを画面に表示する」にチェックが入った状態で使用してください。
(通常は、最初からチェックが入っているはずです)
チェックが入っていないと、浮動オブジェクトが見えない状態になります(見えないだけで存在はしています。チェックが入っていても行内オブジェクトは見えます)。
チェックが入っていないと、仮にマクロ①を実行しても、浮動オブジェクトが見えていないため、選択されているのかどうか目視できません。
チェックが入っていない状態でマクロ②またはマクロ③を実行した場合は、見えている行内オブジェクトが浮動オブジェクトに変換されて見えなくなるため、あたかも消えててしまったような状態になりますので注意してください(実際は浮動オブジェクトとして存在しています)。
「描画オブジェクトとテキストボックスを画面に表示する」のチェックは、以下の手順で確認できます。
step
1ワードファイルを開きます
step
2ワード画面左上の「ファイル」→「オプション」を選択します
step
3「詳細設定」→「構成内容の表示」を確認します
「描画オブジェクトとテキストボックスを画面に表示する」にチェックが入っているかを確認してください。
チェックが入っていない場合は、チェックを入れてから、マクロを使用してください。
マクロの使用方法
1.こちらの記事に記載したステップ①の手順1~6までを実施した後、ステップ①の手順7で、この記事の最後にあるコード(マクロの①~③のうちの1つ)を標準モジュールのModule1にコピペします。
2.こちらの記事に記載したステップ①の8から22までを行います
(ステップ①の11では、ご自身が選ばれたマクロに対応する名前(以下の3つのいずれか1つ)を選択してから、追加ボタンを押してください)
- マクロ① Project.Module1.SelectOnlyShapeObjects
- マクロ② Project.Module1.ConvertInlineShapesToShapesAndSelectOnlyNewShapes
- マクロ③ Project.Module1.ConvertInlineShapesToShapesAndSelectNewShapesAndOldShapes
(ステップ①の13では、お好きなアイコンを選んでください)
(ステップ①の20での保存名は何でもかまいません)
3.こちらの記事に記載したステップ②を行います
ステップ②を行うことで、このマクロをどのワード文書からも呼び出せるようになります。
(ご自身で作られたワードファイルを開いた際に、ご自身が選ばれたマクロアイコンがワード文書の左上に表示されるようになります)
(このマクロは、選択したいオブジェクトを含むワード文書を開き、そこからマクロを呼び出すことが基本の使用方法になるため、ステップ②を行う方が便利です)
マクロのコード
マクロ①のコード
現在の公開バージョン V01L03
Sub SelectOnlyShapeObjects()
'V01L03
Dim doc As Document
Dim shp As Shape
Dim objRange As Range
Dim shapeFound As Boolean
Dim userResponse As VbMsgBoxResult
Dim ShapeCount As Long
' ユーザーに処理を開始するかどうかを確認
userResponse = MsgBox("すべての浮動オブジェクトを選択します" & vbCrLf & vbCrLf & "処理を開始してよろしいですか?", vbYesNo + vbQuestion + vbDefaultButton2, "確認")
If userResponse = vbNo Then
Exit Sub
End If
Set doc = ActiveDocument
ShapeCount = doc.Shapes.Count
shapeFound = False
' ページごとに浮動オブジェクトをカウントし、選択
For Each objRange In doc.StoryRanges
For Each shp In objRange.ShapeRange
shp.Select Replace:=False
shapeFound = True
Next shp
Next objRange
If shapeFound Then
MsgBox "すべての浮動オブジェクト(" & ShapeCount & "個)が選択されました。"
Else
MsgBox "浮動オブジェクトは存在しません。"
End If
Set shp = Nothing
Set objRange = Nothing
Set doc = Nothing
End Sub
マクロ②のコード
現在の公開バージョン V01L05
Sub ConvertInlineShapesToShapesAndSelectOnlyNewShapes()
'V01L05
Dim doc As Document
Dim inlineShp As InlineShape
Dim shp As Shape
Dim newShapes As Collection
Dim userResponse As VbMsgBoxResult
Dim conversionErrors As Long
Dim inlineShapeCount As Long
Set doc = ActiveDocument
Set newShapes = New Collection
inlineShapeCount = doc.InlineShapes.Count
' ユーザーに処理を開始するかどうかを確認
userResponse = MsgBox("すべての行内オブジェクトを浮動オブジェクトに変換後に選択します" _
& vbCrLf & "(変換に伴ってレイアウトが崩れる可能性があります)" _
& vbCrLf & vbCrLf & "オブジェクト選択処理を開始してよろしいですか?", vbYesNo + vbQuestion + vbDefaultButton2, "確認")
If userResponse = vbNo Then
Exit Sub
End If
' すべての行内オブジェクトを浮動オブジェクトに変換
On Error Resume Next
conversionErrors = 0
For Each inlineShp In doc.InlineShapes
inlineShp.Select
Set shp = inlineShp.ConvertToShape
If Err.Number <> 0 Then
conversionErrors = conversionErrors + 1
Err.Clear
End If
If Not shp Is Nothing Then
newShapes.Add shp
End If
Next inlineShp
On Error GoTo 0
' 新しく作成された浮動オブジェクトを選択
If newShapes.Count > 0 Then
Dim i As Integer
For i = 1 To newShapes.Count
If i = 1 Then
newShapes(i).Select
Else
newShapes(i).Select Replace:=False
End If
Next i
If conversionErrors > 0 Then
MsgBox inlineShapeCount & "個中" & conversionErrors & "個の行内オブジェクトの変換に失敗しました。" & vbCrLf _
& "変換に成功した新たな浮動オブジェクト(" & inlineShapeCount - conversionErrors & "個)のみが選択されています", vbExclamation
Else
MsgBox "行内オブジェクトから変換された新たな浮動オブジェクト(" & inlineShapeCount & "個)が選択されました。"
End If
Else
If conversionErrors > 0 Then
MsgBox "すべての行内オブジェクト(" & conversionErrors & "個)の変換に失敗しました", vbExclamation
Else
MsgBox "変換可能な行内オブジェクトは存在しませんでした。"
End If
End If
' オブジェクトの後処理
Set shp = Nothing
Set inlineShp = Nothing
Set newShapes = Nothing
Set doc = Nothing
End Sub
マクロ③のコード
現在の公開バージョン V01L05
Sub ConvertInlineShapesToShapesAndSelectNewShapesAndOldShapes()
'V01L05
Dim inlineShp As InlineShape
Dim shp As Shape
Dim doc As Document
Dim i As Integer
Dim userResponse As VbMsgBoxResult
Dim conversionErrors As Long
Dim ShapeCount As Long
Dim inlineShapeCount As Long
Set doc = ActiveDocument
ShapeCount = doc.Shapes.Count
inlineShapeCount = doc.InlineShapes.Count
' ユーザーに処理を開始するかどうかを確認
userResponse = MsgBox("すべてのオブジェクトを選択します" & vbCrLf & "(行内オブジェクトは浮動オブジェクトに変換後に選択されます)" _
& vbCrLf & "(変換に伴ってレイアウトが崩れる可能性があります)" & vbCrLf & vbCrLf & _
"オブジェクト選択処理を開始してよろしいですか?", vbYesNo + vbQuestion + vbDefaultButton2, "確認")
If userResponse = vbNo Then
Exit Sub
End If
' すべての行内オブジェクトを浮動オブジェクトに変換
On Error Resume Next
conversionErrors = 0
For Each inlineShp In doc.InlineShapes
inlineShp.Select
Set shp = inlineShp.ConvertToShape
If Err.Number <> 0 Then
conversionErrors = conversionErrors + 1 ' エラーのカウントを増やす
Err.Clear
End If
Next inlineShp
On Error GoTo 0
' すべての浮動オブジェクトを選択
If doc.Shapes.Count > 0 Then
' 最初のシェイプを選択
doc.Shapes(1).Select
' その他の浮動オブジェクトを選択に追加
For i = 2 To doc.Shapes.Count
doc.Shapes(i).Select Replace:=False
Next i
' エラーがあった場合の通知
If conversionErrors > 0 Then
MsgBox inlineShapeCount & "個中" & conversionErrors & "個の行内オブジェクトの変換に失敗しました。" & vbCrLf _
& "最初から存在した浮動オブジェクト(" & ShapeCount & "個)と変換された新たな浮動オブジェクト(" _
& inlineShapeCount - conversionErrors & "個)のみが選択されています", vbExclamation
Else
MsgBox "すべてのオブジェクト(" & ShapeCount + inlineShapeCount & "個)が選択されました。"
End If
Else
' エラーがあった場合の通知
If conversionErrors > 0 Then
MsgBox inlineShapeCount & "個すべての行内オブジェクトの変換に失敗しました。" & vbCrLf _
& "オブジェクトを選択できませんでした" & vbCrLf _
& "(浮動オブジェクトは最初から存在していません)", vbExclamation
Else
MsgBox "オブジェクトは存在しません。"
End If
End If
' オブジェクトの解放
Set inlineShp = Nothing
Set shp = Nothing
Set doc = Nothing
End Sub
よろしければ、他のマクロも是非見て行ってください!