はじめに
入力データのチェックを行うプログラムの作成を行う。問題は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などで検索する場合、検索ワードは先頭に、孤立じじい、と入力しその後に、グローバルメニュー・サブメニュー記事のどれかひとつの項目を入力すると、その検索サイトが上位表示されます。