2025/04/25
【ExcelVBA】選択するだけでデータを別の表に移動

【ExcelVBA】選択するだけでデータを別の表に移動

グループなどを管理している表で、隣のグループの表に氏名を移動したいことってありませんか?

今回は、そんな時に便利な右クリックするだけで氏名を移動できる仕組みを実現していきます。
左側の表から右側の表へ、右側の表から左側の表へ移動することができる仕組みになります。

※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、表の中のセルを右クリックすることで、隣の表にデータを移動するという仕組みを実現してきます。
特定のシートの特定のセルを右クリックすることで何かしら処理を実行するには、該当するシートのシートモジュールを活用します。

シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセル上で右クリックすると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セル上で右クリックされると同時に処理が実行されるものになります。
そのため、右上のリストから「BeforeRightClick」を選択します。

表示された「Worksheet_BeforeRightClick」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.CountLarge = 1 And _
        Target.Row >= 3 Then
        
        Dim lRow As Long
        If Target.Column = 2 Then
            Cancel = True
            lRow = Cells(Rows.Count, "C").End(xlUp).Row
            Cells(lRow + 1, "C").Value = Target.Value
            Target.Delete xlUp
        ElseIf Target.Column = 3 Then
            Cancel = True
            lRow = Cells(Rows.Count, "B").End(xlUp).Row
            Cells(lRow + 1, "B").Value = Target.Value
            Target.Delete xlUp
        End If
        
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.CountLarge = 1 And _
        Target.Row >= 3 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_BeforeRightClick」というプロシージャの引数の「Target」に、右クリックされたセルの情報が渡されるため、そのセルの情報から、表の対象の範囲内が右クリックされたかどうかを確認しています。
こちらでは、「右クリックされたセルが単体(複数範囲を選択した上での右クリックでない)で3行目以上のセル」と、まずは対象の表のデータ行が右クリックされたかどうかを確認しています。

この条件を満たした場合に関してのみ、Ifの中の処理を実行します。

        Dim lRow As Long
        If Target.Column = 2 Then
            '省略
        ElseIf Target.Column = 3 Then
            '省略
        End If

lRowという変数は、移動先の表の最終行の行番号を格納する用の変数になります。
こちらは後で使用します。

その次のIfで、右クリックされたセルが2列目(B列)なのか3列目(C列)なのかによって、処理を分岐しています。

            Cancel = True
            lRow = Cells(Rows.Count, "C").End(xlUp).Row
            Cells(lRow + 1, "C").Value = Target.Value
            Target.Delete xlUp

右クリックされたセルが2列目(B列)の場合は、「Cancel = True」で右クリック時のメニューが表示されないようにし、lRowに移動先の表(C列)の最終行の行番号を格納しています。
行番号は、C列の一番下のセルからCtrlキーとカーソルキーの上を押して止まった位置のセルの行番号を最終行の行番号として取得しています。
その次に、その取得した行番号の1つ下のセルに、右クリックされたセルの値を格納し、右クリックされたセルを削除して上に詰めています。

            Cancel = True
            lRow = Cells(Rows.Count, "B").End(xlUp).Row
            Cells(lRow + 1, "B").Value = Target.Value
            Target.Delete xlUp

右クリックされたセルが3列目(C列)の場合は、先ほどのB列とC列を入れ替えた処理を行っています。


3. 完成

以上の内容で実現できます。
移動したい氏名が入力されているセルの上で、右クリックすることで、その氏名を隣の表に移動することができます。

▼サンプルファイル▼

2025/04/18
【ExcelVBA】省略した項目を自動で入力

【ExcelVBA】省略した項目を自動で入力

以下のように、所属(学年とクラス)と氏名を入力する表で、同じ所属の名前を複数件登録することがあるかと思います。

その際に、毎回同じ所属(学年とクラス)を入力するのは面倒ですし、コピーするのも地味に面倒です。
そのため今回は、所属(学年とクラス)を省略した場合は、1つ前の所属を自動で入力する仕組みの開発方法について紹介していきます。
色んな表で活用できる便利な機能になります。

