Excel VBA 事例 演習 基礎問題 part2

はじめに

入力データのチェックを行うプログラムの作成を行う。問題は3問あり、ひとつは勤怠管理表のなかで、数値と文字列を区別するものを行い、もう一題は、前問に空白セルを入れて、そのセルを赤で塗ることであり、3題目は表記のゆれを統一した文字(全角カタカナ)に置き換える問題である。

問題1

問題の図。このなかに:と;が混じっている

問題);のデータに黄色の色を塗ること

データ
氏名 開始時刻 終了時刻 勤務時間
森 彩夏 10:04 22:48 12:43
菊地 鈴 9:50 20:52 11:02
千葉 陸斗 10:04 20:09 10;04
佐藤 悠 10;33 20:09 9:36
武田 太一 11:16 22:04 10:48
岩崎 拓磨 8:52 18:14 9:21
田村 一樹 8:38 21:21 12:43
木下 優花 8:24 18:14 9;50
柴田 悠斗 8:38 20:24 11:45
山崎 美月 8:38 18:28 9:50
工藤 太陽 11:16 22:33 11;16
増田 萌花 10:19 20:52 10:33
宮崎 明日香 11:31 21;36 10:04
三浦 奈々 8:24 22:19 13:55
高木 千尋 9:21 20:24 11:02
小野 綾音 11:16 20:24 9:07
斎藤 美空 8:24 20:09 11:45

このデータを使い、;の文字列になっているデータを黄色で塗りつぶすプログラムを作成する。

コード

Option Explicit
Option Base 1


Sub main()
    Call data_check
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

Sub data_check()
    Dim strtcll As String, endcll As String
    Dim rng As Range
    
    strtcll = "B2"
    endcll = "D18"

    For Each rng In Range(strtcll, endcll)
        If IsNumeric(rng.Value) = False Then
            rng.Interior.Color = vbYellow
        Else
            rng.Interior.ColorIndex = 0
        End If
    Next rng
 End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

解説

処理のコード自体に複雑なものはないと思う。

始点と終点のセルを直接代入し

For Each 文でセルをひとつずつまわして(part1でも書いたが、For Each文のときはsetステートメントは必要ない)

IsNumericで数値でなければ黄色(vbYellow)を塗り、そうでなければ、色を塗らない処理をしているだけである。注意して欲しいのは、色を塗らない場合は、

Interior.ColorIndex = 0

というように、ColorではなくColorIndexを使うことである。0は何も塗らないという数である。(ColorIndexの番号はネットを検索すればいくらでも出てくるので、興味のある人は調べて欲しい)

プログラム全体はmainと、サブルーチンのdata_check()で作成されている。サブルーチンの練習のため、なるべく使った方がいいと思い、この程度のコードでもサブルーチンとした。

問題2

この表には:と;、そして空欄が入っている

問題);の入っているセルに黄色を塗り、空白セルには赤色を塗ること

データ
氏名 開始時刻 終了時刻 勤務時間
森 彩夏 10:04 22:48 12:43
菊地 鈴 9:50 20:52  
千葉 陸斗 10:04 20:09 10;04
佐藤 悠 10;33 20:09 9:36
武田 太一 11:16 22:04 10:48
岩崎 拓磨 8:52 18:14 9:21
田村 一樹 8:38 21:21 12:43
木下 優花   18:14 9;50
柴田 悠斗 8:38 20:24 11:45
山崎 美月 8:38 18:28 9:50
工藤 太陽 11:16 22:33 11;16
増田 萌花 10:19 20:52 10:33
宮崎 明日香 11:31 21;36 10:04
三浦 奈々 8:24 22:19 13:55
高木 千尋 9:21 20:24 11:02
小野 綾音 11:16   9:07
斎藤 美空 8:24 20:09 11:45
コード

Option Explicit
Option Base 1
Sub main_click()
    Call data1_check
End Sub
 ーーーーーーーーーーーーーーーーーーーーーーー   
Sub data1_check()
    Dim strtcll As String, endcll As String
    Dim rng As Range
    Dim i As Integer

    strtcll = "B2"
    endcll = "D18"

    
    For Each rng In Range(strtcll, endcll)
        If rng = "" Then
            rng.Interior.Color = vbRed
        ElseIf IsNumeric(rng.Value) = False Then
            rng.Interior.Color = vbYellow
        Else
            rng.Interior.ColorIndex = 0
        End If
    Next rng
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

解説

コードの流れ全体に変更はない。ただ、空白セルを表すときにrng = ""という命令を使っただけである。

IF文に関しては、ElseIfという命令を追加して、分岐を3つにしてある。これを使えば分岐はいくらでも可能だが、分岐が多くなったときは、Select Case文を使えるようになって欲しい。

問題3

左の表から右の表のようにデータを変換する

問題)全角カタカナに表記を統一せよ。

データ
氏名 設問1 設問2 設問3
山本 一真
田中 遥  イ
石川 凌  え
森田 颯人
原田 樹  あ
村田 桃香
内田 大貴 エ 
中山 伊吹  ア
藤本 新  お
竹内 和奏
コード

Option Explicit
Option Base 1

Sub main()
    Call data_cleansing
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー
Sub data_cleansing()
    Dim strtcll As String, endcll As String
    Dim clndt As Variant, valdt As Variant
    Dim i As Integer, j As Integer
    
    strtcll = "B2"
    endcll = Cells.SpecialCells(xlCellTypeLastCell).Address
    clndt = Range(strtcll, endcll)
    
    For i = 1 To UBound(clndt, 1)
        For j = 1 To UBound(clndt, 2)
            valdt = clndt(i, j)
            valdt = Trim(valdt)
            valdt = StrConv(valdt, vbKatakana)
            valdt = StrConv(valdt, vbWide)
            clndt(i, j) = valdt
        Next j
    Next i
    Range(strtcll, endcll) = clndt
End Sub

ーーーーーーーーーーーーーーーーーーーーーーー

解説

最終セルをとるのに

 Cells.SpecialCells(xlCellTypeLastCell).Address

というコードで表現している。SpecialCellsでLastCellを特定し、Addressによって、そのセル番号を取っている。このやり方は便利な方法なので覚えておいて損はない。また中に書くxlCellTypeLastCellは種類があるので、興味のある人はネットで調べて欲しい。

For文が2重になっているが、これは行と列を一つずつ回しているのである。外側のFor文が1行目のとき、中のFor文が1行目の列全部を回してチェックし、値を変換しているのである。

変換は

    valdt = clndt(i, j)
            valdt = Trim(valdt)
            valdt = StrConv(valdt, vbKatakana)
            valdt = StrConv(valdt, vbWide)
            clndt(i, j) = valdt

である。

まずデータをvaldtへいれ、trimで空白を取り除き、StrConv(valdt, vbKatakana)でカタカナ表記にし、StrConv(valdt, vbWide)で全角カタカナへ変換して、最後にもう一度データへ値(valdt)を戻し、Range(strtcll, endcll) = clndtによって、表全体に変換したデータを代入している。

この変換作業は1回しかできないので、元データは別のシートにコピーしておいて、何度も繰り返し使えるようにしておいた方がいいと思う。

サイトご利用方法

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

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