2025/04/04
【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】完了タスクを非表示にして着手中タスクを上位表示する

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

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

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】選択データの全項目を一括表示

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

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

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

ExcelVBAレベル確認

1. 開発準備

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

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

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


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)のデータ

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


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
Excel小技集 電子書籍 配布

Excel小技集 電子書籍 配布

便利な小技を100個まとめた最新の電子書籍「Excel小技集」は、以下で配布しています。

配布ページへ


更新日:2023年5月5日(第4版)

ダウンロード

更新日:2023年4月4日(第3版)

ダウンロード

更新日:2023年2月28日(第2版)

ダウンロード

更新日:2023年1月27日(初版:お試し版)

ダウンロード
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を加えた数値を入力しています。

ExcelVBAレベル確認

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 #画像

※サイト内の限定動画です。

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

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

▼準備ファイル▼

2025/02/10
【業務】表の項目の「表示・非表示」切り替え

【業務】表の項目の「表示・非表示」切り替え

#表示 #非表示 #Hidden #標準モジュール #ユーザーフォーム #UserForm_Initialize

※サイト内の限定動画です。

※動画内では、項目名の更新時に「変更後の名前の要素追加 → 元々の要素の削除」としていますが、以下のように直接更新することもできます。
.List(.ListIndex) = Cells(ROW_NO, colNo).Value
→ 「ListIndex」でダブルクリックされた要素の位置情報を取得して、その要素を直接更新する


表の項目名の一覧を専用フォーム(リストボックス)に表示させて、フォーム内の項目名をダブルクリックすることで、該当する項目の表示と非表示を切り替えることができる機能になります。

例で解説している表は、セルA1から始まる表ですが、どの位置から始まる表でも、一部を修正することで活用することができます。

00:00 挨拶
00:55 完成イメージ
01:59 準備
02:34 作成(ウィンドウ枠の固定)
03:18 作成(項目名リストボックス:外部)
07:11 作成(項目名リストボックス:内部)
29:28 作成(リストボックス呼び出し)
30:15 作成(実行ボタン)
30:56 完成
31:50 プログラムの全体
40:48 まとめ

▼準備ファイル▼

2025/02/07
【ExcelVBA】表の絞り込みと並べ替えを一瞬でリセット

【ExcelVBA】表の絞り込みと並べ替えを一瞬でリセット

以下のように、並べ替えたり絞り込みしたりした表を毎回元の形に戻すのは手間になります。

そこで、こちらの記事では、並べ替えと絞り込みを一瞬でリセットする「リセット機能」の開発方法について解説します。

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

ExcelVBAレベル確認

1. 開発準備

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

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

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


2. コードの記述

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

Sub リセット()
    
    With ActiveSheet.ListObjects("従業員管理表")
        .AutoFilter.ShowAllData
        Dim keyR As Range
        Set keyR = .ListColumns("社員ID").DataBodyRange
        With .Sort
            .SortFields.Clear
            .SortFields.Add key:=keyR
            .Apply
        End With
    End With
    
End Sub

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

    With ActiveSheet.ListObjects("従業員管理表")
        '省略
    End With

対象のテーブルを指定します。
今回の場合、操作を行う表を予めテーブルにしています。
そのテーブル名(従業員管理表)を指定します。

        .AutoFilter.ShowAllData

次に、対象のテーブルの絞り込みを解除しています。

        Dim keyR As Range
        Set keyR = .ListColumns("社員ID").DataBodyRange

次に、対象のテーブルの[社員ID]の範囲を変数(keyR)に割り当てています。

        With .Sort
            .SortFields.Clear
            .SortFields.Add key:=keyR
            .Apply
        End With

最後に、テーブルの既存の並べ替えの設定を解除し、テーブルの[社員ID]の範囲(keyR)を基準に並べ替える設定を適用しています。

ExcelVBAレベル確認

3. ボタンの作成

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


4. 完成

以上の手順で、機能が完成します。
リセット機能を実行することで、以下のように表の絞り込みが解除され、[社員ID]を基準に並べ替えられます。

▼サンプルファイル▼

2025/01/31
【ExcelVBA】削除したデータを別シートに記録

【ExcelVBA】削除したデータを別シートに記録

以下の表の中の不要なデータ行のいずれかのセルを選択し、[選択行削除]ボタンを押すだけで、該当するデータを別シート(「削除済み」シート)の表の末尾に移動する機能の開発方法について解説してきます。

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


手順1: 開発準備

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

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

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


手順2: コードの記述

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

Sub deleteData()
    
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Worksheets("商品一覧")
    Set ws2 = Worksheets("削除済み")
    
    Dim lastRow As Long
    lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row + 1
    
    Dim rng As Range
    Set rng = ActiveCell
    
    If ActiveSheet.Name = ws1.Name And rng.Row >= 3 Then
        ws2.Rows(lastRow).Value = ws1.Rows(rng.Row).Value
        ws1.Rows(rng.Row).Delete
    End If
    
End Sub

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

    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Worksheets("商品一覧")
    Set ws2 = Worksheets("削除済み")

移動元、移動先のシート情報を変数「ws1、ws2」に割り当てています。

    Dim lastRow As Long
    lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row + 1

移動先のシート(「削除済み」シート)のデータを追加する行の行番号を取得し、変数「lastRow」に割り当てています。
移動先のシート(「削除済み」シート)のB列の最終行のセルを基準に、「Ctrl+↑」で移動した先のセルの行番号に1を加えた番号を取得しています。

    Dim rng As Range
    Set rng = ActiveCell

実行時に選択されているセル(複数選択の場合は選択基準のセル)の情報を、変数「rng」に割り当てています。

    If ActiveSheet.Name = ws1.Name And rng.Row >= 3 Then
        ws2.Rows(lastRow).Value = ws1.Rows(rng.Row).Value
        ws1.Rows(rng.Row).Delete
    End If

実行時に選択されているシートが移動元のシート(「商品一覧」シート)であり、尚且つ、実行時に選択されているセルの行番号が3以上の場合にIfの中の処理を実行します。
Ifの中の処理では、移動元のシート(「商品一覧」シート)の選択されている行全体の値を、移動先のシート(「削除済み」シート)の表の末尾(lastRow)に入力しています。
入力後、移動元のシート(「商品一覧」シート)の選択されている行全体を削除しています。

以上の内容で、実行時に選択されているセルのデータを「削除済み」シートに移動することができます。


手順3: ボタンの作成

コードが完成しましたら、「商品一覧」シートに実行用のボタンを用意します。

ボタンは、[開発]タブの中の[挿入]から作成することができます。

ExcelVBAレベル確認

完成

以上の手順で、機能が完成します。
実行することで、以下のように、実行時に選択しているセルの行のデータを「削除済み」シートの表の末尾に移動することができます。

▼サンプルファイル▼