※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、以下の表の「氏名」の項目に値が入力された時に、「学年」の項目が空欄だった場合は1つ前の「学年」を入力、「クラス」の項目が空欄だった場合は1つ前の「クラス」を入力するという仕組みを実現していきます。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルに値を入力すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルに値を入力すると同時に処理が実行されるものになります。
そのため、右上のリストから「Change」を選択します。

表示された「Worksheet_Change」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim r As Long: r = Target.Row
    Dim c As Long: c = Target.Column
    
    If r >= 3 And c = 4 Then
        If Cells(r, "B").Value = "" Then
            Cells(r, "B").Value = _
                Cells(r - 1, "B").Value
        End If
        If Cells(r, "C").Value = "" Then
            Cells(r, "C").Value = _
                Cells(r - 1, "C").Value
        End If
    End If

End Sub

では、コードについて解説していきます。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim r As Long: r = Target.Row
    Dim c As Long: c = Target.Column
    
    If r >= 3 And c = 4 Then
        
        '省略
        
    End If

End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号と列番号を変数「r」と「c」に格納し、「r」が3以上、尚且つ、「c」が4の時、要するに「氏名」の項目が編集されたかどうかを確認しています。

この条件を満たした場合に、Ifの中の処理を実行します。

        If Cells(r, "B").Value = "" Then
            Cells(r, "B").Value = _
                Cells(r - 1, "B").Value
        End If
        If Cells(r, "C").Value = "" Then
            Cells(r, "C").Value = _
                Cells(r - 1, "C").Value
        End If

こちらでは、学年の項目(r行目のB列)が空欄なのか、クラスの項目(r行目のC列)が空欄なのかを確認しています。
学年の項目(r行目のB列)が空欄の場合は、その項目の1つ前の値(r-1行目のB列)を入力しています。
クラスの項目(r行目のC列)に関しても同様に、空欄の場合は、その項目の1つ前の値(r-1行目のC列)を入力しています。


3. 完成

以上の内容で実現できます。
「氏名」の項目に値が入力された時に、「学年」の項目が空欄だった場合は1つ前の「学年」が入力され、「クラス」の項目が空欄だった場合は1つ前の「クラス」が入力されます。

▼サンプルファイル▼

2025/04/14
【業務】合格者にだけ合格証を発行

【業務】合格者にだけ合格証を発行

#成績表 #合格証 #Worksheet #Worksheets #Copy #After #With #標準モジュール

YouTubeで開く

テストの成績をまとめた表の中から、予め指定した基準を満たした『合格者』だけに『合格証』を自動で発行する仕組みについて解説しています。

『合格証』は、予め指定したフォーマットを元に作成されます。

こちらでは『合格証』で実践していますが、同じ仕組みで、他のシステムにも活用できるかと思います。

00:00 挨拶
00:41 完成イメージ
01:55 準備
02:46 作成(合格証発行)
21:32 完成
23:32 プログラムの全体
34:28 まとめ

▼準備ファイル▼

2025/04/11
【Excel】年月を変更するだけで万年使えるカレンダー

【Excel】年月を変更するだけで万年使えるカレンダー

以下のように、年月の項目を指定するだけで、自動でその月のカレンダーに切り替わるシートの作成方法について解説していきます。

※こちらのファイルは、記事の最後にて配布しています。


1. 指定した年月の1日の日付を表示する

まず、DATE関数を活用して、指定した年月の1日の日付を表示します。

=DATE(B2,B3,1)

これで、B2とB3に入力した年月の1日の日付が表示されます。


2. 2日以降の日付を表示する

2日以降の日付は、前の日付に1日を加えることで表示できます。

=A6+1

1つ数式を入力したら、下へ28日が表示されるまでコピーします。


3. 29日以降の日付を表示する

月によっては29日以降が不要になるため、29日以降に関しては、対象年月の月末日を超えていないかどうかを確認する必要があります。

