Sub mondai3_Collection()
Dim dic As New Scripting.Dictionary
Dim cFm As Long
For cFm = 2 To 21
If Range("C" & cFm).Value = "渋谷区" Then
If Not dic.Exists("渋谷区") Then
'DictionaryにCollectionオブジェクトを参照させる
dic.Add "渋谷区", New Collection
End If
'Collectionに行番号を入れる
dic.Item("渋谷区").Add cFm
End If
Next
Dim Var As Variant
'Collectionから行番号を取り出す
Debug.Print TypeName(dic.Item("渋谷区"))
For Each Var In dic.Item("渋谷区")
Debug.Print Var
Range("H" & Var).Value = "○"
Next
End Sub
Sub mondai3_Col1() '数値を格納
Dim cFm As Long
Dim col As New Collection
For cFm = 2 To 21
If Range("C" & cFm).Value = "渋谷区" Then
col.Add cFm
End If
Next
Dim v As Variant
For Each v In col
Debug.Print v
Next
End Sub
Sub mondai3_Col2() 'セルへの参照を格納
Dim cFm As Long
Dim col As New Collection
For cFm = 2 To 21
If Range("C" & cFm).Value = "渋谷区" Then
col.Add Range("F" & cFm)
End If
Next
Dim v As Variant
For Each v In col
Debug.Print v.Address & " : " & v.Value
Next
End Sub
Sub mondai3_Collection()
Dim dic As New Scripting.Dictionary
Dim cFm As Long
For cFm = 2 To 21
If Range("C" & cFm).Value = "渋谷区" Then
If Not dic.Exists("渋谷区") Then
'DictionaryにCollectionオブジェクトを参照させる
dic.Add "渋谷区", New Collection
End If
'Collectionに行番号を入れる
dic.Item("渋谷区").Add cFm
End If
Next
Dim Var As Variant
'Collectionから行番号を取り出す
Debug.Print TypeName(dic.Item("渋谷区"))
For Each Var In dic.Item("渋谷区")
Debug.Print Var
Range("H" & Var).Value = "○"
Next
End Sub
Sub mondai4_Col1() '数値を格納
Dim cFm As Long
Dim dic As New Scripting.Dictionary
Dim st As String
For cFm = 2 To Range("A" & Rows.Count).End(xlUp).Row
st = Range("C" & cFm).Value
If Not dic.Exists(st) Then
dic.Add st, New Collection
End If
dic.Item(st).Add cFm
Next
Dim var As Variant
Dim cTo As Long
Dim sp() As String
cTo = 2
For cFm = 0 To dic.Count - 1
st = dic.Keys(cFm)
Range("J" & cTo).Value = st & "のマンションは" & dic.Item(st).Count & "件ヒットしました!"
cTo = cTo + 1
For Each var In dic.Item(st)
Range("K" & cTo).Value = Range("F" & var).Value
Range("L" & cTo).Value = Range("D" & var).Value
Range("M" & cTo).Value = Range("E" & var).Value
sp = Split(Range("G" & var).Value, "/")
Range("N" & cTo).Value = sp(0)
Range("O" & cTo).Value = sp(1)
cTo = cTo + 1
Next
cTo = cTo + 1
Next
End Sub
'連想配列に動的配列を格納する別解
Sub mondai5_array()
'初期化
Dim cMx As Long
cMx = Range("O" & Rows.Count).End(xlUp).Row
If cMx > 1 Then
Range("J2:O" & cMx).ClearContents
End If
Dim cFm As Long
Dim dic As New Scripting.Dictionary
Dim st As String
Dim ar As Variant
For cFm = 2 To Range("A" & Rows.Count).End(xlUp).Row
st = Range("C" & cFm).Value
If Not dic.Exists(st) Then
dic.Add st, Array(cFm)
Else
ar = dic.Item(st)
ReDim Preserve ar(UBound(ar) + 1)
ar(UBound(ar)) = cFm
dic.Item(st) = ar
End If
Next
Dim cTo As Long, GYO As Long
Dim sp() As String
GYO = 2
For cFm = LBound(dic.Keys) To UBound(dic.Keys)
st = dic.Keys(cFm)
Range("J" & GYO).Value = st & "のマンションは" & UBound(dic.Item(st)) + 1 & "件ヒットしました!"
GYO = GYO + 1
For cTo = LBound(dic.Item(st)) To UBound(dic.Item(st))
Range("K" & cTo + GYO).Value = Range("F" & dic.Item(st)(cTo)).Value
Range("L" & cTo + GYO).Value = Range("D" & dic.Item(st)(cTo)).Value
Range("M" & cTo + GYO).Value = Range("E" & dic.Item(st)(cTo)).Value
sp = Split(Range("G" & dic.Item(st)(cTo)).Value, "/")
Range("N" & cTo + GYO).Value = sp(0)
Range("O" & cTo + GYO).Value = sp(1)
Next
GYO = GYO + UBound(dic.Item(st)) + 2
Next
End Sub
田中 宏明さんの投稿
(投稿ID: 3941)
今回の解法で「,」区切りの文字列を連想配列に格納し、split関数で配列に変換するというやり方は、目から鱗が落ちるようでした。
近いうち、実務で実際に使う場面が登場すると思っています。
その際は、時間をかけず、シンプルにマクロを書き上げてみたいです。
連想配列について、ここまで詳しく解説された講座はどこにもないです。
大変満足しました。
小川 慶一さんのコメント
(コメントID: 5494)
> 今回の解法で「,」区切りの文字列を連想配列に格納し、split関数で配列に変換するというやり方は、目から鱗が落ちるようでした。
他の方法もありそうですけどね。
Visual Basicは配列の扱いが若干ショボいので、その中でできる範囲でならばまぁこれがベストかなと思います。
PHPとかであればまた違う、もっと鮮やかな解法を紹介できるのですが。
> 連想配列について、ここまで詳しく解説された講座はどこにもないです。
> 大変満足しました。
僕自身も、連想配列の参照先にオブジェクトを指定できるとはご指摘を受けるまで知りませんでした。
こちらこそありがとうございます。
> 連想配列を使うことが多く、連想配列の中に、1次元動的配列を格納する方法を調べていましたが、実現方法がわかりませんでした。
>
> 今回の解法で「,」区切りの文字列を連想配列に格納し、split関数で配列に変換するというやり方は、目から鱗が落ちるようでした。
>
> 近いうち、実務で実際に使う場面が登場すると思っています。
> その際は、時間をかけず、シンプルにマクロを書き上げてみたいです。
>
> 連想配列について、ここまで詳しく解説された講座はどこにもないです。
> 大変満足しました。
田中 宏明さんのコメント
(コメントID: 5867)
sogo4 問題3にて、連想配列とCollectionを組み合わせた別解を
作成してみました。
> 田中 宏明さん:
>
> > 今回の解法で「,」区切りの文字列を連想配列に格納し、split関数で配列に変換するというやり方は、目から鱗が落ちるようでした。
>
> 他の方法もありそうですけどね。
小川 慶一さんのコメント
(コメントID: 5870)
いつもありがとうございます。
こんなクラスがあるんですね。興味深いです。
ということで、僕もマクロを書いてみました。
とりあえず、渋谷区の物件だけをCollectionオブジェクトに格納するなら、こんな感じですかね↓。
> 小川慶一先生:
>
> sogo4 問題3にて、連想配列とCollectionを組み合わせた別解を
> 作成してみました。
>
> > 田中 宏明さん:
> >
> > > 今回の解法で「,」区切りの文字列を連想配列に格納し、split関数で配列に変換するというやり方は、目から鱗が落ちるようでした。
> >
> > 他の方法もありそうですけどね。
>
小川 慶一さんのコメント
(コメントID: 5874)
Collectionを使った例です。
すべての区に対してということだと、以下のような感じですね。
田中 宏明さんのコメント
(コメントID: 5875)
ありがとうございます。
納得できる答えが得られましたので、
総合問題を「学習済」 にできました。
小川 慶一さんのコメント
(コメントID: 5877)
僕にとっても興味深かったです。
ひきつづきよろしくお願いいたします。
> 小川慶一先生:
>
> ありがとうございます。
> 納得できる答えが得られましたので、
> 総合問題を「学習済」 にできました。
田中 宏明さんのコメント
(コメントID: 7022)
教えていただいたArray関数で、過去に何度もチャレンジして失敗していた「連想配列に動的配列を格納」を実装できました。
小川 慶一さんのコメント
(コメントID: 7027)
さすがです (^^*