Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


663 / 13645 ツリー ←次へ | 前へ→

【79133】dictionary item 追加されない T-K 17/5/20(土) 23:38 質問[未読]
【79134】Re:dictionary item 追加されない カリーニン 17/5/21(日) 0:47 発言[未読]
【79140】Re:dictionary item 追加されない T-K 17/5/21(日) 9:45 お礼[未読]
【79135】Re:dictionary item 追加されない γ 17/5/21(日) 1:05 発言[未読]
【79136】Re:dictionary item 追加されない γ 17/5/21(日) 6:33 発言[未読]
【79137】Re:dictionary item 追加されない T-K 17/5/21(日) 7:25 質問[未読]
【79138】Re:dictionary item 追加されない γ 17/5/21(日) 7:55 発言[未読]
【79139】Re:dictionary item 追加されない T-K 17/5/21(日) 9:43 お礼[未読]
【79141】Re:dictionary item 追加されない γ 17/5/21(日) 12:04 発言[未読]
【79142】Re:dictionary item 追加されない T-K 17/5/21(日) 16:49 お礼[未読]

【79133】dictionary item 追加されない
質問  T-K  - 17/5/20(土) 23:38 -

引用なし
パスワード
   データより、クロス集計表をVBAで作成しようとしています。
前回もこちらでお世話になりましたが、再度ご教授お願いします。
A列 品名 B列 数字 C列日付 D列 数字のデータが
あります。(データ数不定)それを
A列とC列の値をKeyとして取込み、itemをD列の値で取込み
それをクロス集計表に作成したいとおもっています。
重複している場合はD列の値を追加するながれです。
ネット検索して使えそうなサンプルがあり、少しだけ加工処理してみましたが、
ローカルで確認するとD列の値が、Itemとして追加されていません。
データ型が違うのが原因なのか、インデックスが有効範囲にないだけなのか
原因がわからないためわかるかたがいたらよろしくお願いします。
下記にマクロ記入します

Sub test51()
  Dim myDic As Object, myKey, myItem
  Dim myVal, myVal2
  Dim i As Long, j As Long
  Dim sh1 As Worksheet
    Set myDic = CreateObject("Scripting.Dictionary")
    Set sh1 = Worksheets("Sheet1")
    ' ---元データを配列に格納
    myVal = sh1.Range("A1").CurrentRegion.Value
    ' ---myDicへデータを格納
    For i = 1 To UBound(myVal, 1)
      myVal2 = myVal(i, 1) & "_" & myVal(i, 3)
      If Not myVal2 = "_" Then
        If Not myDic.exists(myVal2) Then
          myDic.Add myVal2, myVal(i, 4)’登録されていない
        Else
          myDic(myVal2) = myDic(myVal2) + myVal(i, 4)
        End If
      End If
    Next
    ' ---Key,Itemの書き出し
    For i = 2 To 1000
      For j = 2 To 1000
        Cells(i, j).Value = myDic(Cells(i, 2).Value & "_" & Cells(2, j).Value)
       
      Next j
    Next i

    Set myDic = Nothing
    Set sh1 = Nothing
End Sub

【79134】Re:dictionary item 追加されない
発言  カリーニン  - 17/5/21(日) 0:47 -

引用なし
パスワード
   >myDic.Add myVal2, myVal(i, 4)’登録されていない

>myDic(myVal2) = myDic(myVal2) + myVal(i, 4)

↓のようにしたらどうなりますか?

myDic.Add myVal2, myVal(i, 4) * 1’登録されていない

myDic(myVal2) = myDic(myVal2) * 1 + myVal(i, 4) * 1

【79135】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 1:05 -

引用なし
パスワード
   > ローカルで確認するとD列の値が、Itemとして追加されていません。
ローカルウインドウで Itemと書いてあるのは、
別にDictionaryのItemが書かれているのではありません。
むしろDictionaryのkeyに相当するものです。
もっと簡単な例で確認してみてはどうですか?

【79136】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 6:33 -

引用なし
パスワード
   (1)ローカルウインドウの表示の件
Sub test()
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  dic("a") = 1
  dic("b") = 2
  Stop
End Sub
でローカルウインドウに表示されるのは、
"a"や"b"であって、1や2ではありません。
"Item"というのは、コレクション的なものの、各要素といった程度の意味です。
そしてdictionaryの場合はキーの値が表示される決まりです。