そのためには、対象年月の月末日を取得する必要があります。
年月から月末日を取得するには、DATE関数で「翌月1日の1日前」と指定します。

=DATE(B2,B3+1,0)
// 1日の1日前なので、日を「0」と指定する

取得した月末日と前の日付(1つ上のセル)と比較し、月末日の方が大きい場合に、前の日付に1日を加えた日付を表示させます。
条件を確認し表示の有無を切り替える場合は、IF関数を活用します。

=IF(DATE(B2,B3+1,0)>A33,A33+1,"")

こちらの場合は、2025年2月の日付を表示しているため、28日の次の日付が表示されないことが確認できます。

こちらの数式を残り2行分(31日分)入力する必要があります。
そのため、数式の年月を参照しているセルに「$」を加えて固定してからコピーします。

=IF(DATE($B$2,$B$3+1,0)>A33,A33+1,"")

上記の画像のセルA35とA36が空になる理由は、IF関数の条件式(論理式)で空と比較しているためです。

文字列(数式により表示された空の文字列「””」)と数値を比較した場合、文字列の方が大きいと判断されるため、IF関数の条件を満たさず空の文字列「””」が表示されます。
※何も入力されていないセルの場合は「0」として扱われるため、挙動が異なります。


4. 曜日を表示する

日付から曜日を取得するには、TEXT関数を活用します。
以下のように、TEXT関数を活用して日付に対応する曜日を表示します。

=TEXT(A6,"aaa")
// 「aaa」は曜日を表示する書式記号

1つ数式を入力したら、最終行までコピーします。

日付の項目が空の文字列「””」の行に関しては、空の文字列「””」が表示されます。
※何も入力されていないセルの場合は「0」として扱われるため、挙動が異なります。


5. 完成

これで、指定した年月に応じてカレンダーが自動的に切り替わる仕組みが完成しました。
関数を組み合わせることで、ある程度は自動化することができます。
今回は、DATE関数IF関数TEXT関数の3つの関数を活用しました。
これらの関数は、よく使われるため覚えておくと良いです。

▼サンプルファイル▼

2025/04/04
【ExcelVBA】シートの「表示・非表示」を瞬時に切り替える

【ExcelVBA】シートの「表示・非表示」を瞬時に切り替える

以下のようにシートの数が増えすぎると、シートの移動が面倒になりますよね。

シートの一覧を表示して対象のシートを選択するということもできますが、毎回一覧を表示するというのも面倒になります。

そのような時は、不要なシートを非表示にすると思いますが、このシートを非表示にしたり再表示にしたりする作業も地味に面倒ですよね。

ということで今回は、シート名の一覧シートを用意し、そのシートで対象のシート名をダブルクリックするだけでシートの「表示・非表示」を切り替えることができる仕組みを実現していきます。

※こちらで開発したファイルは記事の最後にて配布しています。

ExcelVBAレベル確認

1. 開発準備

まず初めに、シート名の一覧シートを用意します。
こちらでは、以下のようなシート名と表示の有無(●なら表示)を管理した表を、シートを追加して用意しています。

次は、用意したシートの「表示」の項目をダブルクリックすることで、対象シートの「表示・非表示」を切り替える仕組みを実現していきます。

「特定のセルをダブルクリックすると同時に、何かしら処理を実行する」という仕組みは、該当するシートモジュールイベントプロシージャを活用することで実現できます。

シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルをダブルクリックすると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルがダブルクリックされると同時に処理が実行されるものになります。
そのため、右上のリストから「BeforeDoubleClick」を選択します。

表示された「Worksheet_BeforeDoubleClick」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        Cancel = True
        
        Dim wsName As String
        wsName = Cells(Target.Row, "B").Value
        
        On Error Resume Next
        If Target.Value = "" Then
            Target.Value = "●"
            Worksheets(wsName).Visible = True
        Else
            Target.ClearContents
            Worksheets(wsName).Visible = False
        End If
        
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_BeforeDoubleClick」というプロシージャの引数の「Target」に、ダブルクリックされたセルの情報が渡されるため、そのセルの情報から、表の対象の範囲内がダブルクリックされたかどうかを確認しています。
こちらでは、「3行目以上、尚且つ、3列目のセル」と「表示」のセルの範囲内がダブルクリックされたかどうかを確認しています。

