【エクセルVBA】

ある配列があります。配列の個数は動的に決まりますが、その配列数は知ることが出来ます。

配列の中には、例えば「コーヒー, お茶, ジュース, コーヒー」といった文字列が格納されています。
すべての文字列(コーヒーでもジュースでも何でも)は、一つの配列内に2個以上含まれているかもしれないし、一個も含まれていないかもしれません。
マクロ実行のたびに新たに「ビール」という文字列が追加されているかもしれません。

このような状況で、
すべての文字列とのその文字列の個数を調べるにはどうしたらよいでしょうか。
調べた結果は

コーヒー 0
ジュース 2
ワイン  3
紅茶   8

という具合になります。
for文でぐるぐる回せば出来ることはわかっているのですが、簡単にスマートに出来る方法を教えてください。
宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/15 14:47:17
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gong1971 No.1

回答回数451ベストアンサー獲得回数70

ポイント65pt

Dictionaryオブジェクトを使うと便利です。


Dictionaryオブジェクトを使う前にマクロの編集画面で、

[ツール]メニューから[参照設定]の画面を開き、

"Microsoft Scripting Runtime"のチェックを入れます。


上記の設定をした上で下記のコードを実行します。

'### データが入力された配列を x() とします
Dim dct As Scripting.Dictionary
Set dct = New Scripting.Dictionary
For i = 1 To UBound(x)
If dct.Exists(x(i)) Then
    j = dct.Item(x(i))
    dct.Remove x(i)
    dct.Add x(i), j + 1
Else
    dct.Add x(i), 1
End If
Next
For i = 1 To dct.Count
Cells(i, 1) = dct.Keys(i - 1)
Cells(i, 2) = dct.Items(i - 1)
Next

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

id:Nigitama

ありがとうございます!

"Microsoft Scripting Runtime"ですか。。

見たことないですが、早速試してみます。

ありがとうございました!

2006/06/15 14:46:02

その他の回答1件)

id:gong1971 No.1

回答回数451ベストアンサー獲得回数70ここでベストアンサー

ポイント65pt

Dictionaryオブジェクトを使うと便利です。


Dictionaryオブジェクトを使う前にマクロの編集画面で、

[ツール]メニューから[参照設定]の画面を開き、

"Microsoft Scripting Runtime"のチェックを入れます。


上記の設定をした上で下記のコードを実行します。

'### データが入力された配列を x() とします
Dim dct As Scripting.Dictionary
Set dct = New Scripting.Dictionary
For i = 1 To UBound(x)
If dct.Exists(x(i)) Then
    j = dct.Item(x(i))
    dct.Remove x(i)
    dct.Add x(i), j + 1
Else
    dct.Add x(i), 1
End If
Next
For i = 1 To dct.Count
Cells(i, 1) = dct.Keys(i - 1)
Cells(i, 2) = dct.Items(i - 1)
Next

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

id:Nigitama

ありがとうございます!

"Microsoft Scripting Runtime"ですか。。

見たことないですが、早速試してみます。

ありがとうございました!

2006/06/15 14:46:02
id:oxlip No.2

回答回数3ベストアンサー獲得回数0

ポイント5pt

ピポッドテーブルを用いて集計しては如何でしょうか?

マクロに組み込む事も可能です。

id:Nigitama

残念ですが、すべて変数上で行いたいのです。

データの管理とUIは完全別個がベターです。

2006/06/15 14:46:37
  • id:gong1971
    ポイントありがとうございます。

    > 一個も含まれていないかもしれません。
    > コーヒー 0

    以上の条件を抜かしていました。データの配列になくても、
    リストの配列にあれば個数を0として表示したいという事ですよね?
    であれば最初のFor文の前に下記のコードを挿入してください。

    -----
    For i = 1 To UBound(y)
    dct.Add y(i), 0
    Next
    -----

    ちなみにリストの配列は y() とします。
    y() はリストなので重複無しと仮定してます。

    # ちなみに最初のコードですが、For文のインデントがおかしかったですね。(^^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません