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

エクセルで日報を作成しています。
1sheetに365日分のセルを作成。
A1のセルに3月と入力すると以下の365行が「3月1日~3月31日」の
31行分の1か月分が表示になるようにするにはどんなテクニックが必要でしょうか?エクセルを終了して、その条件はキープしていて欲しい。

《元データ》
 A列  B列  C列  D列
1    月 
2
3 月日 曜日  本日の容量  残容量  合計
4 1月1日 月   150      20   170
5 1月2日 火   150      20   170
6 1月3日 水   200      20   220
7
:
368 12月31日........

《入力結果》
 A列  B列  C列  D列
1 3   月 ←このつきの前に「表示月」を入力 例えば「3」
2
3 月日 曜日  本日の容量  残容量  合計
4 3月1日 木         
5 3月2日 金   
6 3月3日 土   

34 3月31日土

が表示される。
 

A 回答 (8件)

月日は日付形式ですよね。



C1="月日"
C2=">="&$A$1&"月1日"
D1="月日"
D2="<"&($A$1+1)&"月1日"
で次の処理を「ツール」「マクロ」「新しいマクロの記録」でマクロ化する。
「データ」「フィルタ」「フィルタオプションの設定」
・「データ範囲」「=$A$3:$E$369」
・「抽出条件範囲」「=$C$1:$D$2」
でOK
これで出来たマクロを、ショートカットキーかボタンに登録して実行する。

C1:D2の見た目が問題なら文字色を背景色と同じにすれば表示も印刷もされません。
    • good
    • 0

マクロを使ってもよいですか?(マクロの中で結局オートフィルタを使ってますが)



シートタブを右クリックして「コードの表示」を選択してVBAの画面を開き、下のマクロをコピーして貼り付けてください。
A1に値を入れるとその月だけの表示に変わります。

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address <> "$A$1" Then Exit Sub
 If Target.Value < 1 Or Target.Value > 12 Then Exit Sub
 Dim EndDay As Long
 EndDay = Day(DateSerial(Year(Date), Range("A1") + 1, 1) - 1)
 Range("A3").AutoFilter Field:=1, Criteria1:=">=" & Range("A1").Value & "月1日", Operator:=xlAnd, _
  Criteria2:="<=" & Range("A1").Value & "月" & EndDay & "日"
End Sub
    • good
    • 0
この回答へのお礼

マクロも関数もまったくわからない低レベルに親切な回答ありがとうございます。
質問です。
理想どおり、3月のみの表示になりましたが、
タイトル行に当たる「月日,曜日,本日の容量,残容量,合計」が
消えてしまいます。
やはり「オートフィルター」のマークがB1にも入ってしまうものなのですよね?

お礼日時:2007/02/16 14:42

関数でやってみます


「入力結果」シートのA4セルに以下の式を貼り付けて右方向、および下にコピー。A1セルの月は「数値」で入力します(日付ではありません)
各列の書式は適切なものに再設定してください。

=IF(SUMPRODUCT((MONTH(元データ!$A$4:$A$369)=$A$1)*1)-ROW()+4>0,INDEX(元データ!A$1:A$369,LARGE(INDEX((MONTH(元データ!$A$4:$A$369)=$A$1)*ROW(元データ!$A$4:$A$369),),SUMPRODUCT((MONTH(元データ!$A$4:$A$369)=$A$1)*1)-ROW()+4)),"")

うるう年なら5箇所の$A$369は$A$370になります。
    • good
    • 0
この回答へのお礼

マクロも関数もまったくわからない低レベルに親切な回答ありがとうございます。
結果だけを参照するのであれば問題ないのですが、
データを日々入力し、月末に出力をしなくてはなりません。
出来れば、入力後の確認なども行いますので、
月を打ち込んだだけで、1か月分が確認できるほうが
ど素人には単純な操作で出来るほうが良いかと思っています。

お礼日時:2007/02/16 14:14

簡単な方法としては・・・


シートを2枚に分ける。
Sheet1には1年分のデータ。

Sheet2は1ヶ月分(31行)のみ表示させる。
A4のセルに“=DATE(YEAR(TODAY()),A1,1)”、
A5以下はA4+1,A5+1でOKです。
B列以降は、LOOKUPなりVLOOKUPなりで、Sheet1を参照する、
というのでどうでしょう。
    • good
    • 0
この回答へのお礼

すみません。Excelの入力は得意なのですが、
マクロや関数がまったくわかりません。
皆さんのアドバイスを1ずつやっていますが、
フィルター後「本日の容量」「残容量」「合計」の入力をします。
別のSheetにすると、元データに反映されません。

お礼日時:2007/02/16 13:59