この条件を満たした場合に関してのみ、Ifの中の処理を実行します。

        Cancel = True
        
        Dim wsName As String
        wsName = Cells(Target.Row, "B").Value

セルをダブルクリックすると、通常、セルが編集モードになるのですが、引数の「Cancel」をTrueにすることで、編集モードにならなくなります。
その次に、ダブルクリックされた行と同じ行のB列の値(シート名)を変数(wsName)に格納しています。

        On Error Resume Next
        If Target.Value = "" Then
            Target.Value = "●"
            Worksheets(wsName).Visible = True
        Else
            Target.ClearContents
            Worksheets(wsName).Visible = False
        End If

次に、ダブルクリックされたセルの値の有無を確認しています。
値が空の場合は、ダブルクリックされたセルに「●」を入力し、先ほど取得したシート名(wsName)のシートを表示しています。
値が空でない場合は、ダブルクリックされたセルの値をクリアし、先ほど取得したシート名(wsName)のシートを非表示にしています。

先頭の「On Error Resume Next」はエラー対策です。
変数(wsName)に格納されているシート名のシートが存在しない場合に、エラーにならないように、エラーの場合は無視をして続行するという記述になります。


3. 完成

以上の内容で実現できます。
シートの「表示・非表示」を切り替えたい対象のシート名が入力されている行のC列のセルをダブルクリックすることで、そのシートの「表示・非表示」を切り替えることができます。

▼サンプルファイル▼

2025/03/28
【ExcelVBA】完了タスクを非表示にして着手中タスクを上位表示する

【ExcelVBA】完了タスクを非表示にして着手中タスクを上位表示する

以下のようなタスク管理表で、完了したタスクを非表示にして、着手中のタスクを上位に表示するという作業があるとします。
この作業をタスクの進捗を更新する度、手動で行うのは大変ですよね。

そこで今回は、「着手日」または「完了日」を入力すると同時に、これらの操作を自動で行う仕組みの実現方法を解説していきます。
※こちらで開発したファイルは記事の最後にて配布しています。

1. 開発準備

今回は、以下の表の「着手日」もしくは「完了日」の項目に値が入力されると同時に処理を実行します。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルに値を入力すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルに値を入力すると同時に処理が実行されるものになります。
そのため、右上のリストから「Change」を選択します。

表示された「Worksheet_Change」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
       Target.Column >= 4 And _
       Target.Column <= 5 Then
        
        Range("B2").AutoFilter _
            Field:=4, _
            Criteria1:=""
        
        Range("B2").Sort _
            Key1:=Range("D2"), _
            Order1:=xlAscending, _
            Header:=xlYes
        
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
       Target.Column >= 4 And _
       Target.Column <= 5 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号が3以上、尚且つ、列番号が4以上、5以下の時、要するに「着手日」もしくは「完了日」の項目が編集されたかどうかを判定しています。

この条件を満たした場合に、Ifの中の処理を実行します。

        Range("B2").AutoFilter _
            Field:=4, _
            Criteria1:=""

まずは、絞り込みです。
セルB2を含む表の先頭から4列目の項目「完了日」に対し、空白のセルで絞り込みをしています。

        Range("B2").Sort _
            Key1:=Range("D2"), _
            Order1:=xlAscending, _
            Header:=xlYes

次に、並べ替えです。
セルB2を含む表を、セルD2の列の項目「着手日」を基準に昇順(xlAscending)にしています。
表には見出し(項目名)が含まれるため、「Header:=xlYes」と指定しています。


3. 完成

以上の内容で実現できます。

「完了日」に値を入力すると同時に、そのタスクが非表示になります。

