リリースに必死で、細かいバグが(汗)
ご迷惑おかけしてたらごめんなさい...
直すついでに、
Dictionary使いとして、
参照設定ボタンを踊る検索フォームにこっそり追加したり、
ボタン押下で使用例を表示したりしてみました~ノ゚∀゚)ノ
先に修正したバグ内容を...
・VBE起動時に、カーソル点滅が見えなくなる(マウスでクリックとか他の操作すると元通り)
→ カーソルが消えないよう調整(しかし、VBE.Windowsにアクセスすると消えるってどういうことだよ...)
・検索で、コードの後ろにコメントがある場合に正しく検索できない不具合を解消
通常の検索では、コメントを除去して検索してます。
下記のように、後ろにコメントがある場合に正しく処理できず、コードが欠損してました...
例:Dim i As Long '行番号
・検索で、単語区別オプションにチェック入れて検索すると、Excelが落ちる...
VBEアドインの難しさを目の当たりにしました...まさか落ちるなんて(大汗)
全体的に、エラー回避の処理を追加し、クラッシュ対策を施したので、
何かのバグで落ちることが回避できるようになったと思います...
(予期せぬエラー・・・というメッセージが出たらご連絡頂けると助かりますm(_ _)m)
バグ修正、以上。
さて、今回は改良に時間があまりとれなかったので少しだけ~ノ゚∀゚)ノヤットサー!
<1>検索方法にツールチップを追加
ひょっとしたらもう気付いている人もいるかもですが、
踊る検索では、検索で Like や RegExe(正規表現) が使用できるんです~
ココ、ココ!!
検索ボタンの下にあるコレを、「Like」や、「RegExe」にすることで、
単なる部分一致から、より自由に検索できるように!!
ただ、Likeってどんなだっけ?? とか、
正規表現って何があったっけ?? とか、
すぐに思い出せないこともあると思います(自分はしょっちゅう(汗))
そこで、上記ラベルにツールチップ(ヒント)を表示するようにしました~!!!!
これがやってみると、意外と難易度高くてツラかった(笑)
こんな感じで表示されるので、
ちょっと思い出したい時にいいかも~♪
(かるーく他HPからコピペしたものなので、誤字脱字あればご連絡頂けると幸いです)
<2>Scriptingの参照設定をボタン1つで
自分はFSOやDictionaryをよく使いますが、
参照設定が面倒だから敬遠してしまってる人もいるんじゃないでしょうか~?!?!
いや、実際面倒だし・・・
けど、上記2つを使わないのはめちゃくちゃ損してると思いますよ~
確かにわかります!!
なんで参照設定があんなに遠いのか!! と...
Microsoft Scripting Runtime の前後に、
Microsoft Script Control だの、
Microsoft Scriptlet Library だの、
まぎらわしいねん~!! と...
そこで!!
そんなあなたの為に!!
参照設定のボタンをこっそり付けてみました~!!!
本来、検索画面には不要なのですが、
参照設定用の画面作るのも大変なので
ひとまずここに置いてみました(笑)
※いつかは、楽々参照設定の画面も作って移したい...
これを押すと....
こんなメッセージが出て、
参照設定が一瞬でできちゃいます!!!
FSOの定義の仕方や、
Dictionaryの使い方まで押し売りしてます(笑)
もしメッセージ内容をもう一度見たい時は、
ボタンをもう一度押すと...
同じ雰囲気で出ます~ノ゚∀゚)ノ
Dictionaryは本当に使い勝手がいいので、
これに慣れてしまうと元に戻れなくなります(笑)
SUMIF、COUNTIF的な使い方や、
存在チェック、重複チェックなんかは割愛して、
僕が発明した(いや他にも誰かやってるだろ....)
動的配列と、差分検出について補足しておこうかと~
<動的配列>
配列を動的に大きくするのって、普通は Redim Preserve を使うって教わるんですよね。
けど、Preserve って書くの面倒だし、
処理はどんどん遅くなるし、
変数名を変えた時にコンパイルで検出できずに通ってしまってバグるし、
デメリットが多数(T_T)
そこでDictionaryの出番です!!
例えば長いメッセージを表示したい時
*********************************************************
Dim Dic As New Scripting.Dictionary
Dic.Item(Dic.Count) = "●Dictionaryの使用例"
Dic.Item(Dic.Count) = ""
Dic.Item(Dic.Count) = "・SUMIF Dic.Item([Key]) = Dic.Item([Key]) + [Value]"
Dic.Item(Dic.Count) = ""
Dic.Item(Dic.Count) = "・COUNTIF Dic.Item([Key]) = Dic.Item([Key]) + 1"
Dic.Item(Dic.Count) = ""
Dic.Item(Dic.Count) = "・存在チェック If Dic.Exists([Key]) = False Then Exit Function"
Call MsgBox(Join(Dic.Items, vbCrLf))
*********************************************************
こんな感じでできちゃいます。
何がいいかって、
配列だと要素の番号も修正しなきゃなので大変ですが、
行の追加・削除、入れ替えが自由なんです!!
SQLや、VBSをVBA中で生成するケースもありますが、
そいういう時にも効果的です♪
CSVの読み取りなんかも使えて、
Dic.Item(Dic.Count) = Split([Line],",")
と、辞書に1次元配列を溜めておいて、
最後に2次元配列にして貼り付けるとかね♪
※1x1次元配列を2次元配列に変換する関数はこちら
<差分検出>
Dictionaryは、AddやItem、Existsなんかはよく使いますが、
Remove を使うことってなかなか無いのでは!?
けど実は凄く効果的な使い方ができるんです!!
そう! DIFF!!
こちらのコードを動かすと分かりやすいかと~ノ゚∀゚)ノ
******************************************************************************************************************
Private Function prDiffSample()
Dim DicA As New Scripting.Dictionary
Dim DicB As New Scripting.Dictionary
Dim DicC As New Scripting.Dictionary
DicA.Item("A") = 1
DicA.Item("C") = 2
DicB.Item("B") = 3
DicB.Item("C") = 4
Dim Key As Variant
For Each Key In DicA.Keys
If DicB.Exists(Key) = True Then
DicC.Item(Key) = DicA.Item(Key) + DicB.Item(Key)
Call DicA.Remove(Key)
Call DicB.Remove(Key)
End If
Next
End Function
******************************************************************************************************************
この結果、
DicAにはDicBに無いもの
DicBにはDicAに無いもの
DicCには共通のもの
が格納されるので、
後はお好きなように~♪
ダウンロードサイトへ ノ゚∀゚)ノヤットサー!