- ベストアンサー
Excelについて質問します
Excel2000を使用しております。 早速ですが、たとえば以下のようなシートがあります。 <Sheet1> 「商品コード」「数量」「金額」「商品グループコード」 A0001 10 ¥500 01 A0002 12 ¥580 01 A0003 17 ¥690 02 このシートから以下のようなシートを作成します。 <Sheet2> 商品グループ 01 「商品コード」「数量」「金額」 A0001 10 ¥500 A0002 12 ¥580 ・ 商品グループ 02 「商品コード」「数量」「金額」 A0003 17 ¥690 このとき、Sheet1の商品グループは毎月の売上状況により変わります(その月売れないものもあれば、新たに売れるものもある)。 Sheet2を自動的(マクロ、VBA)に作成したいのですが、何か良い方法はないでしょうか?うまく表現できなくてすみません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じで作成できるでしょう。 ただ、シートを行ったり来たりする方法しか知らないので、画面はちらちらします。 Sub Make_Sheet2() ' ' Macro1 Macro ' マクロ記録日 : 2002/5/14 ユーザー名 : Naoki Higashida ' ' Sheets("Sheet1").Select i = 0 k = 1 j = 0 LP1 = True LP2 = True While LP1 buff = "D" & 2 + i GroupCode = Range(buff).Value If GroupCode = "" Then LP1 = False Else Sheets("Sheet2").Select Range("A" & k).Value = "商品グループコード" Range("B" & k).Value = GroupCode k = k + 1 Range("A" & k).Value = "商品コード" Range("B" & k).Value = "数量" Range("C" & k).Value = "金額" k = k + 1 LP2 = True j = i End If While LP2 Sheets("Sheet1").Select If GroupCode = Range("D" & 2 + j).Value Then Code = Range("A" & 2 + j).Value Num = Range("B" & 2 + j).Value Price = Range("C" & 2 + j).Value Sheets("Sheet2").Select Range("A" & k).Value = Code Range("B" & k).Value = Num Range("C" & k).Value = Price k = k + 1 j = j + 1 Else i = j - 1 LP2 = False End If Wend i = i + 1 Wend End Sub
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17070)
時間がないので、ロジックだけ記します。わかって頂けますように。今日の昼にも、同じようなタイプのプログラム を組んで走らせました。結構似たタイプの処理があるので 私は自分のスタイルとしています。 (1)Sheet1の「商品グループコード」でソートする。 (2)Sheet2の行ポインターをjとする。初期値j=3(例えば)第1行目は見だし。第2行めは項目見だし。 (3)データの最上行3(と仮定)から最下行ll=CurrenntRegion.Row.Count- 1まで、をSheet1の行ポインターとして For i=3 to ll ( 処理) next i の(処理)について (4)最初行を除いて、前の行の「商品グループコード」と変わっていないか、For文のすぐ下で、If文で最初に聞く。 (5)変わったら合計をSheet2に入れる等する。入れたあと J=J+1(1行下へ進める) (6)変わらなければ、別シートに転記する。入れた後 J=J+1。別シートへの転記は、列毎に WorkSheets("Sheet2").cells(j,1)=WorkSheets("Sheet1").cells(i,1) A列の例 で出来る。 (7)For Nextが終わったら、最後の「商品グループコード」の合計書き出しを忘れず、総合計の書き出しも忘れず行って終わる。
お礼
回答ありがとうございます。 さっそくためしてみます。
補足
度々すみません。 おっしゃていることはわかるのですが、今の私のレベルではこれをコードに書くことができません。おこがましいお願いですが、お暇な時にサンプルコードをお教えいただければ幸いです。
- madman
- ベストアンサー率24% (612/2465)
i,j,kは整数型です。 宣言しなくても別段問題なく動作します。(速度が少し落ちますが) i,j,kが各読出し、書き出しの行数を決めています。 今は、 <Sheet1> A B C D 1「商品コード」「数量」「金額」「商品グループコード」 2 A0001 10 ¥500 01 3 A0002 12 ¥580 01 4 A0003 17 ¥690 02 として、見ています。 また、グループコードは同じコードが連続していないとダメな作りになっています。 レコードは何レコードあっても問題ありません。
お礼
ご連絡が遅くなりました。 回答ありがとうござまいす。早速ためしてみます。
お礼
度々すみません。 追加質問のしかたがわからないでこの項目で質問させていただきます。 上記のコードを試してみたのですが、たしかに2つのシート間を行き来して動いているようなのですが、処理が終わらず暴走(?)してしまいます。 私自身VBAをよく理解していないのかもしれませんが、アドバイスしていただければ幸いです。
補足
早速の回答ありがとうございます。 最初の方にある、i,k,j,buffは変数ですようか? 変数なら型は整数型で良いでしょうか?