また、「着手日」を入力すると同時に、「着手日」を基準に昇順で並べ替えられます。

▼サンプルファイル▼

2025/03/14
【ExcelVBA】不要なシートの見出しの色を自動変更

【ExcelVBA】不要なシートの見出しの色を自動変更

使わなくなったシートの管理方法として、シート名の先頭に「_」を加えて、シート見出しの色をグレーにすることがあります。

毎月のように、この作業を行う場合、地味に面倒ですよね。

そこで今回は、シート名の先頭に_を加えるだけで、自動でシート見出しの色をグレーにする仕組みの実現方法について解説していきます。
※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、シート名の先頭に「_」を加えてから、他のシートに切り替えた時に、自動で対象のシート見出しの色をグレーにする仕組みを実現します。

そのような、シートが切り替わったタイミングに処理を自動で実行するには、「ブックモジュール」の「イベントプロシージャ」を活用します。
「ブックモジュール」は、[開発]タブから[Visual Basic]を選択し、[プロジェクトエクスプローラー]から[ThisWorkbook]をダブルクリックすることで表示することができます。

「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、シートが切り替わったタイミングに処理が自動で実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、ブックモジュールの左上のリストから「Workbook」を選択します。

「Workbook」を選択すると、自動で「Workbook_Open」というプロシージャが表示されます。
このプロシージャは、ワークブック(ファイル)を立ち上げた時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、シートが切り替わったタイミングに処理が実行されるものになります。
そのため、右上のリストから「SheetDeactivate」を選択します。

表示された「Workbook_SheetDeactivate」というプロシージャを活用します。
「Workbook_Open」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    
    If Left(Sh.Name, 1) = "_" Then
        Sh.Tab.Color = RGB(180, 180, 180)
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    
    '省略
    
End Sub

「Workbook_SheetDeactivate」というプロシージャの引数の「Sh」に、アクティブでなくなったシートの情報が渡されます。

    If Left(Sh.Name, 1) = "_" Then
        Sh.Tab.Color = RGB(180, 180, 180)
    End If

対象のシート(Sh)の名前の先頭に「_」がある場合に、対象シートの見出しの色(Sh.Tab.Color)をグレー(RGB(180, 180, 180))にしています。


3. 完成

以上の内容で実現できます。
シート名の先頭に「_」を加えて他のシートを選択するだけで、シート見出しの色が自動でグレーになります。

▼サンプルファイル▼

2025/03/07
【ExcelVBA】選択データの全項目を一括表示

【ExcelVBA】選択データの全項目を一括表示

以下のように、項目数の多い表の場合、対象データの内容を確認するのが大変だったりします。

そこで今回は、「対象データのいずれかのセルを選択してボタンを押すことで、全項目の値をメッセージボックスで表示することができる機能」の開発方法について解説していきます。

※こちらで開発したファイルは、記事の最後にて配布しています。


1. 開発準備

まず初めに、[開発]タブを選択し、[マクロ]を選択します。

表示された以下の画面にて、開発する機能の名前を入力し、[作成]を選択します。
こちらでは、「一覧表示」と入力しています。

次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。

ExcelVBAレベル確認

2. コードの記述

以下のコードを記述します。

Sub 一覧表示()
    
    Dim r As Long
    r = ActiveCell.Row
    
    Dim c As Long, msgStr As String
    For c = 1 To 18
        msgStr = msgStr & _
            Cells(1, c).Value & ":" & _
            Cells(r, c).Text & vbCrLf
    Next c
    
    MsgBox msgStr
    
End Sub

では、コードについて解説していきます。

    Dim r As Long
    r = ActiveCell.Row

こちらで、選択されているセル(アクティブになっているセル)の行番号を取得して、変数rに代入しています。

    Dim c As Long, msgStr As String
    For c = 1 To 18
        msgStr = msgStr & _
            Cells(1, c).Value & ":" & _
            Cells(r, c).Text & vbCrLf
    Next c

