【VBA Excel マクロ】セル範囲指定→右or左から指定した文字数を削除

 

1. 本マクロの概要

└1-1.このマクロで何ができるか

└1-2.マクロ起動時の画面遷移

2. ソースコード掲載

3. ソースコード概要説明

 

1-1.このマクロで何ができるか

このマクロは、複数のセルに対して、記載してある文字列を右(または左)から指定文字数削除します
ユーザーに求める操作は以下の通りです。
■削除対象のセルを指定

■削除文字数を入力

■右or左のどちらから指定文字数を削除するか入力
 (本マクロでは、右からならば“3”、左からならば“1”を入力)

↑目次に戻る

 

1-2.マクロ起動時の画面遷移

マクロ起動時の画面遷移は全部で4つとなります。

↑目次に戻る

 

2.ソースコード掲載

 マクロのソースコードは、以下の通りです。マクロの登録方法は、本ブログ内で紹介しておりますので、本ブログの「3.ExcelにおけるVBAマクロの登録と利用方法」からご確認ください。

Sub 右または左から指定文字数削除()

Dim selected_range As Range         'ユーザー選択範囲格納変数
Dim number_of_erase As Integer      'ユーザー指定文字数格納変数
Dim factorOfRightOrLeft As Integer  'ユーザーが指定する"右"or"左"
Dim rng As Range                    'for文走査用変数
Dim count_of_string As Integer      '各セル内の文字数格納変数
Dim NumberOfErasedString As Integer 'セル内の文字列からユーザー指定の削除文字数の差


On Error Resume Next

'InputBoxを表示して、ユーザーにセル範囲を入力してもらう
Set selected_range = Application.InputBox("文字列削除対象のセル範囲を指定してください。" & vbLf & _
                                          "操作を中断する場合は【キャンセル】をクリックしてください", _
                                          Type:=8, _
                                          Title:="セル範囲を入力")
'「キャンセル」がクリックされた場合は処理終了
If selected_range Is Nothing Then Exit Sub

'InputBoxを表示して、ユーザーに削除文字数を入力してもらう
number_of_erase = Application.InputBox("削除する文字数を入力してください。" & vbLf & _
                                       "操作を中断する場合は【キャンセル】をクリックしてください", _
                                       Type:=1, _
                                       Title:="文字数を入力(整数値)")
'「キャンセル」がクリックされた場合は処理終了
If number_of_erase = False Then Exit Sub

'InputBoxを表示して、ユーザー"右"か"左"のどちらら削除するかを選択してもらう
factorOfRightOrLeft = Application.InputBox("文字列を「右」または「左」のどちからから削除するか選択してください" & vbLf & _
                                            vbLf & _
                                           "「右」から削除する場合は「3」を入力してください" & vbLf & _
                                           "「左」から削除する場合は「1」を入力してください。", _
                                           Type:=1, _
                                           Title:="文字数を入力(整数値)")
'「キャンセル」がクリックされた場合は処理終了
If factorOfRightOrLeft = False Then

 Exit Sub

'数字の1または数字の3以外が選択された場合は処理終了
ElseIf factorOfRightOrLeft <> 1 And factorOfRightOrLeft <> 3 Then

 Exit Sub

'それ以外の場合は処理続行
Else

End If

On Error GoTo 0


'指定されたセル範囲を走査
For Each rng In selected_range

    'セル内の文字数をカウントし、count_of_string変数に格納
    count_of_string = Len(rng.Value)
    
    'セル内の文字数からユーザー指定の削除文字数の差を格納
    NumberOfErasedString = (count_of_string) - (number_of_erase)
    
    '(セル内の文字数)-(ユーザーが入力した)文字数が0より大きい場合
    If NumberOfErasedString > 0 Then
    
        '「右」から削除を選択している場合
        If factorOfRightOrLeft = 3 Then
        
            'ユーザーが指定した文字数分右から削除して再格納
            rng.Value = Left(rng.Value, NumberOfErasedString)
            
        '「左」から削除(3)を選択している場合
        Else
        
            'ユーザーが指定した文字数分左から削除して再格納
            rng.Value = Right(rng.Value, NumberOfErasedString)
        
        End If
     
    '(セル内の文字数)-(ユーザーが入力した)文字数が0以下の場合
    Else _
    
        'セルの中身を空欄に設定
        rng.Value = Null
    
    End If

Next

End Sub

↑目次に戻る

3. ソースコード概要説明

 以下、ソースコードに記載されている内容がどのようなものを意味しているかを、ソースコードの上から順に紹介します。
ソースコード内の” ‘ (シングルクォーテーション)”から始まる文章は「コメント」扱いになり、ソースコードとしては読み込まれません。そのソースコード部分では何をしているかの注釈付けを行っています。

