- 締切済み
Excel VBAで項目ごとに別々のシートに転記したい
excel VBAで項目ごとに別々のシートに転記したい 困り度: すぐに回答を! excelVBA勉強中の初心者です。 初めて質問させていただきます。 初心者には難しく、行き詰ってしまいました。 仕事で以下のことがしたく、基本書、参考書などを調べて勉強し作成していっているのですが、身近に教えていただける方もおらず、つまづいております。 詳しい作成方法など、詳しい方にご教授いただければと思います。 book(1) 一ヶ月分の売上データが入っており、 A列に取引先名 B列に商品名 C列に件数 D列に合計額 があります(1万行前後)。 book(2) シート1に抽出したい取引先名の一覧(50件ほど)、 シート2以降は転記用でA列に商品の一覧(固定)、 例えば4月分であればB列に件数、C列に金額、 5月分であればD列に件数、E列に金額・・と一年間使用するため、件数・金額は12か月分用意してあります。 シート1にある抽出したい取引先ごとに作成しています。 (1)の売上データを、(2)にあるシート1の取引先一覧と一致するものを抽出して、取引先ごとに分けてあるシートに転記したいのです。 ※(1)の売上データには抽出不要の取引先も多数含まれています。 ※(1)の売上データは同じレコードが存在する場合もありますが、すべて別々のものとみなし、転記先シートには件数・金額ともに合計を表示したい 以上です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- n-jun
- ベストアンサー率33% (959/2873)
ANo.2です。 4月・5月・・・をどのように判断するのか不明ですし、エラー処理もしてません。 従って4月の位置(B列・C列)に書き込むだけです。 またセルの配置があっているか自信はありません。 Sub try() Dim Dic As Object Dim wb As Workbook Dim r As Range, rr As Range Dim i As Long Dim st As String Dim v, w, n, key Set Dic = CreateObject("Scripting.Dictionary") Set wb = Workbooks("Book2.xls") With wb.Worksheets("Sheet1") Set r = .Range(.[A2], .Cells(Rows.Count, 1).End(xlUp)) End With With Workbooks("Book1.xls").Worksheets("Sheet1") v = .Range(.[A2], .Cells(Rows.Count, 4).End(xlUp)).Value For i = 1 To UBound(v, 1) st = v(i, 1) & "_" & v(i, 2) If Not Dic.Exists(st) Then Dic(st) = Array(v(i, 3), v(i, 4)) Else Dic(st) = Array(Dic(st)(0) + v(i, 3), Dic(st)(1) + v(i, 4)) End If Next End With For Each key In Dic.keys w = Split(key, "_") n = Application.CountIf(r, w(0)) If n > 0 Then With wb.Worksheets(w(0)) Set rr = .Range(.[A3], .Cells(Rows.Count, 1).End(xlUp)) n = Application.Match(w(1), rr, 0) If IsNumeric(n) Then .Range("B" & n + 2).Resize(1, 2).Value = _ Application.Transpose(Application.Transpose(Dic(key))) End If End With End If Next Set Dic = Nothing Set wb = Nothing Set r = Nothing Set rr = Nothing Erase v End Sub ご参考になるかどうか。。。?
- n-jun
- ベストアンサー率33% (959/2873)
Ano.1です。 どのような形式のデータから、どのような形式に纏めたいのかよくわかりません。 例えばbook1のどこから、book2の4月分とか5月分とか・・・になるとか。 たぶんですけど、文章よりシート構成を提示された方が良いのかもしれません。 または実務に早急に必要な事であるのなら、勉強とは切り分けて上司に相談されるのが宜しいかと。(外注委託等々) ちなみに同じ項目毎に集計をしていく方法では、私はDictionaryオブジェクトを使用してます。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html ご参考になれば幸いです。
補足
ご回答ありがとうございます! Dictionaryオブジェクトですが、早速調べてみたいと思います。 なにか理解につながるきっかけでもなんでも欲しい、と思っていましたので大変ありがたいです! シート構成を簡単ですが作ってみました。 ******************************** book(1) 売上実績のデータ <A> <B> <C> <D> 取引先 商品名 件数 金額 エ会社 色鉛筆 3 1200 ビ商会 色鉛筆 4 1600 エ会社 消ゴム 6 300 シー屋 定規大 8 4000 ビ商会 メモ帳 5 500 エ会社 色鉛筆 5 2000 シー屋 定規小 6 2400 デ会社 消ゴム 10 500 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ひとつの取引先でも同じ商品名での売上が複数あります。 例) エ会社→ 色鉛筆 3 1200 色鉛筆 5 2000 など この場合、転記先には8件・3200円と転記したい ******************************** book(2) 取引先、商品の一覧、転記用シートを用意 こちらにコードを書いていっています。 ●シート1● <A> <D> 取引先一覧 商品一覧 エ会社 消ゴム シー屋 定規小 デ会社 定規大 ・ ・ ・ ・ ・ ・ <A>には、抽出したい取引先のみ一覧となっている <D>には、すべての商品一覧で、シート2のA列と同じ ●シート2以降● ≪4月分≫ ≪5月分≫ ・・・・ <A> <B> <C> <D> <E>・・・・ 商品一覧 件数 金額 件数 金額 消ゴム 定規小 定規大 ・ ・ ・ シート1のA列にある取引先一覧にあるものをシート別にしたもので、 様式・商品一覧はどのシートもすべて同じものを使用しています。 4月、5月・・と一年分を用意してありますが、1回にくるデータはひと月分なので5月分がきたら5月分の列に転記、6月分なら6月分の列へ・・といった感じです。
- n-jun
- ベストアンサー率33% (959/2873)
出来ている範囲だけでも(例え上手く動かなくても)提示された方がいいかもしれません。 あとbook(2)のシート2以降のA列に商品の一覧があって、シート1に取引先名があると言うのであれば、 取引先毎の商品名には重複はない?のか、或いは結びつけるリスト等は存在しないのか? ちょっと疑問に感じました。
補足
ご回答ありがとうございました。 説明不足で申し訳ありません。 book(2)の取引先一覧の横に商品名の一覧もあり、 この商品名一覧はどの取引先にも共通で、シート(2)以降すべてのシートのA列に同じものを載せています。 また、シート(2)以降の取引先別シートはシートタブとセルA1のみに取引先一覧からもってきた取引先名を入れおり、他はすべて同じ内容です。 book(1)のデータ内のには一つの取引先にも同じ商品名が複数あり、その件数と金額のそれぞれ合計をbook(2)に転記できれば、と思います。 今の段階では、 ・book(2)の取引先一覧から各シートを作成して、シート名をつける ・データそのものがCSVでくるのでそれをを開いて不要な列などを削除し、book(1)とする とまでしかできておらず、肝心の集計のところでつまづいています。 繰り返し検索・抽出・転記ということでFor~Next、Do~Loopなど使えばよいのか?と思ってやってみてはいるのですが、シートを選択して転記、という条件がよく理解できず、うまくつながらないようで・・。 知識も実践もなくお恥ずかしいのですが、何を使えばよいのかいまいちよくわかりません。 アドバイスでも良いので是非お願いします!
お礼
ご回答ありがとうございます! 詳細のコードまで考えていただき、大変感謝しております。 月の判別は自分にとってはまだまだ次の課題でまずひと月分の集計・転記を理解しなければ、と思っています。 早速教えて頂きましたコードを参考にして頑張ってみたいと思います。 素早い回答とアドバイス、本当にありがとうございました。