idDicというオブジェクト(連想配列)を作成しました。
keyには既に重複しないIDリストが作成されています。
itemには、niListという配列を設定してあり、初期値としてarray(0,0,0,0,0,0,0)が設定されています。
"日計"シートのデータを1行ずつ調べ、条件に応じてidDicのアイテム(niList)を変更したいです。
下記のような感じの処理をしたいのですが、日計シートの該当ID(keyID)と同一のIdDicのkeyの取得や、そのアイテム(niList)の指定方法がわかりません。
(書き方、指定の仕方がわからないので雰囲気で書いてみました)
(コチラの意図するところがご理解頂けると幸いです・・・)
そもそも、Dictionaryの使い方として不適切であれば、その様にご指導下さい。
日計シートの確認中に該当IDが出現する都度、各IDのniList(0)に1づつ加算、
日計10列目の値が4以下ならば、各IDのniList(4)に1づつ加算、
日計10列目の値が6より大きければ、各IDのniList(6)に1づつ加算したいです。
(実際にはもう少し条件が多いですが、例として上記のような感じです)
for n = 2 to lg '日計シートの2行目から最終行(lg)まで繰り返し処理
keyID as string
keyID = worksheets("日計").cells(n,5).value '日計シートには5列目にIDが有ります。
↓(こんなイメージの事をしたいのですが書き方がわかりません)
idDic.key(keyID).item(niList(0)).value = niList(0) + 1
if worksheets("日計").cells(n,10).value > 6 then
idDic.key(keyID).item(niList(6)).value = niList(6) + 1
↑↓(こんなイメージの事をしたいのですが書き方がわかりません)
else if worksheets("日計").cells(n,10).value <= 4 then
idDic.key(keyID).item(niList(4)).value = niList(4) + 1
end if
next n
No.2ベストアンサー
- 回答日時:
No.1です。
>idDic.Item(keyID)(6)を試しましたが、思うように動作しません。
ここは自分も憶測で回答してしまった点で、期待させてしまい申し訳ないです。
先の回答にあった
>これってkeyが違ってもItemに変数を与えていたら、他も書き換えないかな?
については、サブPCで検証した結果問題なかったですね。
ただ値を入れる時は一度別のValiant型変数に代入し、必要なインデックスで加算を行い
再度Dictionaryに戻すやり方の方が良いのかもです。
Sub try()
Dim myDic As Object
Dim key As Variant
Dim iList As Variant
Dim v As Variant
Set myDic = CreateObject("Scripting.Dictionary")
iList = Array(0, 0, 0)
myDic.Add "A", iList
myDic.Add "B", iList
myDic.Add "C", iList
v = myDic.Item("A"): v(0) = v(0) + 1: myDic.Item("A") = v
v = myDic.Item("B"): v(1) = v(1) + 1: myDic.Item("B") = v
v = myDic.Item("C"): v(2) = v(2) + 1: myDic.Item("C") = v
For Each key In myDic.Keys
Debug.Print key, Join(myDic.Item(key), "==")
Next
Set myDic = Nothing
End Sub
ーーー結果ーーー
A 1==0==0
B 0==1==0
C 0==0==1
ーーーーーーーー
これを踏まえると、
・加算に使用する別のValiant型変数を宣言する。(仮にvとする)
・Dim keyID As Stringの宣言はFor~Next内で行う必要はなく、コードの最初で行うべし。
Dim v As Variant '★
Dim keyID As String '★
niList = Array(0, 0, 0, 0, 0, 0, 0)
Set idDic = CreateObject("Scripting.Dictionary") '★
With Worksheets("日計") '★
ld = .Cells(Rows.Count, 2).End(xlUp).Row '★
For i = 2 To ld '日計に日付入力の有る最終行まで確認
keyID = .Cells(i, 5).Value '重複確認をするID '★
If Not idDic.exists(keyID) Then 'IDの重複を確認 ★
idDic.Add keyID, niList '重複しないIDを配列に格納
End If
'日計シートの確認中に該当IDが出現する都度、各IDのniList(0)に1づつ加算、★
v = idDic.Item(keyID):v(0) = v(0) + 1:idDic(keyID) = v '★
Select Case .Cells(i,10).value '★
'日計10列目の値が4以下ならば、各IDのniList(4)に1づつ加算、★
Case Is <= 4 '★
v = idDic.Item(keyID):v(4) = v(4) + 1:idDic(keyID) = v '★
'日計10列目の値が6より大きければ、各IDのniList(6)に1づつ加算 ★
Case Is > 6 '★
v = idDic.Item(keyID):v(6) = v(6) + 1:idDic(keyID) = v '★
End Select '★
Next i '★
End With '★
ーーーーーー
Select Case については
https://www.sejuku.net/blog/30642#Is
ループは1回で出来ると思いますし、With~End WithやSelect Caseで纏めるのが良いかも。
★の部分は書き換えてみましたが、実際に動作検証は出来てません・・・ごめんなさい。
ところでこれはWorksheets("日計")しか使ってないですよね?
またまた迅速なるご回答、誠に有難うございます!
当方の技術力では理解が難しいですが、なんだか出来そうな気がしてきました。
ご提案頂いたソースを理解するべく努力し、試してみます!
(技術、理解が追いつかないので、すぐに”できました!”ってご回答出来ず申し訳ない)
別の方法として、keysを1次元配列(ids)に格納したりと、試行錯誤しておりました。
ちなみに、idsをReDimで2次元関数ids(key.count,7)などとするとidsの内容が消えたり・・・。更には新たなids2を作ってidの数行×7列の配列を作ったり・・・。
アレコレ挑戦しております。
「ところでこれはWorksheets("日計")しか使ってないですよね?」については、
日計シートの内容をID毎に集計(仕分け?)して、別のデータシートに転記する予定です。
niList(2)はデータシートの15列目、niList(5)はデータシートの36行目・・・とか・・・。
まだ配列とDictionaryの違い(指定の仕方など)があやふやなので精進いたします!
今回の作業テーマ(この質問事項以外にもいくつかの作業予定がある)完了までに、まだまだ壁に当たる予感がビシビシ致します・・・。また質問をあげさせていただくと思いますので、お目にかかりましたらよろしくお願いいたします!
No.1
- 回答日時:
検証が出来ないですが。
(メインPC修理中で)>itemには、niListという配列を設定してあり、初期値としてarray(0,0,0,0,0,0,0)が設定されています
これってkeyが違ってもItemに変数を与えていたら、他も書き換えないかな?
https://oshiete.goo.ne.jp/qa/10020635.html
ここで回答してますが、Itemに直接array(0,0,0,0,0,0,0)を入れた方が良いと思う。
>idDic.key(keyID).item(niList(4)).value
使っているのはDictionaryオブジェクトですよね?
確か.Valueってないはずですよ。
https://msdn.microsoft.com/ja-jp/library/cc42820 …
VB等のDictionaryクラスには.Valuesと言うプロパティがありますけど。
何を参考に作成されたのかきにはなりますけど、キーが存在しているなら
idDic.item(keyID)(6) = idDic.item(keyID)(6) + 1
と書けるか、以前私が回答している
v = myDic(r.Value)
v(i) = r.Offset(, 2).Value
myDic(r.Value) = v
これを
v = idDic(keyID)
v(6) = v(6)+1
idDic(keyID) = v
とするのだと思います。(修理中で試せないので自信はありませんけど)
Dictionaryにキーが存在しているかどうかも.Existsで判定していないみたいですが、
やっぱ参考にした物が気になりますねぇ。
早速のご回答、ありがとうございます。
.Existsでの判定は下記のように行っております。
(記載不十分で失礼いたしました)
なお、 idDic.Item(keyID)(6)を試しましたが、思うように動作しません。
そもそも、Dictionaryのまま処理せず、2次元配列などにした方がよいのでしょうか?
niList = Array(0, 0, 0, 0, 0, 0, 0)
ld = Worksheets("日計").Cells(Worksheets("日計").Rows.Count, 2).End(xlUp).Row
Set idDic = CreateObject("Scripting.Dictionary")
For i = 2 To ld '日計に日付入力の有る最終行まで確認
checkID = Cells(i, 5).Value '重複確認をするID
If Not idDic.exists(checkID) Then 'IDの重複を確認
idDic.Add checkID, niList '重複しないIDを配列に格納
End If
Next i
For nr = 2 To ld '日計表を上から最終行までチェック
'日計各行のIDをkeyID、該当するidDicのniListに数字を加算したい
Dim keyID As String
keyID = Worksheets("日計").Cells(nr, 5).Value
idDic.Item(keyID)(6) = idDic.Item(keyID)(6) + 1
'↑教えて頂いた表現でniList(6)への加算を試してみました
Next nr
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 日付を重複させずに数えたい 4 2022/12/04 16:26
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET で 二次元のハッシュは...
-
重複確認
-
Dictionary(連想配列?)の使い方
-
PHPで変数名にハイフンを使うに...
-
PHPからCSVをアップロード後、m...
-
foreachのなかで次のキーを参照...
-
Delphiで別unitで宣言した「TAr...
-
PHPにてクラスを配列にすること...
-
ネストが深い時のforeachはどう...
-
複数行のデータのPOST処理に関して
-
PHPでサーバー上の書き換えたht...
-
連想配列で値が空だったら、要...
-
別ファイルの構造体の値を読み...
-
am()の使い方
-
プルダウンメニューにDBの内容...
-
CSVデータの行数カウントをした...
-
しりとり 無限ループ?
-
複数ファイルで、それぞれの行...
-
Resource id #3 と表示されま...
-
配列の要素(value)に、変数を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複確認
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
SELECT 使用時の bindValue の...
-
Smartyでインクリメント
-
PHPでこのコード自体に意味は無...
-
PHP、{}記号の意味
-
配列を比較して同じものがあっ...
-
phpでforeachの中にforeachがあ...
-
多次元配列の中で条件に合う要...
-
sqlのデーターを『あ行』『か行...
-
ラジオボタンをランダムに表示...
-
キーが倍数の時の値の存在チェ...
-
三重県南部の温泉
-
foreachで配列を、左から縦3列...
-
ジャグ配列
-
構造体の中でユーザー定義型の...
おすすめ情報