変数宣言

Dim selected_range As Range         'ユーザー選択範囲格納変数
Dim number_of_erase As Integer      'ユーザー指定文字数格納変数
Dim factorOfRightOrLeft As Integer  'ユーザーが指定する"右"or"左"
Dim rng As Range                    'for文走査用変数
Dim count_of_string As Integer      '各セル内の文字数格納変数
Dim NumberOfErasedString As Integer 'セル内の文字列からユーザー指定の削除文字数の差

Dim    :変数宣言
As (変数型):宣言した変数のデータ型を(変数型)で宣言
【変数型説明】
As Range :セル範囲、セル番地を入力する変数型
As Integer:整数。数値のための変数型
 上記の変数型を指定しながら、コメントにあるような意図で変数を作成します。

↑ソースコード概要説明 に戻る

ユーザー入力_セル範囲を指定

On Error Resume Next

'InputBoxを表示して、ユーザーにセル範囲を入力してもらう
Set selected_range = Application.InputBox("文字列削除対象のセル範囲を指定してください。" & vbLf & _
                                          "操作を中断する場合は【キャンセル】をクリックしてください", _
                                          Type:=8, _
                                          Title:="セル範囲を入力")
'「キャンセル」がクリックされた場合は処理終了
If selected_range Is Nothing Then Exit Sub

【On Error Resume Next】
 ユーザーの入力値が例外値だった場合、通常では動作が止まり、Visual Basucのソースコード画面に飛びます。On Error Resume Nextを宣言することで、例外値が入力された場合でも動作は止まりません。後述するOn Error GoTo 0記載までこの状態は続きます。
【Set selected_range = Application.InputBox(…)】
 Application.InputBox(…)で記載された内容で、ユーザー入力ウインドウを表示させます。ユーザーの入力した値は、selected_range 変数に格納されます。
 (…)の中でType:=8と宣言しています。これは、ユーザーの入力値のデータ型をRange型とすることを宣言しています。他の日本語部分は、表示するウインドウ内に表示される注釈等を記載しています。ユーザーによって自由に変えていただいても動作に支障はありません。
【If selected_range Is Nothing Then Exit Sub】
 表示したウインドウでユーザーが「キャンセルボタン」を押した場合、マクロの動作が止まるようになります。

↑ソースコード概要説明 に戻る

ユーザー入力_削除文字数を指定

'InputBoxを表示して、ユーザーに削除文字数を入力してもらう
number_of_erase = Application.InputBox("削除する文字数を入力してください。" & vbLf & _
                                       "操作を中断する場合は【キャンセル】をクリックしてください", _
                                       Type:=1, _
                                       Title:="文字数を入力(整数値)")
'「キャンセル」がクリックされた場合は処理終了
If number_of_erase = False Then Exit Sub

【number_of_erase = Application.InputBox(…)】
 今度はユーザーが入力した数値を、number_of_erase変数に格納します。
number_of_erase変数はInteger型の変数なので、(…)内のType:=1が先程と異なります。これにより、入力した数値がInteger型として格納されます。その他の日本語部分は自由に変えていただいても構いません。ちなみに、「 & vbLf &」は文章内の「改行」を意味しています。
【If number_of_erase = False Then Exit Sub】
 表示したウインドウでユーザーが「キャンセルボタン」を押した場合、マクロの動作が止まるようになります。Falseの部分が先程はNothingでしたが、データ型がRange型とInteger型で異なるので「キャンセルボタン」が入力されたときに変数に格納される値が変わることを考慮しています。

↑ソースコード概要説明 に戻る

ユーザー入力_「右」or「左」から削除を指定

'InputBoxを表示して、ユーザー"右"か"左"のどちらら削除するかを選択してもらう
factorOfRightOrLeft = Application.InputBox("文字列を「右」または「左」のどちからから削除するか選択してください" & vbLf & _
                                            vbLf & _
                                           "「右」から削除する場合は「3」を入力してください" & vbLf & _
                                           "「左」から削除する場合は「1」を入力してください。", _
                                           Type:=1, _
                                           Title:="文字数を入力(整数値)")

入力値に対する判定分は、別枠で説明させていただきます。
【factorOfRightOrLeft = Application.InputBox】
 先程の「削除文字数を指定」と実施していることは基本同じです。
入力した数値をfactorOfRightOrLeft変数(Integer型)に格納しています。

↑ソースコード概要説明 に戻る

「右」or「左」で指定された入力値を確認判定

'「キャンセル」がクリックされた場合は処理終了
If factorOfRightOrLeft = False Then

 Exit Sub

'数字の1または数字の3以外が選択された場合は処理終了
ElseIf factorOfRightOrLeft <> 1 And factorOfRightOrLeft <> 3 Then

 Exit Sub

