For Each … Nextで条件分岐したいとき②

ユーザーフォーム Excel VBA For Each…Next

2023年9月の記事でFor Each…Nextの使い方を書きましたが、実際にFor Each…Nextを使用する場合どのようにプログラムの中に組み込めばよいのか悩まれている方も多いのではないでしょうか。

そこで今回はExcelVBAで簡単な蔵書管理ができるプログラムを作成して、For Each…Nextを使用してどんなことができるのかを見ていきたいと思います。

下記の ( サンプルプログラム 1 ) の上から35行目の「本のジャンルのシートがあるかFor Eachで調べます」のコメントの下にFor Each…Nexが組み込まれています。

指定したシート(本のジャンルのシート)があるか調べるためにFor Each…Nextを使っていますのでプログラム作成の参考にしていただければ幸いです。

■蔵書管理ができるプログラムの作成手順

1. エクセルシートを開きます

2. A3から下に連番を入力します、項目名はB2に「本のジャンル」、C2に「本のタイトル」、D2に「著者」、E2に「出版社」、F2に「ISBN」を入力します。

3. 各シートに名前を付けます、「シート1」は「蔵書管理表」、「シート2」は「ビジネス」、「シート3」は「科学・テクノロジー」、「シート4」は「コンピュータ・IT」、「シート5」は「趣味」、「シート6」は「資格・検定」、「シート7」は「語学」、「シート8」は「漫画」にします。

4. VBEを起動して[挿入]メニュー → [ユーザーフォーム]でユーザーフォームを作成します。

5. ユーザーフォームにテキストボックスを5つ作成します。

6. テキストボックスの右横にラベルを貼り付けてラベルのプロパティのCaptionを「本のジャンル」「本のタイトル」「著者」「出版社」「ISBN」にします。

7. ユーザーフォームにコマンドボタンを1つ作成してコマンドボタンのプロパティのCaptionを「新規登録」にします。

8. 作成したコマンドボタンをダブルクリックしてフォームのコードウィンドウを開きPrivate Sub CommandButton1_Click()に以下のコードを貼り付けます。

( サンプルプログラム 1 )

Option Explicit

Private Sub CommandButton1_Click()

   Sheets("蔵書管理表").Select
   
  '----------------------------------------
  'テキストボックスに入力があるか確認します
  '----------------------------------------
   If UserForm1.TextBox1.Text = "" Then
   
      MsgBox "「本のジャンル」を入力してから新規登録ボタンを押して下さい。"
      UserForm1.TextBox1.SetFocus
      Exit Sub
   
   ElseIf UserForm1.TextBox2.Text = "" Then
   
      MsgBox "「本のタイトル」を入力してから新規登録ボタンを押して下さい。"
      UserForm1.TextBox2.SetFocus
      Exit Sub
   
   End If
   
  '------------------------------------------------------------------------
  '本のタイトルが重複していないか蔵書管理表(Sheet1)のC列をCountIfで調べます
  '------------------------------------------------------------------------
   If WorksheetFunction.CountIf(Columns("C"), TextBox2.Value) > 0 Then
   
      MsgBox "本のタイトル「" & TextBox2.Value & "」が重複しているので登録しません。"
      Sheets("蔵書管理表").Select
      Exit Sub
         
   End If
   
  '----------------------------------------------
  '本のジャンルのシートがあるかFor Eachで調べます
  '----------------------------------------------
   Dim Sheet As Worksheet
   Dim Flag As Boolean
   
   For Each Sheet In Worksheets
      
      If Sheet.Name = TextBox1.Text Then Flag = True
      
   Next Sheet
   
   If Flag = True Then  '本のジャンルのシートがある場合の処理
       
      MsgBox "ユーザーフォームの値を「蔵書管理表」に登録します。"
      Cells(ActiveCell.Row, "B").Value = TextBox1.Text
      Cells(ActiveCell.Row, "C").Value = TextBox2.Text
      Cells(ActiveCell.Row, "D").Value = TextBox3.Text
      Cells(ActiveCell.Row, "E").Value = TextBox4.Text
      Cells(ActiveCell.Row, "F").Value = TextBox5.Text
        
   Else  '本のジャンルのシートがない場合の処理
   
      MsgBox "本のジャンル「" & TextBox1.Value & "」のシートがありません、作成してください。"
      UserForm1.TextBox1.SetFocus
      Exit Sub
      
   End If
     
  '--------------------------------------------------
  'ユーザーフォームに入力した値を各シートに転記します
  '--------------------------------------------------
   MsgBox "ユーザーフォームの値を「" & TextBox1.Text & "」のシートに転記します。"
    
   Dim Target As Range
    
   If TextBox1.Value = "ビジネス" Then
    
      Sheets("ビジネス").Select
       
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
    
   ElseIf TextBox1.Value = "科学・テクノロジー" Then
    
      Sheets("科学・テクノロジー").Select
       
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
    
   ElseIf TextBox1.Value = "コンピュータ・IT" Then
    
      Sheets("コンピュータ・IT").Select
       
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
    
   ElseIf TextBox1.Value = "趣味" Then
    
      Sheets("趣味").Select
    
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
    
   ElseIf TextBox1.Value = "資格・検定" Then
    
      Sheets("資格・検定").Select
    
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
    
   ElseIf TextBox1.Value = "語学" Then
    
      Sheets("語学").Select
    
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
       
   ElseIf TextBox1.Value = "漫画" Then
    
      Sheets("漫画").Select
    
      Set Target = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
    
      Target.Value = TextBox1.Value
      Target.Offset(0, 1).Value = TextBox2.Value
      Target.Offset(0, 2).Value = TextBox3.Value
      Target.Offset(0, 3).Value = TextBox4.Value
      Target.Offset(0, 4).Value = TextBox5.Value
   
   End If
    
   Sheets("蔵書管理表").Select
    
End Sub

9. [挿入] メニュー → [標準モジュール]で標準モジュールを作成します。

10. 標準モジュールに以下のコードを貼り付けます。

( サンプルプログラム 2 )

Option Explicit

Sub ユーザーフォーム1を表示()
    
   Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Select
   UserForm1.Show 
   UserForm1.TextBox1.SetFocus
   
End Sub

11. エクセルの「蔵書管理表」シートを表示して [挿入] タブの [図形] → 正方形/長方形でワークシート上に図形を挿入して図形に「フォーム表示」の文字を入力します。作成した図形を右クリックして「マクロの登録」を選び「ユーザーフォーム1を表示」を登録します。

12. フォーム表示ボタンをクリックするとユーザーフォームが表示されます。

少し長くなりましたので今回はここまで続きは次回のブログで・・・・・

コメント