t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA SplitとJoinを使って、文字列型配列の要素数を数える。

先ほどこのような記事を書いた。
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

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。