アプリ版:「スタンプのみでお礼する」機能のリリースについて

Vbaで配列の中の特定文字列を調べる際にdictionaryを使おうとしたのですがdictionaryのkeyの要素が重複すると、エラーが出るので配列の中に重複する要素があると使えませんどうすれば良いですか?

質問者からの補足コメント

  • しかしそうすると処理が遅いのが欠点ですよね?

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/05/23 18:34
  • しかし要素の字数が2文字以上だと有効では無いですよね?

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/23 18:37
  • https://vbabeginner.net/convert-array-to-associa … このサイトのような事をしたいです。

      補足日時:2022/05/23 18:55
  • 特定の文字列が配列の何番目の位置にあるかを知りたいのです。

    No.7の回答に寄せられた補足コメントです。 補足日時:2022/05/23 19:38
  • しかしそれだと、dictionaryを利用する方法より処理が遅いです。

    No.8の回答に寄せられた補足コメントです。 補足日時:2022/05/23 20:06

A 回答 (9件)

Dictionaryは重複データは入れられないけど


使い道、取り出す時どうするのかな・・?
添え字を後から削除する必要が無ければ
If Not map.Exists(ary(i)) Then
Call map.Add(ary(i), CStr(i))
Else
Call map.Add(ary(i) & "|" & n, CStr(i))
n = n + 1
End If
必要があれば出力時、instr ・・Split  などで

もし、重複データは不要なら #2様が回答されている通り
If Not map.Exists(ary(i)) Then Call map.Add(ary(i), CStr(i))
で良いと思いますよ
この回答への補足あり
    • good
    • 0

あとは



[VBA]ArrayListの使い方を知れば動的配列も解決!
https://y-moride.com/vba/arraylist-how-to-use.ht …

こちらを使うか。
ただwin10と相性が悪い場合もあるような記事も見かけたので、
他だとDicを2つ使うか?
    • good
    • 0

配列の何番目って提示しているサイトにヒントが



For k = 0 To 10000 ' To map.Count - 1
If ("8" = ary(k)) Then
'// この時点の変数kの値が検索文字列がある配列の位置になる
Exit For
End If
Next

記載されていますよ。
この回答への補足あり
    • good
    • 0

>要素の字数が2文字以上だと有効では無いですよね?



検索文字数が2文字以上でも出来ますが(要素数が多いと重いかな?)、
2次元配列ってなら無理かもですね。
    • good
    • 0

#4


なるほど・・
何をされたいか良く分からないのですが・・ごめんなさい

If Not Dic.exists(Cells(i, 1).Value) Then
Dic.Add ary(i, 1).Value, ary(i, 2).Value
Else
Dic.Add ary(i, 1).Value & "|" & n, ary(i, 2).Value
n = n + 1
End If

keyに添え字付加?後でSplit出来るように"|" とか?
取り出す処理負荷どうかな・・・少し乱暴?
    • good
    • 0

こんばんは


>dictionary を使用する目的が良く分かりませんが
配列を作るのにdictionaryを使用すると言う事でしょうか?
重複データを除く為にはよく使われますが、入れると言う事であれば、
違う方法が良いのではないかと思います 
itemに添え字を付けるとかも出来るとは思いますが。。

既に配列が有ってその中には重複データも含まれている内容を調べる場合
調べる内容にもよりますが、べたに考えると配列内をループで探せばよいですね

参考コード
Dim i, j, ary
ary = Range("A1:F10")
For i = LBound(ary, 1) To UBound(ary, 1)
For j = LBound(ary, 2) To UBound(ary, 2)
If ary(i, j) = "keyword" Then Debug.Print ary(i, j); " = 行 :"; i; " 列 :"; j
Next
Next

aryは2次元配列
A1:F10範囲内のキーワードを探して 行№と列№を出力します

探す方法は調べる内容にもよりますが、色々あると思いますので参考サイト
https://www.sejuku.net/blog/70270
この回答への補足あり
    • good
    • 0

No.2です。


老眼です。

http://officetanaka.net/excel/vba/function/Join. …
http://officetanaka.net/excel/vba/function/instr …

1次元配列なら
joinで1行の文字列にしinstrで存在しているならどこにあるかを調べる。
存在してなければ0になる。

if instr(join(配列変数, "_"), "調べたい値")>0 then
'存在する時
else
'存在しない時
end if
この回答への補足あり
    • good
    • 0

エラーが出るそのコードが知りたいですが。



http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
最初の方のコード

If Not myDic.exists(Cells(i, 1).Value) Then
『もしkeyが既に存在してなければ

が良く使ってます。
Not を消せば
『もしkeyが存在していれば』になりますね。
    • good
    • 0

instr関数でnullが返されるまで、ループを作ってスタート位置を変えるとか?


https://docs.microsoft.com/ja-jp/office/vba/lang …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています