質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2060閲覧

VBAで2列のRangeをDictionaryに変換したい

chekke1999

総合スコア21

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/10/20 03:11

タイトル通り、VBAでRnageをDictionaryに変換したくて以下のような処理をかきました。
しかし構文エラーがと表示されます。どこが間違ているのでしょうか?

またRange.RowsはFor Eachで回すと一行ごとに配列で値参照できるという認識であってますでしょうか?MSのRange.Rowsの解説がガバガバ翻訳すぎて使い方が合ってる自信がありません。Debug.Printで確認できたらいいんですけど、構文エラーで先に進めないです。

ソースコード

VBA

1Function SetDict(ByVal default_array As Range) As Object 2 Dim dict 3 Dim dar 4 Set dict = CreateObject("Scripting.Dictionary") 5 For Each dar As default_array.Rows 6 dict.Add dar(1), dar(2) 7 Next 8 Set SetDict = dict 9End Function 10Sub Main() 11 Debug.Print(SetDict(Range("M2:N8"))) 12End Sub 13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

Yahoo知恵袋でも同様の質問をしており、そちらで頂いた解答をもとに最終的に以下のような形で落ち着きました。構文エラーはFor Each dar Inとすべき場所がAsになってました。

VBA

1Function SetDict(ByVal default_array As Range) As Object 2 Dim dict 3 Dim dar 4 Set dict = CreateObject("Scripting.Dictionary") 5 For Each dar In default_array.Rows 6 dict.Add dar.Cells(1).Text, dar.Cells(2).Value 7 Next 8 Set SetDict = dict 9End Function 10 11Sub InsertEquation(left, top, str) 12 ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, left, top, 0, 0).Select 13 Application.CommandBars.ExecuteMso "InsertBuildingBlocksEquationsGallery" 14 Selection.Text = str 15 Selection.Font.Size = 14 16 Selection.ShapeRange.TextFrame2.WordWrap = msoFalse 17 Application.CommandBars.ExecuteMso "EquationProfessional" 18End Sub 19 20Sub Main() 21 Dim dict 22 Set dict = SetDict(Range("M2:N8")) 23End Sub 24

投稿2021/10/20 07:30

chekke1999

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「2列のRangeをDictionaryに変換」の意味がよく分からないのですが。
最終的にDictionaryを使って何をしたいのか説明された方が適切な回答が得られると思います。

とりあえず、Dictionaryに、1列目の値をkeyとして、Itemに2列目の値を格納する、ということだとします。高速に検索する場合によく使う手法です。

なお、keyは重複は許されないので、1列目に重複がある場合は2つ目以降はスキップしてます。

vba

1Function SetDict(ByVal default_array As Range) As Object 2 Dim dict 3 Dim dar As Range 4 Set dict = CreateObject("Scripting.Dictionary") 5 For Each dar In default_array.Rows 6 If Not myDic.Exists(dar.Cells(1).Value) Then 7 dict.Add dar.Cells(1).Value, dar.Cells(2).Value 8 End If 9 Next 10 Set SetDict = dict 11End Function 12 13Sub Main() 14 Dim dict 15 Set dict = SetDict(Range("M2:N8")) 16 17 'KeyとItemを列挙 18 Debug.Print "Key", "Item" 19 Debug.Print "------", "-------" 20 Dim k 21 For Each k In dict 22 Debug.Print k, dict.Item(k) 23 Next 24End Sub

dict.Add dar.Cells(1), dar.Cells(2) とか、dar.Columns(1), dar.Columns(2)
というように .Value を付けないと、Rangeオプジェクトそのものが格納されます。
こうすると、検索とか重複排除などの使い方ができないのであまり意味がないように思います。

投稿2021/10/20 03:58

編集2021/10/20 04:09
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんな感じでどうでしょうか。

VBA

1Function SetDict(ByVal default_array As Range) As Object 2 Dim dict 3 Dim dar As Range 4 Set dict = CreateObject("Scripting.Dictionary") 5 For Each dar In default_array.Rows 6 dict.Add dar.Columns(1), dar.Columns(2) 7 Next 8 Set SetDict = dict 9End Function 10Sub Main() 11 Dim d, e 12 Set d = SetDict(Range("M2:N8")) 13 For Each e In d 14 Debug.Print e, d(e) 15 Next 16End Sub

<追記>

VBA

1Function SetDict(ByVal default_array As Range) As Object 2 Set SetDict = CreateObject("Scripting.Dictionary") 3 Dim arr, i 4 arr = default_array.Value 5 For i = 1 To UBound(arr) 6 SetDict.Item(arr(i, 1)) = arr(i, 2) 7 Next 8End Function 9

投稿2021/10/20 03:49

編集2021/10/20 06:23
jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問