プロが教える店舗&オフィスのセキュリティ対策術

EXCEL2003を利用しています。

まず、写真を確認お願いいたします。SHEET1に
・A列 No
・B列 年月日
・C列 会社
・D列 商品
の表があります。それをSHEET2で
・行タイトルで会社名
・列タイトルで年月日
の表をつくり、表のデータには、写真のように
商品を計算せずに書き出す。ということをしたいです。

これを手作業で行うのは大変なので、できればうまく簡単に出来るようにしたいです。

ピヴォットテーブルであれば、何らかの計算をしたものを楽に表示することができるのは知っているのですが、このように計算せずに簡単に表示させる方法を教えてもらえないでしょうか?

https://www.dropbox.com/s/nxsgkfgd6k9ti11/%E3%82 …

A 回答 (3件)

こんばんは!


VBAになってしまいますが一例です。

Alt+F11キー → メニュー → 挿入 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻りマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() 'この行から
Dim i As Long, j As Long, lastRow1 As Long, lastRow2 As Long, lastCol As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
Application.ScreenUpdating = False
With Worksheets("Sheet1")
lastRow1 = .UsedRange.Rows.Count
.Range("E:E").Insert
.Range("B:B").Copy
.Range("E1").PasteSpecial Paste:=xlPasteValues
wS.Range("A:A").Insert
lastRow2 = wS.UsedRange.Rows.Count
lastCol = wS.Cells(1, Columns.Count).End(xlToLeft).Column
If lastRow2 > 1 And lastCol > 2 Then
Range(wS.Cells(2, "C"), wS.Cells(lastRow2, lastCol)).ClearContents
End If
For i = 2 To wS.Cells(Rows.Count, "B").End(xlUp).Row Step 3
For j = 3 To lastCol
.Range("A1").AutoFilter field:=3, Criteria1:=wS.Cells(i, "B")
.Range("A1").AutoFilter field:=5, Criteria1:=wS.Cells(1, j)
If .Cells(Rows.Count, "D").End(xlUp).Row > 1 Then
Range(.Cells(2, "D"), .Cells(lastRow1, "D")).SpecialCells(xlCellTypeVisible).Copy wS.Range("A1")
Range(wS.Cells(1, "A"), wS.Cells(3, "A")).Copy wS.Cells(i, j)
wS.Range("A:A").ClearContents
End If
Next j
Next i
.AutoFilterMode = False
.Range("E:E").Delete
wS.Range("A:A").Delete
Application.ScreenUpdating = True
wS.Activate
End With
End Sub 'この行まで

※ 関数ではないので、Sheet1のデータ変更があるたびにマクロを実行する必要があります。m(_ _)m
    • good
    • 0

質問にある図で、



セルB2:
=INDEX(Sheet1!$D:$D,SMALL(IF((Sheet1!$B$2:$B$20=B$1)*(Sheet1!$C$2:$C$20=$A2),ROW(Sheet1!$D$2:$D$20),10000),MOD(ROW(A2)+1,3)+1),1)

セルB3:
=INDEX(Sheet1!$D:$D,SMALL(IF((Sheet1!$B$2:$B$20=B$1)*(Sheet1!$C$2:$C$20=$A2),ROW(Sheet1!$D$2:$D$20),10000),MOD(ROW(A3)+1,3)+1),1)

セルB4:
=INDEX(Sheet1!$D:$D,SMALL(IF((Sheet1!$B$2:$B$20=B$1)*(Sheet1!$C$2:$C$20=$A2),ROW(Sheet1!$D$2:$D$20),10000),MOD(ROW(A4)+1,3)+1),1)

いずれも配列数式です。登録するとき、CTRL+SHIFT+ENTERとしてください。10000行までは大丈夫でしょう。
上記3式よく似ていますが、A列の「A、B、C・・・」が消されているので苦肉の策で3式にしました。($A2が動いていません)

3式をセットで横に日付分コピーした後は、「A、B、C・・・」を3行単位でコピーしてください。

もう少し短くできるかもしれませんがこの辺りで。。。
    • good
    • 0

同会社で日付が重複しているデータは最大3個と決めつけて構わないの?


そういうことはキチンと書いておきませうネ!

この回答への補足

ご指摘ありがとうございます。
最大3個という条件です。

補足日時:2014/07/08 18:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!