- 締切済み
Excel 集計済みのデータをローデータ化したい
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。 VBAでの回答もやってみるらしいから、 ーーー VBAの回答は出ていますが、別個人で書き方が違うと、下記のようになります。コードの印象がちがいますよね。 Sub test02() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") lr = sh1.Range("A100000").End(xlUp).Row: MsgBox lr lc = sh1.Range("XFD1").End(xlToLeft).Column: MsgBox lc k = 2 '--- For i = 2 To lr For j = 2 To lc If sh1.Cells(i, j) <> "" Then sh2.Cells(k, "A") = sh1.Cells(i, 1) sh2.Cells(k, "B") = sh1.Cells(1, j) sh2.Cells(k, "c") = 1 k = k + 1 If sh1.Cells(i, j) > 1 Then For l = 2 To sh1.Cells(i, j) sh2.Cells(k, "A") = sh1.Cells(i, 1) sh2.Cells(k, "B") = sh1.Cells(1, j) sh2.Cells(k, "c") = 1 k = k + 1 Next l End If End If Next j Next i End Sub 例データ Sheet1 ー リンゴ メロン いちご 2017/4/1 1 1 2017/4/2 3 1 1 2017/4/3 1 2017/4/4 1 1 1 2017/4/5 1 1 結果 Sheet2 2017/4/1 リンゴ 1 2017/4/1 メロン 1 2017/4/2 リンゴ 1 2017/4/2 リンゴ 1 2017/4/2 リンゴ 1 2017/4/2 メロン 1 2017/4/2 いちご 1 2017/4/3 メロン 1 2017/4/4 リンゴ 1 2017/4/4 メロン 1 2017/4/4 いちご 1 2017/4/5 メロン 1 2017/4/5 いちご 1 件数1が要らない場合は sh2.Cells(k, "c") = 1 の行(コード)を省いてください。
- bunjii
- ベストアンサー率43% (3589/8249)
貼付画像のような結果(K1:L28)で良ければ作業用テーブル(F1:I81)を使って関数のみでできます。 但し、Excel 2007以降のバージョンによるものです。 F1=IF(ISTEXT(H1),ROW(),"") F1をF2:F81へコピーする。 H1="日付" I1="売れたもの" H2=IF(INT((ROW()-MAX($F$1:$F1)-1)/3)<COUNT(A:A),OFFSET($A$1,INT((ROW()-MAX($F$1:$F1)-1)/3)+1,0),"") I2=IF(IFERROR(VLOOKUP(H2,A:D,MOD((ROW()-MAX($F$1:$F1)-1),3)+2,FALSE)>0,),OFFSET($A$1,0,MOD((ROW()-MAX($F$1:$F1)-1),3)+1),"") H2:I2を下へ81行目までコピーする。 K2=INDEX(H:H,MOD(SMALL(IFERROR((I$2:I$101<>"")*H$2:H$101+(I$2:I$101="")*"3000/1/1","3000/1/1"*1)*1000+ROW(I$2:I$101),ROW()-1),1000)) この数式はCtrl+Shft+Enterキーで確定する。 L2=INDEX(I:I,MOD(SMALL(IFERROR((I$2:I$101<>"")*H$2:H$101+(I$2:I$101="")*"3000/1/1","3000/1/1"*1)*1000+ROW(I$2:I$101),ROW()-1),1000)) この数式もK2と同様のCtrl+Shft+Enterキーで確定する。 K2:L2を下へ28行目までコピーする。 当方はExcel 2013で検証しました。
- tsubu-yuki
- ベストアンサー率46% (179/386)
一先ず、用語の整理。 ローデータ = 加工されていない生データ ですから、「ローデータに変換」って変な日本語ですね。 さて、本題。 ワークシート関数でも何とかなるのかもしれませんが、 件数が多くなればなるほど式も複雑になりますし、 なんせエクセルの動きが渋くなる可能性も高いです。 私は関数は不得手なので提示できませんが(笑)。 なので私もVBAを推しますね。 例示のデータ件数くらいなら10数行で書ききれると思いますし。 例えば、ごく単純な考え方で、極力(無駄があっても)簡単な処理で Sub Sample1() Dim TagRow As Long, LastRow As Long, LastCol As Long Dim Target As Range Range("F:G").Delete LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastCol = Cells(1, Columns.Count).End(xlToLeft).Column Range("F1:G1") = Array("日付", "売れたもの") TagRow = 2 For Each Target In Range(Cells(2, 2), Cells(LastRow, LastCol)) If Target.Value > 0 Then i = 0 Do Cells(TagRow, 6) = Cells(Target.Row, 1) Cells(TagRow, 7) = Cells(1, Target.Column) TagRow = TagRow + 1: i = i + 1 Loop Until i = Target End If Next Columns(6).NumberFormatLocal = "yyyy/m/d" End Sub A~D列に集計表があると仮定し、F~G列にテーブルを返します。 行・列、表の位置、その他の条件についてのご提示が無いので、 この中では全く考慮していません。 よって、「どこをどういじれば実状に合うか」等の 追加質問には基本的には応じませんので悪しからず。 とりあえず・・・「逆だよなー」と、いつも思います(笑)。 右が素材で左が集計結果ですね。 データベースの考え方としては素材を集計して結果を出すのであり、 得られるべき結果から素材を引き出す・・ つまり、与えられた「生データ(現状ではこれがローデータですね)」から データテーブルを再構築して、今後の「ローデータ」として使いたい、 という作業ですので、通常とは真逆の作業なわけです。 なので、VBAで強引に・・という事ですね。 ただし、他人が書いたマクロを鵜呑みにするのは危険です。 世の中には(私のように)悪意あるマクロを提示する人間も 若干名ではありますが存在しますので、お気を付けくださいませ。
- imogasi
- ベストアンサー率27% (4737/17069)
VBAでやれば、ロジックは、簡単。VBAはできる? VBAを勉強したら。 ーー できないなら、数が少なければ、手作業でやればよい。 ただし同一日・同一品目が1セルに複数件数のままでよいなら、手作業でやれる。その先は手作業ではむつかしかろう。 でも関数マニアの回答者が回答するかもしれないから、気長に回答を待っていたら。 ーー エクセルでは、関数では、表の組換えは、苦手な分野だと思う。特に行やセルを増やすほうに持って行くのは極く難しい(式が長く複雑)ように思う。
お礼
ありがとうございます! VBA はできないんです。。。 もう少し待ってみます!
お礼
ご丁寧にありがとうございます。 VBA が分かるスタッフがいたので、参考にしてトライしてみます!