ご質問者の意図とは若干違うかもしれませんが、フィルタオプションとVBAの組み合わせで比較的簡単に作れるかもしれません。



ただし「月」を条件にしたければ、月日から月を作成する関数(MONTH関数など)で月のみを表示する列を作成しておく必要があります。
そのような列を作れば、ブックのイベントプロシージャ(SheetChage)等に、フィルタオプションの機能をVBAスクリプトとして記述することで可能だと思います。

参考までに(表のサイズなどはそちらで任意に読み替えてください)

Public Sub Data_filter()

Range("A5:S55").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= Range("C1:C2"), Unique:=False

End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  If ActiveCell.Column = 3 Then
     If Cells(2, 3).Value = "" Or IsNull(Cells(2, 3)) Then
        ActiveSheet.ShowAllData
     Else
        Call Data_filter
     End If

  End If

End Sub
    • good
    • 0

こんにちわ


月頭を出したいだけでしたら、ジャンプ機能を利用されるといいと思います。

マクロはご無理とのことなので計算式でやろうかとも考えましたが、それだとファイルサイズが大きくなるので、ご質問には反しますがオートフィルタが手っ取り早いと思います。各日付のとなりに1から12の数字を打ち(月の数という意味)、その列でフィルタをかけます。
計算式を入れるか数値を入れるかの違いだと思います。
    • good
    • 0

No.2です。



> タイトル行に当たる「月日,曜日,本日の容量,残容量,合計」が
> 消えてしまいます。

あれおかしいですね。タイトル行は質問文にあるとおり3行目から始まってますか?

> やはり「オートフィルター」のマークがB1にも入ってしまうものなのですよね?

これは仕方がないです。A列だけなら▼マークを非表示にできるのですが、他の列はどうしてもマークが出てしまいます。

それが出るのが嫌なのでオートフィルタを使いたくないのであれば、アプローチを変えて、オートフィルタを使わずに、指定した月以外は非表示にするマクロにしてみました。No.2の回答の手順でマクロの画面を開き、元のマクロは消して以下をコピーして貼り付けてみてください。

No.2の回答と同様に、A1に月の数字を入力すると、その月だけの表示になります。A1を空白にするか、0などの数値を入力すると1年分の表示に戻ります。

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address <> "$A$1" Then Exit Sub
 Application.ScreenUpdating = False
 Dim i As Integer
 Const MaxRow As Integer = 370
 For i = 4 To MaxRow
  If Target.Value < 1 Or Target.Value > 12 Then
   Rows(i).Hidden = False
  ElseIf Month(Cells(i, 1).Value) = Cells(1, 1).Value Then
   Rows(i).Hidden = False
  Else
   Rows(i).Hidden = True
  End If
 Next
 Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

おかげさまで、For i = 4 To MaxRowをFor i = 3 To MaxRowに書き換えたら出来るようになりました。
マークはやっぱり出ちゃいますかねぇ~
運用で工夫してみたいと思います。
ありがとうございました。

お礼日時:2007/02/16 16:00

>エクセルのオートフィルタを使わないフィルタ方法を伝授してください


なぜオートフィルタを避けているのか、理由はわかりませんが奇異です。
これを使わなければ、エクセルVBAででも使わないとできませんよ。
色々注文をつけると、VBAやそれ以上のことを使わないとできなくなります。
素人がやりたいことを出すと、結構難しい。経験者はその難しさにぶつかることを察知して、1年分を1シートにして、そこから1月分を
抜き出そうというような発想を避けます。
既回答にも、関数式だけで条件該当分を別シートなどに抜き出す式が出ています。しかし恐ろしく長く、内容を理解するのが難しいです。
私はそれを回避するため、作業列を1列使い、条件を満たす(XX月分
という条件)行のみ上から連番を振ります。別シートでその連番を元にINDEXとMATCH関数を使ってデータを持ってきます。それをimogasi
方式として、OKWAVEで沢山回答してます。WEB照会してよければ見てみてください。
ーー
VBAでxx月以外は行を非表示にすることはたやすいが、可視セルを相手にする必要があって、面倒になるかも知れません。
VBAで別シートへXX月分だけ分離するのは難しくありません。その後の
追加削除に連動できませんが。
    • good
    • 0
この回答へのお礼

そんなに難しいこととは判らず大変失礼をいたしました。
ただこの用紙を利用なのみなさんはExcelすら出来ないため、
年齢も50歳後半のため出来るだけ、開けばすぐできる形を作りたかっただけです。
そういう内容の質問をしてはいけないことも十分判りました。
貴重な時間感謝いたします。

お礼日時:2007/02/17 20:39

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