Excel VBA 事例 演習 基礎問題+α part2

はじめに

表の中に空白行および空白セルがあった場合、空白行は削除し、空白セルがある行はエラーとして別シートに保存するプログラムを書く。

重複名簿は、同じデータが入っている場合に、新しい方のデータに古いデータ番号を記述するプログラムを書く。

問題1

左側が元データ。右側がエラーとして処理したデータ

元データから、エラーを抽出するプログラムを書け。

解答

データ
注文番号 注文日 顧客名 商品名 数量
772204 2022/10/1 株式会社モーリス 刃具部品 100
328352 2022/10/1 英産業株式会社 治工具 600
202610 2022/10/1 ヒマラヤ株式会社 電子部品金型  
692409 2022/10/2 西園寺鉄鋼株式会社 ネクター金型 300
099763 2022/10/2 西園寺鉄鋼株式会社   500
712421 2022/10/2 株式会社ロードス プラスチック金型 300
         
611683 2022/10/3 ヒマラヤ株式会社 電子部品金型 400
863786 2022/10/3 株式会社橘 治工具 500
445160 2022/10/3   治工具 200
256057 2022/10/4 ユビネックス商事(株) プラスチック金型 900
920339 2022/10/4 テンジンパイプ株式会社 ダイヤモンド金型  
386812 2022/10/4 大竹工機株式会社 電子部品金型 500
792409 2022/10/5 三崎産業株式会社 刃具部品 800
992272 2022/10/5 ヒマラヤ株式会社   100
111637 2022/10/5 三崎産業株式会社 刃具部品 100
         
176220 2022/10/6 ユビネックス商事(株) プラスチック金型 500
697265 2022/10/6 オール鉄鋼株式会社 超硬金型部品  
105005 2022/10/6 (株)カドワキ 電子部品金型 100
932738 2022/10/6   超硬金型部品 100
コード

Option Explicit
Option Base 1
Sub main()
    Dim written As Integer, i As Integer, blnkcll As Integer
    Dim rng As Range
    
    Sheets("エラー").UsedRange.Offset(1, 0).EntireRow.Delete
    
    written = 2
    
    With Sheets("注文一覧")
        For i = 2 To .UsedRange.Rows.Count
            Set rng = .Range("A" & i, "E" & i)
            blnkcll = WorksheetFunction.CountBlank(rng)
            
            If blnkcll > 0 Then
                If blnkcll < 5 Then
                    rng.Copy Sheets("エラー").Cells(written, 1)
                    written = written + 1
                End If
                .Cells(i, 1).EntireRow.Delete
            End If
        Next i
    End With
        
End Sub

ここでは、CurrentRegionではなくusedrangeを用いたが、どちらを使ってもいい。空白セルをとるにはワークシート関数のCountBlankを用いて、空白が5列より少なければエラーシートへ出力し、5列かそれ以上であれば削除している。コードの流れとしてはこの程度である。

後は、元表に挿入したコマンドボタンにmainを登録するだけである。

元表の結果

元表はきれいなデータのみが残る
エラーシートの結果

エラーシートには空白セルがあるデータのみになる

問題2

重複している氏名と生年月日があれば、会員番号が古い方から新しい方へ右端に書かれる

重複したデータを抽出し、古い会員番号を新しい会員の右端へ記入せよ。

解答

データ
会員番号 氏名 生年月日 重複番号
S001 谷口 こころ 1990/3/11  
S002 伊藤 愛実 1975/5/18  
S003 斉藤 葵 1984/2/10  
S004 久保 琉生 1982/8/14  
S005 新井 歩夢 1971/7/1  
S006 太田 美結 1985/6/13  
S007 久保 琉生 1982/8/14  
S008 大塚 瑞希 1979/4/11  
S009 坂本 彩 1999/5/14  
S010 伊藤 愛実 1975/5/18  
S011 後藤 綾香 1966/3/9  
S012 谷口 こころ 1990/3/11  
S013 近藤 大地 1972/7/10  
S014 坂本 彩 1999/5/14  
S015 大塚 瑞希 1979/4/11  
コード

Option Explicit
Option Base 1
Sub main()
    Dim cstmr As Variant
    Dim i As Integer, j As Integer
    Dim member As String, namedt As String, brthdy As String
    Dim member1 As String, namedt1 As String, brthdy1 As String
    
    cstmr = Sheets("顧客名簿").Range("A1").CurrentRegion
    
    For i = UBound(cstmr) To 2 Step -1
        member = cstmr(i, 1)
        namedt = cstmr(i, 2)
        brthdy = cstmr(i, 3)
        
        For j = 2 To UBound(cstmr)
            member1 = cstmr(j, 1)
            namedt1 = cstmr(j, 2)
            brthdy1 = cstmr(j, 3)
            
            If member > member1 And namedt = namedt1 And brthdy = brthdy1 Then
                Sheets("顧客名簿").Cells(i, 4).Value = member1
                Exit For
            End If
        Next j
    Next i
End Sub

外側のFor Next文は、最下行から上へ走らせ、内側のFor Next文は最上位から下へ走らせている。ここで条件が一致したら、4列目(右端)に会員番号を書くようにしている。動きとしては最下行1行に対して内側の最上位から最終行へはしらせ、というように、外側一行に対して内側は全部を走破している点に注意して欲しい。

コードは以上である。

実行した結果

古い方の会員番号が新しい方へ書き込まれている

サイトご利用方法

次のページ・前のページを利用するよりも、グローバルメニュー(ヘッダー部分にある項目)・サブメニュー記事の項目をクリックしていただければ、その項目の全体像が一目でみることができ、クリックすればそのサイトへ飛びます。

google、yahoo、Bingなどで検索する場合、検索ワードは先頭に、孤立じじい、と入力しその後に、グローバルメニュー・サブメニュー記事のどれかひとつの項目を入力すると、その検索サイトが上位表示されます。