ハンガリアン記法が大嫌いです!!←
いや 記法そのものはいいんですけど、
使ってる人のコードが意味なく長いことが多いのが原因。
というわけで、前回の続きです。
めんどくさくなってセルの色を塗るのは忘れることに。
データを積み込んでいって数を数える感じに。
割りと結構よく使うテクニックが入ってるので丁度いいんです。
dictonaryもほどよく使いますし。
適当にB2セルから始まる表だと思ってくだされ
Sub dictionaryを使う() Dim tmp tmp = Range("B2").CurrentRegion Dim x, y As Long Dim dic As Scripting.Dictionary Set dic = New Dictionary For y = 1 To UBound(tmp) For x = 1 To UBound(tmp, 2) If dic.Exists(tmp(y, x)) = False Then dic.Add tmp(y, x), 1 Else dic(tmp(y, x)) = dic(tmp(y, x)) + 1 End If Next Next y Dim i As Long Dim d Debug.Print "--------------for each" For Each d In dic Debug.Print d, dic(d) Next Debug.Print "--------------for ループ" For i = 0 To dic.Count - 1 Debug.Print dic.Keys(i), dic(dic.Keys(i)) Next End Sub
最初は日本語の変数、プロシージャ名使っておっけー
私の教えるときはなぜ使わないか体感できるくらいまで
折れずにプログラム書いてもらうのが目的です。
英語名でやらなきゃとかぐだぐだやってる暇があるなら
さっさと日本語使って下さい。
セルから配列につっこむ
tmp = Range("B2").CurrentRegion
これのことです。Set がないことに注意。
お決まりのテクニックですね。インデックス1から始まるのもお約束
このへんでオブジェクトを変数に入れるときはSetだってのと
一緒におぼえるといいかんじ。
CurrentRegionは便利なはずなんですが、、、なんとなく信用おけなくて苦手です。
2重ループと配列の要素数
これがすんなり書けるかどうかです。
For y = 1 To UBound(tmp) For x = 1 To UBound(tmp, 2) Debug.Print tmp(y, x) Next Next y
職業訓練でも3回も別の言語で勉強したのに
2重ループが怪しい人は結構いました
ついでにForeachに書き直す練習もしときましょう!
Dictionaryと
わたしのともだち、Scripting Runtimeさんです。
Javascriptも触る人はlengthじゃなくてcountだよ!とか。
そして、dicationaryにはソートがないのも記憶しときましょう。
探してもないもんはないのです←
データの整合性
こういうExcelからデータを溜め込む段階で発覚することがあります。
たとえば「なずな」と「なずなちゃん」は同一にしたい、とか
名字でしか書いて無くて意図しない重複が後から発覚するなどです。
(S籐さんが最初は一人であとから着任したとか)
作成段階での定義になるので、使用方法を強制できるか
その必要があるかを考える必要があるのを覚えましょう。
それやりたくなったらAccessさんの出番かもしれません。
SQLのSelectとgroup使いたくなる
知らない人はここでSQLの存在だけ知っておきましょう。
ちゃんとしたデータならいろいろできる!ってことで。
もう1回だけつづくかも~