Excel VBA質問箱 IV

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

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


3214 / 13644 ツリー ←次へ | 前へ→

【63450】見よう見まねでScripting.Dictionaryを利用したのですが 初心者です。 09/11/5(木) 18:45 質問[未読]
【63452】Re:見よう見まねでScripting.Dictionaryを... kanabun 09/11/5(木) 19:43 発言[未読]
【63453】Re:見よう見まねでScripting.Dictionaryを... ichinose 09/11/5(木) 19:43 発言[未読]
【63537】Re:見よう見まねでScripting.Dictionaryを... 初心者です。 09/11/16(月) 13:42 お礼[未読]
【63454】Re:見よう見まねでScripting.Dictionaryを... kanabun 09/11/5(木) 23:32 発言[未読]
【63536】Re:見よう見まねでScripting.Dictionaryを... 初心者です。 09/11/16(月) 13:41 お礼[未読]

【63450】見よう見まねでScripting.Dictionaryを利...
質問  初心者です。  - 09/11/5(木) 18:45 -

引用なし
パスワード
   見よう見まねでScripting.Dictionaryを利用したのですが
全く別シートに表示されません。

対象データを範囲指定を利用して処理する最後の行数を取得
しているのですがうまくいきません。

どなたか教えて下さい。
御願いします。

KEYにしているのは名前です。(文字列)
加算するのは、金額です。

  Dim i As Long
  
  Dim vnt, a
  Dim dic As Object
  
  With Sheets("作業")
    vnt = .Range("M1", .Range("A65536").End(xlUp)).Value
  End With
  
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(vnt, 1)
    If Not dic.exists(vnt(i, 13)) Then
      ReDim a(2)
      a(0) = vnt(i, 13)
    Else
      a = dic(vnt(i, 13))
    End If
    a(1) = a(1) + vnt(i, 11)
    dic(vnt(i, 13)) = a
  Next i
  
  '-----結果出力
  With Sheets("集計")
    .Cells.ClearContents
    .Range("A1").Resize(, 2).Value = Array("仕入先名称", "仕入金額")
    
    .Range("A2").Resize(dic.Count, 2).Value = Application _
          .Transpose(Application.Transpose(dic.items))
    .Select
  End With
  '
  Erase vnt
  Set dic = Nothing

【63452】Re:見よう見まねでScripting.Dictionary...
発言  kanabun  - 09/11/5(木) 19:43 -

引用なし
パスワード
   ▼初心者です。 さん:
こんにちは。

>全く別シートに表示されません。

こちらでは、出力されてますが?


>対象データを範囲指定を利用して処理する最後の行数を取得
>しているのですがうまくいきません。

>  With Sheets("作業")
>    vnt = .Range("M1", .Range("A65536").End(xlUp)).Value
>  End With
A列は M列と同じ行数だけデータが入ってますか?

>    If Not dic.exists(vnt(i, 13)) Then
>      ReDim a(2)
>      a(0) = vnt(i, 13)
>    Else
>      a = dic(vnt(i, 13))
>    End If
>    a(1) = a(1) + vnt(i, 11)
>    dic(vnt(i, 13)) = a

強いて言えば、 Redim a(2) と再定義したとき、要素は a(0)〜a(2) まで
なので、上のコードを見る限り、a(2) はどこでも使ってませんので、
ReDim a(1)
でもよいのでは?
くらいですけど。

【63453】Re:見よう見まねでScripting.Dictionary...
発言  ichinose  - 09/11/5(木) 19:43 -

引用なし
パスワード
   ▼初心者です。 さん:
こんばんは。
何らかの元データを集計する・・、情報処理ですよね?

この場合、入力データがあって、これを処理するVBAコードがあって、
本来望んでいる出力結果があるはずなんです。

その内の処理するコードしか投稿されていません。

本来は、入力データとして、




このようなデータがある時、

以下のコードを実行させました。
以下のような結果になることを想定しているのですが、





全く別シートに表示されません。

という記述が必要です。


これを記述しててください。


>
>対象データを範囲指定を利用して処理する最後の行数を取得
>しているのですがうまくいきません。
>
>どなたか教えて下さい。
>御願いします。
>
>KEYにしているのは名前です。(文字列)
>加算するのは、金額です。
>
>  Dim i As Long
>  
>  Dim vnt, a
>  Dim dic As Object
>  
>  With Sheets("作業")
>    vnt = .Range("M1", .Range("A65536").End(xlUp)).Value
>  End With
>  
>  Set dic = CreateObject("Scripting.Dictionary")
>  For i = 1 To UBound(vnt, 1)
>    If Not dic.exists(vnt(i, 13)) Then
>      ReDim a(2)
>      a(0) = vnt(i, 13)
>    Else
>      a = dic(vnt(i, 13))
>    End If
>    a(1) = a(1) + vnt(i, 11)
>    dic(vnt(i, 13)) = a
>  Next i
>  
>  '-----結果出力
>  With Sheets("集計")
>    .Cells.ClearContents
>    .Range("A1").Resize(, 2).Value = Array("仕入先名称", "仕入金額")
>    
>    .Range("A2").Resize(dic.Count, 2).Value = Application _
>          .Transpose(Application.Transpose(dic.items))
>    .Select
>  End With
>  '
>  Erase vnt
>  Set dic = Nothing

【63454】Re:見よう見まねでScripting.Dictionary...
発言  kanabun  - 09/11/5(木) 23:32 -

引用なし
パスワード
   ▼初心者です。 さん:

>KEYにしているのは名前です。(文字列)
>加算するのは、金額です。

ということでしたら、名前の列をDicのキーに
金額の列を DicのItemにセットしていけばいい訳だから、
Itemに 配列変数a を格納する必要はないですよね?

Sub てすと2()
  Dim i As Long
  Dim v
  Dim dic As Object
  Const M = 13                '仕入先列 (M列)
  
  With Sheets("作業")             'K列〜M列 を配列に
    v = .Range(.Cells(1, M - 2), _
           .Cells(.Rows.Count, M).End(xlUp)).Value
  End With
 
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(v, 1)
    dic(v(i, 3)) = dic(v(i, 3)) + v(i, 1)  '仕入先別集計
  Next i
 
  '-----結果出力
  With Sheets("集計")
    .UsedRange.ClearContents
    .Range("A1").Resize(, 2).Value = Array("仕入先名称", "仕入金額")
    .Range("A2").Resize(dic.Count, 2).Value = _
      Application.Transpose(Array(dic.Keys, dic.Items))
    .Select
  End With
  '
  Erase v
  Set dic = Nothing

End Sub

【63536】Re:見よう見まねでScripting.Dictionary...
お礼  初心者です。  - 09/11/16(月) 13:41 -

引用なし
パスワード
   お手数おかけしましたが
無事解決できました。
ありがとうございました。

【63537】Re:見よう見まねでScripting.Dictionary...
お礼  初心者です。  - 09/11/16(月) 13:42 -

引用なし
パスワード
   お手数おかけしましたが
無事解決できました。
ありがとうございました

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