エクセル2000です。
教えてください。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v … というサイトで
「myDic.Add Cells(i, 1).Value, Cells(i, 2).Value は
myDic(Cells(i, 1).Value) = Cells(i, 2).Value と書くこともできます。 」
という記述を見つけました。
試してみたところ
Sub test01()
Dim myDic As Object
Dim myAr()
Set myDic = CreateObject("Scripting.Dictionary")
For i = 2 To 7
If Not myDic.exists(Cells(i, 1).Value) Then
myDic.Add Cells(i, 1).Value, Cells(i, 2).Value
End If
Next i
myAr() = myDic.Keys
MsgBox Join(myAr())
End Sub
Sub test02()
Dim myDic As Object
Dim myAr()
Set myDic = CreateObject("Scripting.Dictionary")
For i = 2 To 7
myDic(Cells(i, 1).Value) = Cells(i, 2).Value
Next i
myAr() = myDic.Keys
MsgBox Join(myAr())
End Sub
上記2つのマクロは、Keyに関してはまったく同じ働きをするようです。
ところがItemに関しては、Keyが重複した場合、あとから出てきた方に上書きされるようです。
これはtest01では、Keyの重複を排除しているためItemは最初に出たものが残る、test02は重複の場合、無条件でKeyが上書きされ(ても値は変化しないけど)、したがってItemも上書きされるという理解でよろしいのでしょうか?
ならば、Itemを気にしない場合、わざわざ
If Not myDic.exists(Cells(i, 1).Value) Then
myDic.Add Cells(i, 1).Value, Cells(i, 2).Value
End If
と、3行も費やして重複のチェックをしなくとも
myDic(Cells(i, 1).Value) = Cells(i, 2).Value
のわずか一行で済むということですよね?
No.1
- 回答日時:
> 3行も費やして重複のチェックをしなくとも
Dictionary については、その通りです。ただ、好みとなっちゃうのかなぁ
If Not dic.Exists(sKey) Then
dic.Add Key:=sKey, Item:=vbEmpty
End If
の方がソースとしてわかりやすい気がするけど。
Item を無視してよいなら多分、
dic(sKey) = vbEmpty
の方が高速でしょう。
KenKen_SPさま、いつもありがとうございます。
dic(sKey) = vbEmpty とはItemには何も入れないという意味というように理解してよろしいでしょうか?
Sub test03()
Dim myDic As Object
Dim myAr(), myAr2()
Set myDic = CreateObject("Scripting.Dictionary")
For i = 2 To 7
myDic(Cells(i, 1).Value) = vbEmpty
Next i
myAr() = myDic.Keys
myAr2() = myDic.Items
MsgBox Join(myAr()) & vbLf & Join(myAr2())
End Sub
で試したら、Join(myAr2())が0の行列になりましたので。
> ソースとしてわかりやすい気がするけど。
確かにそうですね、myDic(Cells(i, 1).Value) = Cells(i, 2).Value
って書いたら、後で見て自分でもわからなくなりそうです。
(^^;;
No.2
- 回答日時:
>Itemを気にしない場合、
>myDic(Cells(i, 1).Value) = Cells(i, 2).Value
>のわずか一行で済むということですよね?
キーに対して最終アイテムを必要としている場合ならOKでしょうね。
逆に最初のアイテムを必要とするのなら、
>test01では、Keyの重複を排除しているためItemは最初に出たものが残る
こちらでしょうね。
それぞれは何を必要とするかで使い分けると思いますよ。
あくまで一例に過ぎないと思いますけど、ご参考になれば。
No.3ベストアンサー
- 回答日時:
#2です。
例えば、
>If Not myDic.exists(Cells(i, 1).Value) Then
>myDic.Add Cells(i, 1).Value, Cells(i, 2).Value
>End If
の使い方としては、
If Not myDic.Exists(Cells(i, 1).Value) Then
myDic(Cells(i, 1).Value) = Cells(i, 2).Value
Else
myDic(Cells(i, 1).Value) = myDic(Cells(i, 1).Value) + Cells(i, 2).Value
End If
のように
・キーがなければキーに値をセットする。
・キーがあればそのアイテムに新しい値を加算していく。
と言った場合に、存在しないキーによるエラー回避の意味もあるでしょうか。
なんとItenの加算が出来るんですね!
文字列の場合は結合されるんですね!驚きました。
Sub test04()
Dim myDic As Object
Dim myAr(), myAr2()
Set myDic = CreateObject("Scripting.Dictionary")
For i = 2 To 7
If Not myDic.Exists(Cells(i, 1).Value) Then
myDic(Cells(i, 1).Value) = Cells(i, 2).Value
Else
myDic(Cells(i, 1).Value) = myDic(Cells(i, 1).Value) + Cells(i, 2).Value 'Itemデータを加算
End If
Next i
myAr() = myDic.Keys
myAr2() = myDic.Items
MsgBox Join(myAr()) & vbLf & Join(myAr2())
End Sub
No.4
- 回答日時:
>test02は重複の場合、無条件でKeyが上書きされ(ても値は変化しないけど)
>したがってItemも上書きされるという理解でよろしいのでしょうか?
ちょこっと、否、だいぶ違うみたい。。。(^^;;;
>myDic(Cells(i, 1).Value) = Cells(i, 2).Value
これは、一体、何をしているのでしょう。
それは、
myDic.Item(Cells(i, 1).Value) = Cells(i, 2).Value
のように、Itemプロパティが省略された形で
キーのセットではなくて
既にキーに関連付けされた項目の変更をしていることになります。
キーが無いときはどうするのじゃ、と疑問が生じるでしょうが、
その場合には以下のようにちゃんとキーを作ってくれるのです。
「項目を変更するときに引数 key の値が見つからない場合は
引数 newitem で指定された項目(今回は右辺のCells(i, 2).Value)
と関連付けられた新しいキーが作成されます」
ここら辺りはヘルプに詳しく書いてあります。
お暇なときには、ヘルプで遊びませう。。(^^;;;
以上です。
こんばんは、onlyromさま。
いつもありがとうございます。
日本まけちゃいましたね、残念です。
myDic(Cells(i, 1).Value) = Cells(i, 2).Valueは
キーがないときには新しいキーが作成され、あるときは既にキーに関連付けされたItemを変更するということですね。
よく分かりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
至急!尿検査前日にオナニーし...
-
腕を見たら黄色くなってる部分...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
勃起する時って痛いんですか? ...
-
精子が黄色?
-
口の中に黒い血の塊
-
白血球が多いとどんな心配があ...
-
尿検査前日に自慰行為した時の...
-
中出しをするとお腹が痛い・・・。
-
精子に血が・・・
-
これって喉仏ですか? 私は女性...
-
爪が紫色?
-
納豆食べた後の尿の納豆臭は何故?
-
筋トレするとチンコが縮んじゃ...
-
射精をして1週間以内に尿検査を...
-
尿検査の前日は自慰控えたほう...
-
EXCELで式からグラフを描くには?
-
excelでsin二乗のやり方を教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
至急!尿検査前日にオナニーし...
-
首吊りどこ締めるの
-
尿検査の前日は自慰控えたほう...
-
尿検査前日に自慰行為した時の...
-
検便についてです。 便は取れた...
-
白血球が多いとどんな心配があ...
-
中出しをするとお腹が痛い・・・。
-
射精をして1週間以内に尿検査を...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
勃起する時って痛いんですか? ...
-
変な話しになります。尿検査で...
-
これって喉仏ですか? 私は女性...
-
EXCELで条件付き書式で空白セル...
-
男です。昨日の午後3時くらいに...
-
今朝、毎朝の習慣でオナニーし...
-
納豆食べた後の尿の納豆臭は何故?
-
1日前の検尿
-
値が入っているときだけ計算結...
-
精子が黄色?
おすすめ情報