重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

いつもお世話になっております
下記のコードの内容がわかりません。
おしえてくれませんでしょうか
インターネットで検索するとC#とかででるんです。

If D_Dic(r1.Value).IndexOf_3(Month(r1.Range("B1").Value)) < 0 Then _
D_Dic(r1.Value).Add (Month(r1.Range("B1").Value))

Sub megu_2()
Dim mydic As Object, D_Dic As Object
Dim r1 As Range, r_data As Range
Dim i As Integer, v, key

Set mydic = CreateObject("Scripting.Dictionary")
Set D_Dic = CreateObject("Scripting.Dictionary")

With Worksheets("Sheet1") 'データのあるシート
For Each r1 In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
key = r1.Value & "_" & Month(r1.Range("B1").Value)

If Not mydic.exists(key) And _
WorksheetFunction.Count(r1.Range("C1:F1")) > 0 Then

mydic.Add key, Array(r1.Value, _
Month(r1.Range("B1").Value), 1, _
WorksheetFunction.Sum(r1.Range("C1:F1")))

ElseIf WorksheetFunction.Count(r1.Range("C1:F1")) > 0 Then

v = mydic(key)
v(2) = v(2) + 1
v(3) = v(3) + WorksheetFunction.Sum(r1.Range("C1:F1"))
mydic(key) = v
End If

If Not D_Dic.exists(r1.Value) Then _
D_Dic.Add r1.Value, CreateObject("System.Collections.ArrayList")

If D_Dic(r1.Value).IndexOf_3(Month(r1.Range("B1").Value)) < 0 Then _
D_Dic(r1.Value).Add (Month(r1.Range("B1").Value))

Next
End With

Set r_data = Worksheets("Sheet1").Range("J2") 'データを書きだすシートとセル
r_data.Offset(-1).Resize(, 4).Value = Array("商品", "月", "仕入月回数", "仕入個数")

For Each key In D_Dic.Keys
D_Dic(key).Sort
For i = 0 To D_Dic(key).Count - 1
r_data.Resize(, 4).Value = mydic(key & "_" & D_Dic(key)(i))
Set r_data = r_data.Offset(1)
Next
Next

Set r_data = Nothing
Set D_Dic = Nothing
Set mydic = Nothing

End Sub

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

  • うーん・・・

    Set arr1 = CreateObject("System.Collections.ArrayList")
      Set arr2 = CreateObject("System.Collections.ArrayList")
      With arr1
        .Add "すきやき"
        .Add "とんかつ"
        .Add "オムライス"
      End With
      With arr2
        .Add "焼きそば"
        .Add "ラーメン"
        .Add "お好み焼き"
      End With
      'arr1とarr2を連結
      arr1.AddRange arr2
      'arr1の中身を全て表示
      For Each var In arr1
        Debug.Print var,
      Next var
    検索してもこれが限界てす

      補足日時:2020/04/14 22:03

A 回答 (1件)

>インターネットで検索するとC#とかででるんです。



元々は.NET FrameworkのSystem.Collectionsにあったものですしね。
現在のバージョンではなくなっているので、3.5 を有効にしないと WIN10 では使えなかったと思います。

ArrayList.IndexOf メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/syst …

引数の与え方が3つあるのですがそもそも『配列内に値がどこにあるのか調べたい(VBA で言えば InStr みたいな物とも言える)』が目的でした。
しかしExcelはIndexOfのどれを指定していると言うのがわからないのか正常に動作しませんでした。
そんな時ググっていたら "_3" を追加して作業しているコードを見つけそのようにしたら値の検索(要素で言えば -1 が返れば無し 0 以上なら有り)が可能となり、その後は使用してます。
"_1" "_2" については必要な場面がなかったので使えるのかどうかは検証した事はありません。

使用している理由としてはDictionaryオブジェクトの Existsメソッドのようにキーの重複を避けるようなものがないって事でしょうか。
Dictionaryオブジェクトとは違いArrrayListクラスでは値が重複してても値の追加は可能なので。(上書きされるとかもない)

値が追加されてない場合の戻り値が-1なので"<0"ではなく"=-1"としてた方がわかりやすかったでしょうか?
    • good
    • 0
この回答へのお礼

いつもお世話になっております
配列に値がどこにあるのか調べる
なんとなくですが、わかったような。
けどやっばり難しいです。
の戻り値が-1なので"<0"ではなく"=-1"
考えます。有難うございます。

お礼日時:2020/04/15 09:01

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