(2)
ところで、前半はこんな風にも書けるでしょう。
Sub test51()
  Dim dic As Object
  Dim mat As Variant
  Dim s  As String
  Dim i  As Long
  Dim j  As Long
  Dim sh1 As Worksheet

  Set dic = CreateObject("Scripting.Dictionary")
  Set sh1 = Worksheets("Sheet1")

  ' 元データを配列に格納
  mat = sh1.Range("A1").CurrentRegion.Value

  ' dicへデータを格納
  For i = 1 To UBound(mat, 1)
    s = mat(i, 1) & "_" & mat(i, 3)
    dic(s) = dic(s) + mat(i, 4)
  Next

(3)
このあとに続く部分は、アクティブシートに書き込むということですね?
シートを指定したコードにしたほうが間違いがないですよ。
Sheet1をアクティブにしておくと上書きされかねない。

(4)
また、そのキーの値は、予め判明しているのですか?
そのキーたちを、順序を含めて求めることになると、
むしろピボットテーブルを使ったほうが自然かもしれません。

【79137】Re:dictionary item 追加されない
質問  T-K  - 17/5/21(日) 7:25 -

引用なし
パスワード
   ローカルのItemがKEYのみ表示はしりませんでした。
Debug[.Printでイミデイトで表示したら、数値がでてきています。
ということは、登録されていると解釈していいのでしょうか?

Debug.Print myVal(i, 4)‘この一文をいれて確認しました。


後シート2のA列にシート1のA列のデータが、B2列〜各列に日付データが入力されています。


値を出して
これとは別のシートの表にコピーしたいのですが、そのシートの表は休日も
ふくまれています
そのためピボットテーブルの場合、データのみをクロス集計するため、
コピーして貼り付ける際手間になります。


シート2に記入したいのですが、現状ですと何も表示されません。
なにが悪いのか 重ねて教えてください。
よろしくお願いします

【79138】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 7:55 -

引用なし
パスワード
   最初にピボットテーブル関連に触れます。
「ピボットテーブル 連続した日」などで検索すると関連記事があります。
日付のグループ化とフィールドの設定で、「データのないアイテムを表示」を
使うと、データの無い日であっても、連続した日が表示されると思います。

さて、デバッグの話。
こうしたことは、ご自分でトライするものです。

>Debug.Print myVal(i, 4)‘この一文をいれて確認しました。
それはD列に値があるかの確認。

ローカルウインドウで表示されたキーを使って、イミディエイトウインドウで、
? dic(そのキー)
とでもすれば、dictionaryの正しさが確認できるでしょう。

dicの内容を表示するところは、
与えたキーが正しいかどうか、「あなた」が確認すべきです。

【79139】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 9:43 -

引用なし
パスワード
   T-Kです
早い返信ありがとうございます。
ピボットテーブルの件、ありがとうございます。
確認したら、必要な処理ができました。
目から鱗です
ですが、勉強の意味でもVBAでのクロス集計表の作成を目指します。


イミデイトにて表示させて、Itemが登録されているか
教えていただいた通り確認した結果、予定どおり登録されていました。

ありがとうございます。

それをシート2に作ってあるクロス集計表に、書き込む処理
をなんとかかんがえてみます。
ネットでのっていたサンプルをそのまま使っているため、
手直しが少し必要なようです。
教授ありがとうございました。

【79140】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 9:45 -

引用なし
パスワード
   とりあえず登録されていることがわかりました
いろいろとご迷惑おかけしました
また不明な点ありましたら教えていただけたらとおもいます

ありがとうございました

【79141】Re:dictionary item 追加されない
発言  γ  - 17/5/21(日) 12:04 -

引用なし
パスワード
   >それをシート2に作ってあるクロス集計表に、書き込む処理
>をなんとかかんがえてみます。
・書込先シートのB列に品名、
 2行目に日付が間違いなくセットされているか、
・日付の形式がシート1と同じかどうか、
がポイントと思う。
今のロジックでいけるはず。
Do your best !
     

【79142】Re:dictionary item 追加されない
お礼  T-K  - 17/5/21(日) 16:49 -

引用なし
パスワード
   T-Kです
再度ご指摘いただき
ありがとうございます。
ご指摘通りのでした
データ書き込まれました
ほんとに感謝いたします。

663 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free