【エクセル】文字を〇で囲む操作を自動化するマクロを紹介~コピペして使えるサンプルマクロを掲載~

疑問がある人
こんな疑問をお答えします。
この記事では、VBAを使って文字に図形○をつける方法を詳しく解説しています。
文字に○をつけるVBAを使えば、図形の挿入が必要な書類作成の効率をアップさせることができます。
- 図形挿入操作の省略
- 図形編集操作の省略
- 書類編集ミスの激減

ひらめく人
エクセルで図形の挿入、編集作業が多い方におすすめです。
目次
文字を〇で囲むマクロとは
文字を○で囲むマクロとは、図形(楕円)を挿入し文字に合わせて位置、大きさを自動調整するものです。
図形の挿入にはAddShapeメソッドを使用します。
AddShapeメソッドの基本構造
Shapesオブジェクト . AddShape ( Type , Left , Top , Width , Height )
Type ・・・図形の種類
Left ・・・挿入位置
Top ・・・挿入位置
Width ・・・図形の大きさ
Height・・・図形の大きさ
AddShapeメソッドを使って「文字を〇で囲むVBA」を作っています。この記事の後半で紹介している3つのサンプル事例を見比べることでAddShapeメソッドの理解を深めることができるはずです。是非参考にしてみてください。

上を目指す人
一度マクロを設定すると半永久的に使えるので図形の挿入が必要なエクセルファイルへの設定がおすすめです。
よく仕事で使われる事例を元に「文字を○で囲むVBA」の導入方法をご紹介していきます。
サンプル事例① 指定するセルに図形〇を挿入するVBA
指定するセルに図形〇を挿入するVBAの導入方法を紹介します。
「A5セルとE5セルに図形〇を挿入する」というプログラムを作成していきます。
1.VBAを起動
2.標準モジュールを作成
3.ModuleにサンプルVBAを記入
4.セルを指定して図形〇を挿入するサンプルVBA
Sub セルを指定()
Dim Ash As Worksheet
Set Ash = ThisWorkbook.Worksheets("セルを指定")
Dim zukei As Shape
For Each zukei In Ash.Shapes
On Error Resume Next
If zukei.TopLeftCell.Address >= Cells(1, 1).Address Then
zukei.Delete
End If
If Err <> 0 Then
Err.Clear
End If
Next
With Ash.Shapes.AddShape(msoShapeOval, Ash.Cells(5, 1).Left, Ash.Cells(5, 1).Top, 15, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
With Ash.Shapes.AddShape(msoShapeOval, Ash.Cells(5, 5).Left, Ash.Cells(5, 5).Top, 15, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
End Sub
5.VBAを実行
6.結果
図形〇で囲みたい文字の場所があらかじめ決まっているときに便利なVBAです。

上を目指す人
下記のサイトでは、指定するセルに図形〇を挿入するVBAが設定されたエクセルファイルをダウンロードしてお使いいただくことができます。図形の編集作業が多いという方は是非参考にしてみてください。
<<指定するセルに図形〇を挿入するVBAが設定されたエクセルファイルをダウンロードはこちら
サンプル事例② 指定する文字を検索し図形〇を挿入するVBA
指定する文字を検索し図形〇を挿入するVBAの導入方法を紹介します。
「設定シートに記入した文字と図形挿入シートに記入した文字が一致するとき図形〇を挿入する」というプログラムを作成していきます。
1.VBAを起動
2.標準モジュールを作成
3.ModuleにサンプルVBAを記入
4.指定する文字を検索し図形〇を挿入するサンプルVBA
Sub 〇で囲む()
Dim Ash As Worksheet
Dim Bsh As Worksheet
Set Ash = ThisWorkbook.Worksheets("設定")
Set Bsh = ThisWorkbook.Worksheets("図形挿入")
Dim zukeiA As Shape
For Each zukeiA In Bsh.Shapes
On Error Resume Next
If zukeiA.TopLeftCell.Address >= Bsh.Cells(1, 1).Address Then
zukeiA.Delete
End If
If Err <> 0 Then
Err.Clear
End If
Next
Dim ARange As Range
Dim keyWord As String
Dim zukeiH As Range
gyoa = Ash.Cells(Rows.Count, 2).End(xlUp).Row
For i = 4 To gyoa
keyWord = Ash.Cells(i, 2)
For j = 1 To 10
For k = 1 To 10
Set ARange = Range(Cells(j, k), Cells(j, k))
Set zukeiH = ARange.Find(keyWord, LookAt:=xlWhole)
If zukeiH = keyWord And Len(keyWord) = 1 Then
With Bsh.Shapes.AddShape(msoShapeOval, zukeiH.Left, zukeiH.Top, 15, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf zukeiH = keyWord And Len(keyWord) = 2 Then
With Bsh.Shapes.AddShape(msoShapeOval, zukeiH.Left, zukeiH.Top, 30, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf zukeiH = keyWord And Len(keyWord) = 3 Then
With Bsh.Shapes.AddShape(msoShapeOval, zukeiH.Left, zukeiH.Top, 40, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf zukeiH = keyWord And Len(keyWord) = 4 Then
With Bsh.Shapes.AddShape(msoShapeOval, zukeiH.Left, zukeiH.Top, 50, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf zukeiH = keyWord And Len(keyWord) = 5 Then
With Bsh.Shapes.AddShape(msoShapeOval, zukeiH.Left, zukeiH.Top, 60, 15)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
Else
End If
Next
Next
Next
End Sub
5.VBAを実行
6.結果
サンプルVBAには関数IFを関数LENを使って文字数で図形〇の大きさを変更するVBAが設定されています。上記の結果を見てわかるように「有」のときと「有効期限切」のときの図形〇の大きさを調整しています。

ひらめく人
下記のサイトでは、文字を〇で囲むVBAが設定されたエクセルファイルをダウンロードしてお使いいただくことができます。図形〇で囲みたい文字の場所があらかじめ決まっているときに便利なVBAです。
サンプル事例③ 契約書内の文字を〇で囲むVBA
契約書内の文字を〇で囲むVBAの導入方法を紹介します。
「設定シートに記入した内容から、契約書作成に必要な図形〇を記入する」というプログラムを作成していきます。
指定する文字を検索し図形〇を挿入するVBAの導入方法を紹介します。
「設定シートに記入した文字と図形挿入シートに記入した文字が一致するとき図形〇を挿入する」というプログラムを作成していきます。
1.契約書の様式を設定
契約書の様式を設定します。どのセルにテキストを転記させるのか、どの位置に図形を挿入させるのか最初に決定しなければなりません。

ひらめく人
2.設定シートの様式を設定
一覧表の情報を元にテキストを転記させたり、図形の挿入を行います。
3.VBAを起動
2.標準モジュールを作成
3.ModuleにサンプルVBAを記入
4.契約書を作成するサンプルVBA
Sub 工事注文書()
''''''''''''''''''''''''''Sheetの設定''''''''''''''''''''''''''
Dim Ash As Worksheet
Dim Bsh As Worksheet
Set Ash = ThisWorkbook.Worksheets("一覧表")
Set Bsh = ThisWorkbook.Worksheets("工事注文書")
''''''''''''''''''''''ユーザーフォームで入力した値を変数iで取得''''''''''''''''''''''''''
i = UserForm1.TextBox1.Value
''''''''''''''''''''''''''Sheet内の図形を削除''''''''''''''''''''''''''
'前回表示させた図形をリセットさせなければ重なって増え続けてしまう'
Dim zukei As Shape
For Each zukei In Bsh.Shapes
On Error Resume Next
If zukei.TopLeftCell.Address >= Bsh.Cells(1, 1).Address Then
zukei.Delete
End If
If Err <> 0 Then
Err.Clear
End If
Next
''''''''''''''''''''''''''一覧表から工事契約書へ値を転記する''''''''''''''''''''''''''
'''''工事名を転記'''''
Bsh.Range("H6") = Ash.Cells(i + 2, 2)
Bsh.Range("H6").HorizontalAlignment = xlLeft
'''''工事場所を転記'''''
Bsh.Range("H8") = Ash.Cells(i + 2, 3)
Bsh.Range("H8").HorizontalAlignment = xlLeft
'''''工期(着手)を転記'''''
Bsh.Range("H10") = Ash.Cells(i + 2, 4)
Bsh.Range("H10").HorizontalAlignment = xlCenter
Bsh.Range("H10").NumberFormatLocal = "ggge年m月d日"
'''''工期(竣功)を転記'''''
Bsh.Range("P10") = Ash.Cells(i + 2, 5)
Bsh.Range("P10").HorizontalAlignment = xlCenter
Bsh.Range("P10").NumberFormatLocal = "ggge年m月d日"
'''''請負金額を転記'''''
Bsh.Range("L12") = Ash.Cells(i + 2, 6)
Bsh.Range("L12").HorizontalAlignment = xlCenter
Bsh.Range("L12").NumberFormatLocal = "#,###"
'''''消費税を転記'''''
Bsh.Range("R14") = Bsh.Range("L12").Value * 0.1
Bsh.Range("R14").HorizontalAlignment = xlCenter
Bsh.Range("R14").NumberFormatLocal = "#,###"
'''''支給材料の有無(図形○を表示)'''''
If Ash.Cells(i + 2, 11) = "有" Then
With Bsh.Shapes.AddShape(msoShapeOval, 368, 358, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf Ash.Cells(i + 2, 11) = "無" Then
With Bsh.Shapes.AddShape(msoShapeOval, 402, 358, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
Else
End If
'''''貸与品の有無(図形○を表示)'''''
If Ash.Cells(i + 2, 12) = "有" Then
With Bsh.Shapes.AddShape(msoShapeOval, 368, 378, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf Ash.Cells(i + 2, 12) = "無" Then
With Bsh.Shapes.AddShape(msoShapeOval, 402, 378, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
Else
End If
'''''発生品の有無(図形○を表示)'''''
If Ash.Cells(i + 2, 13) = "有" Then
With Bsh.Shapes.AddShape(msoShapeOval, 368, 396, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
ElseIf Ash.Cells(i + 2, 13) = "無" Then
With Bsh.Shapes.AddShape(msoShapeOval, 402, 396, 14, 14)
.Fill.Visible = msoFalse
.Line.Weight = 1
.Line.ForeColor.RGB = vbBlock
End With
Else
End If
'''''工事数量調書の有無(図形線を表示)'''''
If Ash.Cells(i + 2, 14) = "有" Then
With Bsh.Shapes.AddLine(Bsh.Range("I24").Left, Bsh.Range("I24").Top + 6, Bsh.Range("P24").Left, Bsh.Range("P24").Top + 6).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
With Bsh.Shapes.AddLine(Bsh.Range("I24").Left, Bsh.Range("I24").Top + 12, Bsh.Range("P24").Left, Bsh.Range("P24").Top + 12).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
Else
End If
'''''示方書等の有無(図形線を表示)'''''
If Ash.Cells(i + 2, 15) = "有" Then
With Bsh.Shapes.AddLine(Bsh.Range("I25").Left, Bsh.Range("I25").Top + 6, Bsh.Range("P25").Left, Bsh.Range("P25").Top + 6).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
With Bsh.Shapes.AddLine(Bsh.Range("I25").Left, Bsh.Range("I25").Top + 12, Bsh.Range("P25").Left, Bsh.Range("P25").Top + 12).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
Else
End If
'''''工事数量調書の有無(図形線を表示)'''''
If Ash.Cells(i + 2, 16) = "有" Then
With Bsh.Shapes.AddLine(Bsh.Range("I26").Left, Bsh.Range("I26").Top + 6, Bsh.Range("P26").Left, Bsh.Range("P26").Top + 6).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
With Bsh.Shapes.AddLine(Bsh.Range("I26").Left, Bsh.Range("I26").Top + 12, Bsh.Range("P26").Left, Bsh.Range("P26").Top + 12).Line
.Weight = 1
.ForeColor.RGB = vbBlock
End With
Else
End If
'''''発注者住所を転記'''''
Bsh.Range("J33") = Ash.Cells(i + 2, 8)
Bsh.Range("J33").HorizontalAlignment = xlLeft
'''''発注者氏名を転記'''''
Bsh.Range("J35") = Ash.Cells(i + 2, 7)
Bsh.Range("J35").IndentLevel = 2
'''''受注者住所を転記'''''
Bsh.Range("J37") = Ash.Cells(i + 2, 10)
Bsh.Range("J37").HorizontalAlignment = xlLeft
'''''受注者氏名を転記'''''
Bsh.Range("J39") = Ash.Cells(i + 2, 9)
Bsh.Range("J39").IndentLevel = 2
End Sub
5.ユーザーフォームの作成
6.ユーザーフォームオブジェクトの作成
7.ユーザーフォームコードの作成
8.ユーザーフォームに記入するサンプルVBA
Private Sub CommandButton1_Click()
Call 工事注文書
End Sub
「Callを使って、標準モジュールに記入したVBAを呼び出し実行する」という意味です。ユーザーフォームにVBAを直接書き込んでしまうと後々編集するときにやりづらくなる!というデメリットがあります。

ひらめく人
9.VBAを実行
ユーザーフォームに「一覧表の工事番号」を入力し実行ボタンを押すだけで、テキストや図形をまとめて転記することができます。
決められた様式の資料を作成するような業務におすすめのVBAです。
契約書を作成するVBAには、別シートに情報を転記するVBAや図形を操作するVBAが使われています。下記の記事ではそれぞれのVBAの使い方、導入の方法などが詳しく紹介されています。
自分の業務に合った契約書を作成するVBAを作りたい!という方は是非参考にしてみてください。
文字を〇で囲む操作を自動化しエクセル作業の効率アップ
文字を○で囲む操作は仕事でよく使われます。
「有」「無」を○で囲む
「合格」「不合格」を○で囲む
「はい」「いいえ」を○で囲む
○で囲む項目が多くなると自動化しなければ手間と時間ばかりかかってしまいます。

疲れ果てた人
文字を○で囲むマクロを導入すると、○をつける項目がどれだけ増えても一瞬で処理することができます。
マクロで図形の表示位置、大きさを設定してしまえば○がズレる心配もないので、さらなる作業効率アップにつながります。
VBAの勉強をはじめる方におすすめのプログラミングスクール
この記事で紹介している「文字を〇で囲むVBA」のように上手にVBAを使えばエクセル業務の効率を格段にアップさせることができます。

上を目指す人
エクセルを使ったデスクワークが多いという方におすすめのプログラミングがVBAです。VBAのプログラミングスキルを身に着けることで、今まで何時間もかかかっていた作業をほんの数分で処理することができるようになります。
VBAを基本から学びたい!という方におすすめなのが、オンラインプログラミング学習サービス【1st Step】です。
【1st Step】は初心者のためのプログラミング学習サービスで、C言語・java・VBAの3つのプログラミングの基礎をオンラインで勉強することができます。
- 基礎からプログラミングを勉強したい
- まとまった勉強時間の確保が難しい
- 途中で挫折したくない
上記のように考えている方に【1st Step】はおすすめです。
下記の記事では、オンラインプログラミング学習サービス【1st Step】の特徴や私の体験など詳しく紹介しています。
これからVBAの勉強を始めようと考えている方は是非参考にしてみてください。
ディスカッション
コメント一覧
まだ、コメントがありません