いつもお世話になっております
下記は以前教えて頂いたコードですが
こちらを利用してさらに多段配列は可能でしょうか。
添付ファイルのようにやりたいのですが。
さすがに無理でしょうか。
①シートは商品ごとあります。ばなな みかん ぶどう りんご
②サイズが S M SS L あります。
例)シート ばなな
購入月 昇順です
あとはサイズごとわかれていれば
よいのですが。
Dim myDic As Object
Dim r As Range, r2 As Range
Dim key1, key2, mon As String
Set myDic = CreateObject("Scripting.Dictionary")
With ActiveSheet
For Each r In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
If Not myDic.Exists(r.Value) Then myDic.Add r.Value, _
CreateObject("Scripting.Dictionary")
mon = Month(r.Range("B1").Value) & "月"
If Not myDic(r.Value).Exists(mon) Then myDic(r.Value).Add mon, _
CreateObject("System.Collections.ArrayList")
myDic(r.Value)(mon).Add (r.Range("C1:E1").Value)
Next
End With
For Each key1 In myDic.Keys
With Worksheets(key1)
Set r2 = .Range("A2")
For Each key2 In myDic(key1).Keys
r2.Value = key2
r2.Offset(, 1).Resize(myDic(key1)(key2).Count, 3).Value = _
Application.Transpose(Application.Transpose(myDic(key1)(key2).ToArray()))
Set r2 = r2.Offset(5)
Next
End With
Next
Set myDic = Nothing
Set r2 = Nothing
これを利用してもう一つ多段階にすることは可能でしょうか
わたしなりにやりましたが
いろいろ試しましたがどこをどうすれば
よいのか答えがでませんです。
おしえてくれませんでしょうか
下記のコードはだめです
With ActiveSheet
For Each r In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
If Not Dic.Exists(r.Value) Then _
Dic.Add r.Value, CreateObject("Scripting.Dictionary")
Size = r.Range("B1").Value
If Not Dic(r.Value).Exists(Size) Then _
Dic(r.Value).Add Size, CreateObject("System.Collections.ArrayList")
Dic(r.Value)(Size).Add (r.Range("C1").Value)
If Not Dic(r.Value)(Size).Exists(mon) Then _
Dic(r.Value)(Size)(mon).Add Size, CreateObject("System.Collections.ArrayList")
Dic(r.Value)(mon).Add (r.Range("C1").Value)
Next
End With
No.1
- 回答日時:
お疲れ様です。
結構ほしいですね。
1番目にDictionary、2・3番目にArrayListを用いられているようですけど、普通にやるとしたら1・2番目がDictionary、3番目にArrayListでしょうね。
ArrayListは通常の配列と似てて書き込んだ順に1次元的に値等を格納するのであって、今回のサイズ毎による値と言うKeyとItemを対で格納する事は出来ません。
強引に1つ目のDictionaryでKeyを”月とサイズ”で連結するってのは良いのかもしれませんけど。
ただここで引っかかるとしたら、
>購入月 昇順です
でしょうか。
データ的に既に並べ替える必要がないって事ならば上記で宜しいのでしょうけど、データの月がバラバラになってて書き出す際にはそれを並べ替える必要があるって事ならもう一工夫必要かもです。
事実データは前者と後者のどちらなのでしょう?
いつもお世話になっております
わたしなりに考えました。
購入月 昇順です --->はあらかじめSortで並び替えることにしました。
そして以前ジャグ配列もどきというのを頂戴していたのを
保存していました。それにwith worksheets(key1)を
書き出しコードにいれて最初は間違ってた場所にいれて
大変でしたが落ち着いてひとつひとつやったらできましたが、
keyがずれていたのですこしまた考えます。
No.2
- 回答日時:
No.1です。
最初の Set ~ Dictionary を入れてなかった。
これを入れると
1~3番目がDictionary
4番目がArrayList
ですね。
ただ最初の Dictionary の Key を 商品_納入日_サイズ とすれば、Dictionary ArrayList は1個ずつで出来ます。
Key を吐き出した後で Split を使い分けられた値を上手く使い分けていけば可能かな?と。
前回そのような使い方をすればわかりやすかったのかもですね。(他の回答者でも稀にそう使ってますし)
No.3
- 回答日時:
えっと。
補足の画像の右側(列で行がズレている)表を『サイズ』『日付』『金額』で揃えれば良いのでしょうか?
ちなみに『金額』が表示されないのは表示させるために行うセル範囲の拡張 Resize(~) が使われていないだけですね。
ダミーデータ作成に少々お待ちください。
No.4ベストアンサー
- 回答日時:
For i = 0 To Dic(key1)(key2).Count - 1
rr.Offset(i, 2).Value = Dic(key1)(key2)(i)
Next
ここで
For i = 0 To Dic(key1)(key2).Count - 1
rr.Offset(i, 2).Resize(, 2).Value = Dic(key1)(key2)(i)
Next
だと思います。
あと
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
この上下の Offset は共に不要では?
頭に ' を付けて試してみるとか?
丸一日中考えてもだめしたのに
ありがとうございました。
このごろできるまでとにかくかきまっくています。
すると少しずつですが納得できるようになりました。
ありがとうございました
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
この上下の Offset は共に不要では?
頭に ' を付けて試してみるとか?
を検証いたします。
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
連想配列のキー値(連番)を基...
-
Excel VBAでフィルター後の対象...
-
PHP、{}記号の意味
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
関数をの引数について。
-
リストボックス複数選択抽出方法
-
foreachとかの勝手な省略?
-
プログラミングのPythonのnoteb...
-
スカラーのベクトル微分
-
配列をループでたくさん宣言し...
-
ヒアドキュメントの中のfor文
-
file_existsでファイル名の部分...
-
foreachのなかで次のキーを参照...
-
PHPで多次元配列を一度に処理す...
-
phpの関数について質問です!
-
While文を使って配列の中身を全...
-
配列データのMySQLへの登録
-
phpのin_array()でわからない事...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マッチング処理(1:N)
-
smartyのforeachの使い方
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
VB.NET で 二次元のハッシュは...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
POSTで渡されるデータの数がわ...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
Delphi XEの警告文を消したい
-
配列から順位を算出したい
おすすめ情報
データ的に既に並べ替える必要がないです。
普通にやるとしたら1・2番目がDictionary、3番目にArrayList
がんばってやれるだけやってみます
めぐみん様
頂戴しました、コードに
With Worksheets(key1) ------------------ここの部分
を付け加えました。
ただ、おもいどおりにならないのがあります。
画像添付のように日付のとなりの列に金額
を表示させたいです。
Dic(r.Value)(r.Range("B1").Value).Add (r.Range("C1:D1").Value) '-------------ここの部分
でやっても表示されないのです。
2回にわけます。文字数の制限です。
すみません。コードです。もう一回です。
For Each r In Range("A2", Cells(Rows.Count, "A").End(xlUp))
If Not Dic.Exists(r.Value) Then _
Dic.Add r.Value, CreateObject("Scripting.Dictionary")
If Not Dic(r.Value).Exists(r.Range("B1").Value) Then _
Dic(r.Value).Add r.Range("B1").Value, _
CreateObject("System.Collections.ArrayList")
Dic(r.Value)(r.Range("B1").Value).Add (r.Range("C1:D1").Value) '-------------ここの部分
Next
For Each key1 In Dic.keys
With Worksheets(key1)
Set rr = .Range("A1")
rr.Value = key1
For Each key2 In Dic(key1).keys
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
For i = 0 To Dic(key1)(key2).Count - 1
rr.Offset(i, 2).Value = Dic(key1)(key2)(i)
Next
Set rr = rr.Offset(Dic(key1)(key2).Count - 1)
Next
Set rr = rr.Offset(1)
End With
Next
Set Dic = Nothing
よろしくお願いいたします。
いつも有難うございます。
Dic(r.Value)(r.Range("B1").Value).Add (r.Range("C1").Resize(, 2).Value)
だけど上のコードで試したのですが、表示されませんでした。金額が