ここから本文です

ACCESSのVBAで配列内の文字列の個数を配列に入れたいです。

ala********さん

2018/9/811:19:59

ACCESSのVBAで配列内の文字列の個数を配列に入れたいです。

Sub Sample()
Arr = Split("aa,aa,bb,bb,cc,cc,d", ",")

'buf = [aa,bb,cc] となる
buf = 重複削除(Arr) End Sub

Function 重複削除(Arr)

Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
For i = 0 To UBound(Arr)
Dic.Add Arr(i), Arr(i)
Next
重複削除 = Dic.Keys
End Function


上記のプログラムで重複分は削除出来るのですが、配列内の文字列の
個数を(cnt)配列に入れたいです。

例 cnt [ i ] (値:aa) =2
cnt [ i+1 ] (値:bb) =2
cnt [ i+2 ] (値:cc) =2
cnt [ i +3] (値:d) =1


なにか良い方法はありませんでしょうか。

閲覧数:
86
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

kik********さん

2018/9/813:23:33

Dictionary を使って、重複排除しながら出現個数を求める時は
以下のような記述にすれば、楽です


Dim dic As Object
Dim vA As Variant, vK As Variant

Set dic = CreateObject("Scripting.Dictionary")

For Each vK In Split("aa,aa,bb,bb,cc,cc,d", ",")
   dic(vK) = dic(vK) + 1
Next

vK = dic.Keys
vA = dic.Items


※ ご質問にあった Dic.Add Arr(i), Arr(i) は、
単に重複を排除しているだけで、キーに関連する値は使ってません
また、Dic.Add 時、既にキー登録されているとエラーになるので、
On Error Resume Next で、エラー発生を無視する記述が必要になります

>   dic(vK) = dic(vK) + 1

この記述にすると、右辺の dic(vK) 部分で、
キーを覚えていたら、関連する値を・・・
覚えていなかったら、キー登録した後、初期値 Empty が返ってきます

※ Dic.Add Arr(i), Arr(i) と同じことをするのなら
Dic(Arr(i)) = Arr(i) と、私なら記述します
(On Error Resume Next は記述不要に)
重複を排除するだけなら Dic(Arr(i)) = Empty でも同じ


"aa" を処理してみると
dic("aa") + 1 → キー登録後( Empty ) + 1 → 0 + 1
この 1 で、dic("aa") = 1 したことに
続けて "aa" を処理すると
dic("aa") + 1 → 1 + 1 で、dic("aa") = 2 したことに


※ 先のご質問にも記述しましたが、
> 単に CreateObject("Scripting.Dictionary") したままでは、
> キーとして覚えるのは バイナリ 比較になっているので、
> dic.CompareMode = vbDatabaseCompare
> で比較方法を Access に合わせて・・・

質問した人からのコメント

2018/9/14 12:29:04

出来ました!ありがとうございます!!!
まだまだ知らないプログラミング方法に驚いています!!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

tra********さん

2018/9/910:19:47

受け取る結果が複数になるので、Subプロシジャに変更してます。

Sub Sample()
Dim Arr, buf, cnt
Arr = Split("aa,aa,bb,bb,cc,cc,d", ",")
Call 重複削除(Arr, buf, cnt)
End Sub

Sub 重複削除(Arr, buf, cnt)
Dim Dic, i As Long
Set Dic = CreateObject("Scripting.Dictionary")
For i = LBound(Arr) To UBound(Arr)
If Not Dic.exists(Arr(i)) Then
Dic.Add Arr(i), 1
Else
Dic.Item(Arr(i)) = Dic.Item(Arr(i)) + 1
End If
Next
buf = Dic.Keys
cnt = Dic.items
End Sub

iru********さん

2018/9/811:59:22

function 文字数(buf)
dim cnt() as long
dim i as long
redim cnt(ubound(buf))
for i = 0 to ubound(buf)
cnt(i) = len(buf(i))
next i
文字数 = cnt
end sub

みたいな感じかな。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる