先ほどこのような記事を書いた。
thom.hateblo.jp
SplitとJoinで面白いことができると思ったんだけれど、とんだ勘違いだった。まぁ、できるにはできるが、わざわざ2つも関数を持ち出さなくても、Replaceを使った方が良い。
ということでなんかJoinも活躍の場がないかなと探していたところ、文字列型配列の集計マクロに使うことを思いついた。
以前、Dictionaryを使って配列要素を数えるマクロを書いたのだが、これをSplitとJoinでもっと手軽にやってみようと思う。
thom.hateblo.jp
これは、配列("A", "A", "B", "C", "A", "B", "A")があった時に、それぞれA、B、Cの個数を集計するというもの。
コードはこうなった。
Sub Splitでカウント() Dim arr As Variant: arr = Array("A", "A", "B", "C", "A", "B", "A") Dim str As String: str = Join(arr, "_") Debug.Print UBound(Split(str, "A")) Debug.Print UBound(Split(str, "B")) Debug.Print UBound(Split(str, "C")) End Sub
まず配列の要素をアンダーバーでくっつけて一つの文字列にしてしまう。
すると、"A_A_B_C_A_B_A"という文字列ができる。
それからその文字列に対し、探したい文字列でSplitする。
例えばAでSplitすると、"", "_", "_B_C_", "_B_", ""という配列ができる。
Uboundとすると4が取れるのでそれがAの個数となる。
※要素は0~4番の5個であるが、デリミタの数を数えるので、4個で良い。
ひと文字じゃなくても対応可能である。
Sub 複数文字でも() Dim arr As Variant: arr = Array("Apple", "Apple", "Banana", "Orange", "Apple", "Banana", "Apple") Dim str As String: str = Join(arr, "_") Debug.Print UBound(Split(str, "Apple")) Debug.Print UBound(Split(str, "Banana")) Debug.Print UBound(Split(str, "Orange")) End Sub
以上