なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

重複データを見つける~VBA講座:dictionaryを使ってみる~

f:id:nazuna_0124:20170312082946p:plain

ハンガリアン記法が大嫌いです!!←


いや 記法そのものはいいんですけど、

使ってる人のコードが意味なく長いことが多いのが原因。



というわけで、前回の続きです。

めんどくさくなってセルの色を塗るのは忘れることに。

データを積み込んでいって数を数える感じに。


割りと結構よく使うテクニックが入ってるので丁度いいんです。

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回だけつづくかも~