表の先頭列(A列:1列目)から表の最終列(R列:18列目)までを1列ずつ繰り返し、変数msgStrに、「対象列の項目名:1行目のc列目」と「:」、「対象列の対象データ:r行目のc列目」、「改行コード」を加えています。
項目名は「.Value」に対し、データの値は「.Text」を使用しています。
通常、セルの値の取得は「.Value」で問題ないのですが、データの値に関しては表示形式が設定された見た目のままの文字列を取得するために「.Text」を使用しています。

【注意】

「.Text」はセルに表示されたままのテキストを取得します。
そのため、日付や金額のセルなどで列幅が狭く「####」と表示されている場合は、「####」のままで取得されてしまいます。

    MsgBox msgStr

最後に、繰り返し処理で作成した文字列(変数msgStr)をメッセージボックスで表示しています。


3. ボタンの作成

コードが完成しましたら、実行用のボタンを用意します。
ボタンは、[開発]タブの中の[挿入]から作成することができます。


4. 完成

以上の手順で完成です。
表示したいデータのいずれかのセルを選択して、作成したボタンを押すだけで、全項目の値をメッセージボックスで表示することができます。

▼サンプルファイル▼

2025/02/28
【Excel】選択している行のデータを縦向きに抽出

【Excel】選択している行のデータを縦向きに抽出

Excelで選択している行のデータを縦向きに抽出する方法について解説します。

実は、マクロを使用せずに簡単な数式のみで実現できます。
順番に手順を解説していきます。


1. 先頭行のデータを縦方向に抽出

まずは、先頭行(No.1)のデータをB列のセルに抽出していきます。

抽出する際に、横方向のデータを縦方向に転置する必要があります。
転置するには、TRANSPOSE関数を活用します。

抽出する先頭のセルB3に以下の数式を入力します。

=TRANSPOSE(D3:M3)
// D3:M3:先頭行(No.1)のデータ

数式を入力して確定することで、以下のように先頭行のデータを縦方向に変換して抽出することができます。

ExcelVBAレベル確認

2. 抽出する行番号を数値にする

現状の数式は、抽出するデータが「D3:M3」と参照になっています。

=TRANSPOSE(D3:M3)

最終的には選択している行のデータを抽出する必要があるため、1行目、2行目と行番号を変更するだけで抽出対象のデータが変更できるように修正します。

こちらでは、OFFSET関数を活用して行番号で指定できるように修正します。
OFFSET関数とは、指定した範囲から指定した行数、列数移動した位置の範囲を取得することができる関数です。
OFFSET関数を活用して1行移動した先がセル「D3:M3」になるように、以下のような数式にします。
※No.1のデータが1行移動した先になるようにします。

=TRANSPOSE(OFFSET(D2:M2,1,0))
// D2:M2:移動する前の範囲
// 1:1行下へ移動
// 0:0列右へ移動

数式を入力して確定することで、以下のように抽出することができます。

OFFSET関数で指定した行数を以下のように修正するだけで、抽出するデータの行を変更することができます。

=TRANSPOSE(OFFSET(D2:M2,2,0))
// 2:2行下へ移動

3. 行番号を自動取得する

最後に、OFFSET関数で指定している行数を自動で取得する仕組みを実現します。
実は、この仕組みも数式のみで実現できます。

選択しているセルの行番号を取得するには、CELL関数を活用します。
CELL関数に、以下のように「row」と指定することで、数式を更新する度、選択しているセルの行番号を取得することができます。

=CELL("row")

数式は、[数式]タブの中の[再計算実行]を選択、もしくは、F9キーを押すことで更新できます。

毎回、[数式]タブから[再計算実行]を選択するのは大変ですので、F9キーを活用した方がよいです。

では、先ほどの数式のOFFSET関数に指定した行数をCELL関数に置き換えます。
OFFSET関数の行数が1の時に、先頭行(3行目)のデータが抽出されるため、CELL関数で取得した行番号から2を引く必要があります。
そのため、以下のような数式になります。