'それ以外の場合は処理続行
Else

End If

On Error GoTo 0

【If factorOfRightOrLeft = False Then Exit Sub】
 ここは先程と同じで、ユーザーが「キャンセルボタン」を押した場合に、悪路の動作が終了します。
【ElseIf factorOfRightOrLeft <> 1 And factorOfRightOrLeft <> 3 Then Exit Sub】
 上記の判定分を抜けた場合、ElseIfでこの判定分を実施します。入力された数値を格納しているfactorOfRightOrLeftに対して、 <> 1 And <> 3の判定を実施します。「<>」は「否定」であり、「 <> 1」は「1ではない場合」が正となります。「AND」は左辺と右辺がどちらも正の場合に正を返し、そうでない場合は負を返します。
 なので、factorOfRightOrLeft <> 1 And factorOfRightOrLeft <> 3 Then Exit Subを日本語に読み替えると、「入力値が1または3以外の場合は、マクロを終了する」となります。
【Else End If】
 上記2つの判定分を潜り抜けると、この判定分にたどり着きます。Elseの後に処理がないので、「上記二つの判定以外は以降の処理が続きます」。と明示し、「EndIf」で一連のIF分が終了したことを宣言します。

↑ソースコード概要説明 に戻る

指定されたセル範囲を走査

'指定されたセル範囲を走査
For Each rng In selected_range

...
...
...

Next

【For Each rng In selected_range … Next】

 「For Each 」文は、以降の「rng In selected_range」を修飾します。selected_rangeのセル範囲に対して、一つずつのセルをrng変数へ格納しながら、Nextの位置まで実施します。
 例えば、ユーザーがA1:A3のセル範囲を指定した場合、selected_rangeにはA1:A3が格納されます。
For Each文はIn selected_rangeを走査するので、はじめにA1をrng変数に格納し、Nextの位置まで処理を実施します。
その後For Eachまで戻り、A2をrngに格納してまたNextまで処理します。
A3も同様に行った後、For EachでIn selected_rangeの操作が完了したことを判定し、Next以降の処理が始まります。

↑ソースコード概要説明 に戻る

セルの文字数を計算

 'セル内の文字数をカウントし、count_of_string変数に格納
    count_of_string = Len(rng.Value)
    
    'セル内の文字数からユーザー指定の削除文字数の差を格納
    NumberOfErasedString = (count_of_string) - (number_of_erase)

【count_of_string = Len(rng.Value)】
  Len(rng.Value)では、rng.Valueの文字数を数えます。rng.Valueはセルの文字列を表します。rngはRange型の変数であり、ユーザーが指定したセル範囲内の一つとなります。
【NumberOfErasedString = (count_of_string) – (number_of_erase)】
 (セルの文字数)-(ユーザーが入力した文字数)の計算結果をNumberOfErasedString変数(Integer型)に格納します。

↑ソースコード概要説明 に戻る

セル内の文字数を、ユーザー指定情報を基に削除

'(セル内の文字数)-(ユーザーが入力した)文字数が0より大きい場合
    If NumberOfErasedString > 0 Then
    
        '「右」から削除を選択している場合
        If factorOfRightOrLeft = 3 Then
        
            'ユーザーが指定した文字数分右から削除して再格納
            rng.Value = Left(rng.Value, NumberOfErasedString)
            
        '「左」から削除(3)を選択している場合
        Else
        
            'ユーザーが指定した文字数分左から削除して再格納
            rng.Value = Right(rng.Value, NumberOfErasedString)
        
        End If
     
    '(セル内の文字数)-(ユーザーが入力した)文字数が0以下の場合
    Else _
    
        'セルの中身を空欄に設定
        rng.Value = Null
    
    End If

【If NumberOfErasedString > 0 Then Else rng.Value = Null】
(セルの文字数)-(ユーザーが入力した文字数)の結果が0以下になった場合は、その文字数のセルにはNULLを入力し、空欄にします。
【 If factorOfRightOrLeft = 3 Then  rng.Value = Left(rng.Value, NumberOfErasedString)】
 ユーザーが「右」から削除の3を入力した場合、 Left(rng.Value, NumberOfErasedString)により、(セルの文字数)-(ユーザーが入力した文字数)の数値分左から数えた文字数をセルに再格納します。
【Else rng.Value = Right(rng.Value, NumberOfErasedString)】
 上記判定以外の場合、ユーザーは「左」からの1を入力しているので、Right(rng.Value, NumberOfErasedString)により、(セルの文字数)-(ユーザーが入力した文字数)の数値分右から数えた文字数をセルに再格納します。


↑ソースコード概要説明 に戻る

 

VBAマクロのソースコード一覧は「 2.実践編_VBAマクロのソースコード掲載 」をご覧ください。