Excel VBA質問箱 IV

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

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


166 / 3841 ページ ←次へ | 前へ→

【79153】Re:2種類の集計方法
発言  カエムワセト  - 17/5/26(金) 1:19 -

引用なし
パスワード
   考え方の一例です。


1.※商品別の数量・金額の合計を集計する

「ソート」シートのD列をキーに重複無しの品名コード一覧を作成

品名コード一覧から項目を一つづつ取出して、SUMIF等を使って数量合計、金額合計を算出
ループは1回

2.※日別の商品別の数量・金額の合計を集計する
「ソート」シートのD列をキーに重複無しの品名コード一覧を作成
同じく重複無しの日付一覧を作成
品名コード一覧から項目を一つづつ取出して、SUMIFS等を使って品名コードと日付一覧をキーに数量合計、金額合計を算出
ループは2回/品名コードループ中に日付ループを組み入れる

※ピボットテーブルだともっと簡単に行けると思います。ピボットテーブルは使ったことが無いので解説できません。
・ツリー全体表示

【79151】Re:2種類の集計方法
発言  たく  - 17/5/25(木) 15:53 -

引用なし
パスワード
   追記させていただきます。
自分なりに切ったはったで記述したものです。
よろしくお願いいたします。

Sub 商品別集計()
  Dim dKey As String
  Dim c As Range
  Dim dic As Object
  Dim v As Variant
  Dim i As Long
  Dim j As Long
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("ソート") 
    For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
      dKey = c.Value & vbTab & c.Offset(, 1).Value
      dic(dKey) = dic(dKey) + c.Offset(, 2).Value
    Next
  End With
  
  With Sheets("集計")  '転記シート
    v = .Range("A1").CurrentRegion.Value
    For i = 2 To UBound(v, 1)
      For j = 2 To UBound(v, 2)
        dKey = v(1, j) & vbTab & v(i, 1)
        v(i, j) = dic(dKey)
      Next
    Next
    .Range("A1").CurrentRegion.Value = v
    .Select
  End With
  
  Set dic = Nothing

  
End Sub
・ツリー全体表示

【79150】Re:2種類の集計方法
発言  カエムワセト  - 17/5/25(木) 15:41 -

引用なし
パスワード
   ここのVBA質問箱基本ポリシーの記述です。


>何をやったか書いてください
>おそらくあなたは、色々なことを試してできなかった末にここに質問を書くのでしょう。しかし回答者は、あなたが今まで何をやってきたか、何を知っていて何を知らないかわかり>ません。今まで試したこと、やろうと思ったけどやり方がわからなかったことなどをできるだけ詳しく書いてください。
・ツリー全体表示

【79149】2種類の集計方法
質問  たく  - 17/5/25(木) 15:16 -

引用なし
パスワード
   元データから下記のような二通りの集計をしたいと考えています。
こちらの過去質問も確認しましたが、
アレンジしても思うようにいきません。
お知恵をお貸しいただけたらと思います。
よろしくお願いいたします。


Sheet名[ソート]
※これが元データです。
  A    B     C     D       E     F       G       H    I    J
1 売上日  伝票No.    連番    品名コード    品名   倉庫コード    納入場所   数量    単価    金額
2 2017/4/1 12345   1    62845    ボールペン 692      東京    15,800   20  316000
3 2017/4/1 12845   1    62846    万年筆   258      厚木    2,950   10  29500
4 2017/4/2 32985   1    62843    赤鉛筆   21       長島    6,849   30  205470
5 2017/4/3 62451   1    62841    鉛筆HB   30       京都    30,500   50  1525000
  ・
  ・
  ・
  ・
  ・
30 2017/4/30

Sheet名[商品別集計]←マクロの中でシートを新規作成し、集計という名前を付けて保存。
※商品別の数量・金額の合計を集計する
  A        B     C     D 
1 品名コード      品名   数量    金額
2 62845    ボールペン 98,000  196,000
3 62846    万年筆   47,500   475,000
4 62843    赤鉛筆   38,400  1,152,000
5 62841    鉛筆HB   105,000 5,250,000
  ・
  ・
  ・
  ・
  ・
Sheet名[日時集計]←マクロの中でシートを新規作成し、集計という名前を付けて保存。
※日別の商品別の数量・金額の合計を集計する

  A    B        C     D       E  
1 売上日  品名コード  品名   数量    金額
2 2017/4/1 62845    ボールペン15,800  316000
3 2017/4/1 62846    万年筆  2,950   29500
4 2017/4/2 62843    赤鉛筆  6,849   205470
5 2017/4/3 62841    鉛筆HB  30,500  1525000
  ・
  ・
  ・
  ・
  ・
30 2017/4/30
・ツリー全体表示

【79148】Re:ファイルをまたいだ数値の取得および...
発言  γ  - 17/5/25(木) 7:19 -

引用なし
パスワード
   疑問点。
1.単月業績ファイルでは、部門という切り口はどうなっているのですか?
2.製品は"あ"と"い"だけですか?それは固定なんですか?