=TRANSPOSE(OFFSET(D2:M2,CELL("row")-2,0))
// CELL("row")-2:選択しているセルの行番号から2を引いた数値を取得

数式を入力して確定することで完成です。

いずれかのセルを選択して、F9キーを押して数式を更新するだけで、以下のように選択しているセルの行のデータを抽出することができます。

▼サンプルファイル▼

2025/02/21
【ExcelVBA】相関性を保ったまま重複のない番号を自動入力

【ExcelVBA】相関性を保ったまま重複のない番号を自動入力

「No」や「ID」の項目などで重複のない番号を自動入力する際に、以下のようにROW関数を活用して入力することがあります。

しかし、ROW関数を活用して入力していると、表を並べ替えた時に番号が更新されてしまい、番号と他の項目との相関性がなくなってしまいます。

ということで今回は、相関性を保ったまま重複のない番号を自動入力する仕組みの実現方法について解説します。
※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、以下の表の「Name」の項目に値が入力されると同時に、「No」の項目に重複のない番号を入力するという仕組みを実現します。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルに値を入力すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルに値を入力すると同時に処理が実行されるものになります。
そのため、右上のリストから「Change」を選択します。

表示された「Worksheet_Change」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。


2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        If Cells(Target.Row, "B").Value = "" Then
            Cells(Target.Row, "B").Value = _
                WorksheetFunction.Max(Columns("B")) + 1
        End If
        
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号が3以上、尚且つ、列番号が3の時、要するに「Name」の項目が編集されたかどうかを判定しています。

この条件を満たした場合に、Ifの中の処理を実行します。

        If Cells(Target.Row, "B").Value = "" Then
            Cells(Target.Row, "B").Value = _
                WorksheetFunction.Max(Columns("B")) + 1
        End If

先ほどの条件を満たしたときに、編集されたセルと同じ行のB列、即ち「No」の項目が空かどうかを確認しています。
「No」の項目が空の場合に、その項目に、B列に入力されている数値の最大値に1を加えた数値を入力しています。


3. 完成

以上の内容で実現できます。

「Name」の項目に値を入力した時、尚且つ、その行の「No」の項目が空の場合に、今までの番号の最大値に1を加えた数値が自動で入力されます。

また、数式ではなく直接数値が入力されているため、並べ替えた際に他の項目との相関性がなくなってしまうことはありません。

▼サンプルファイル▼

2025/02/21
限定無料特典

限定無料特典

第1弾

①ExcelVBA 学習ロードマップ
②Excelファイル「ガントチャート」
③Excelファイル「カレンダー」
④Excel × Googleスプレッドシート ショートカット一覧シート
⑤Excel 演算子一覧シート
⑥Excel 書式記号一覧シート
⑦Excelファイル「脳トレゲーム」

▼以下より一括で受け取れます▼

ダウンロード
(Googleドライブ)

※パソコンで開くことを推奨します。

第2弾(メンバー優先配布)

⑧電子書籍 Excel小技集 100選
⑨Excelファイル「便利ツール」

▼以下より一括で受け取れます▼

ダウンロード
(Googleドライブ)

※パソコンで開くことを推奨します。

2025/02/21
【業務】シート上の画像(グラフを含む)を一括保存

【業務】シート上の画像(グラフを含む)を一括保存

#アドイン #Chart #ChartObject #Shape #画像

YouTubeで開く

選択しているシート上の画像(グラフなどを含む)を一括で保存する拡張機能(アドイン)の開発方法になります。
アドインとして開発することで、Excelの標準機能として加えることができます。また、標準機能として加えることで、マクロ有効ブックでなくても全てのExcelファイルで使用することができるようになります。

00:00 挨拶
00:15 完成イメージ
02:39 準備
03:22 作成(画像保存機能)
13:26 注意点
13:39 作成(アドイン設定)
14:10 完成
15:45 プログラムの全体
18:54 プレゼントについて

▼準備ファイル▼