集計は「作業内容」ファイルで計算式で行い、
その結果を転記する部分だけマクロにするほうが効率がよいかもしれませんね。

なお、表を書くときは、こんな風に書いた方が分かりやすいと思う。
■「作業内容」ファイルの「部門A」シート(元資料)

(上段;予算 下段;実績)
 A      B    C    D ・・・・・
1 作業内容   4月  5月  6月 ・・・・・
2 作図   10,000 11,000 12,000・・・・
3 (製品あ)  9,000 12,000 10,500・・・・
4 組立   15,000 14,000 17,000・・・・
5      13,500 12,000 16,000・・・・
6 要請対応  5,000  4,200  4,800・・・・
7       5,100  4,000  4,700・・・・
8 作図    3,000  2,700  2,800・・・・
9 (製品い)  2,850  2,750  2,900・・・・
・ツリー全体表示

【79147】Re:ファイルをまたいだ数値の取得および...
発言  カリーニン  - 17/5/24(水) 10:35 -

引用なし
パスワード
   先ずは、手作業でやるならどういう手順になるかを日本語で考えてみましょう。
後は、考えた手順をコード化するだけです。
・ツリー全体表示

【79146】ファイルをまたいだ数値の取得および合算
質問  まぐろ  - 17/5/24(水) 8:53 -

引用なし
パスワード
   初投稿です、よろしくお願いします。

以下の、SHEET”部門A”(元資料)から別ファイルのSHEET”○月”(最新の月。
例として6月)へ、ボタンを押すと自動で数値が流れるようにしたいです。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

     SHEET”部門A”(ファイル「作業内容」。元資料)

(上段;予算 下段;実績)
  A1    B1   C1   D1 ・・・・・
作業内容   4月  5月  6月 ・・・・・
  A2・3   B2   C2   D2
 作図   10,000 11,000 12,000・・・・
 (製品あ)  B3   C3   D3
       9,000 12,000 10,500・・・・
  A4・5   B4   C4   D4
 組立   15,000 14,000 17,000・・・・
       B5   C5   D5
      13,500 12,000 16,000・・・・
  A6・7   B6   C6   D6
 要請対応  5,000  4,200  4,800・・・・
       B7   C7   D7
       5,100  4,000  4,700・・・・
  A8・9   B8   C8   D8
 作図    3,000  2,700  2,800・・・・
 (製品い)  B9   C9   D9
       2,850  2,750  2,900・・・・

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

     SHEET”6月”(ファイル「単月業績」)
  
      AV29   AW29   AX29
           予算    実績
      AV30   AW30   AX30
      作図   14,800  13,400→製品"あ"と"い"の合算
      AV31   AW31   AX31
      組立   17,000  16,000
      AV32   AW32   AX32
     要請対応  4,800   4,700

   ※AV,AWといった中途半端な位置にあるのは、SHEET
    ”6月”には「作業内容」以外に他の資料から
    数値を引っ張ってくる為
    
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
○備考
・ファイル「作業内容」には”部門A”以外、部門B・C・・と他の部門のSHEET
が入っている。毎月それぞれのシートに最新月の数値を追加していく
・ファイル「単月業績」は毎月、”4月””5月”・・と毎月最新月のSHEETを作っていく

ネットで方法を調べて考えてみましたが、
引用してくる数値が月によって変わること(特定の月の数値を指定して引用する
必要がある)、引用してきた数値を合算すること、ファイル間をまたぐこと
が重なり、どこから手をつければいいかわからなくて質問致しました。
お分かりになれば教えて頂きたいです。すいませんが、よろしく
お願いします。
・ツリー全体表示

【79145】Re:VBEの方の行数の表示
お礼  かな  - 17/5/22(月) 11:28 -

引用なし
パスワード
   ▼カリーニン さん:
回答ありがとうございます。
なかなか目的の記事が見つからず、助かりました。
こちらを参考にデフォでも表示できる方法も探したいと思います。
ありがとうございました。
・ツリー全体表示

【79144】Re:VBEの方の行数の表示
発言  カリーニン  - 17/5/22(月) 10:50 -

引用なし
パスワード
   VBE 行番号 表示
でネット検索してみました。

ht tp://www.koikikukan.com/archives/2014/01/30-015555.php

デフォルトで行番号を表示する機能があるかわ調べていません。
・ツリー全体表示

【79143】VBEの方の行数の表示
質問  かな  - 17/5/22(月) 10:13 -

引用なし
パスワード
   VBE上での行数表示をしたいんですが、そのようような機能はありますか?
・ツリー全体表示

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

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

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

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

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

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

ありがとうございました
・ツリー全体表示

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

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


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

ありがとうございます。

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

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

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

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

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

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

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

【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に記入したいのですが、現状ですと何も表示されません。
なにが悪いのか 重ねて教えてください。
よろしくお願いします
・ツリー全体表示

【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)
また、そのキーの値は、予め判明しているのですか?
そのキーたちを、順序を含めて求めることになると、
むしろピボットテーブルを使ったほうが自然かもしれません。
・ツリー全体表示

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

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

【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
・ツリー全体表示

【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
・ツリー全体表示

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