- ベストアンサー
Excelである曜日のみを表示させたい
仕事でExcelを使用しています。 部下の各担当者に配布する発注書を毎月更新作成しているのですが、ほかにも多数の書類を月末時に作成しており「毎火・木曜日の日付」を手入力するのが結構手間です…。 できれば自動で表示させられたらなんて思ったのですが、例えば商品名などをA列に入力するとして、その右のB列から、毎火・木曜日のみを表示させる、何か良い手はありますでしょうか? また、翌月1日が火曜日の場合など、翌月にかかってしまうのも困るので、これは非表示にしたいのですが…。 もしできるなら本当に助かりますのでご存知の方、お教え下さい。よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは~ ●質問に不明な点があります。 > その右のB列から、毎火・木曜日のみを表示させる ・「その右のB列から」 というのは、B・C・D・・と右方向に表示ですか? それとも、B列1列にたて方向に表示ですか? ・火、木を 1行(または1列)に表示ですか? それとも、火と木はそれぞれ別の行(または列)に表示ですか? ・1行(または1列)に表示だとして、必ず 火→木→火→木・・・の順ですか? 第1木曜日が、第1火曜日より早い日付であっても、火→木→火・・・の順ですか? 一応、例として・・ 【仮定】 ・B列から右方向に(C・D・E・・・)に、当月の火・木の日付を表示 ・火→木→火・・・の順 ・ただし、第1木曜が、第1火曜より早い日付の場合は、木→火→木・・・の順 当月の第1火曜と第1木曜の日付をどこかのセルに常時表示させておきます。 たとえば、第1火曜→B1、第1木曜→C1 だとして、 B1に =DATE(YEAR(TODAY()),MONTH(TODAY()),1*7-WEEKDAY(DATE(YEAR(TODAY()),MONTH(TODAY()),-1),3)) C1に =DATE(YEAR(TODAY()),MONTH(TODAY()),1*7-WEEKDAY(DATE(YEAR(TODAY()),MONTH(TODAY()),-3),3)) A3に商品名を入力すると、B3から右に日付を表示(火→木→火、または木→火→木) B3に =IF(A3="","",IF($B$1<$C$1,$B$1,$C$1)) C3に =IF(A3="","",IF($B$1>$C$1,$B$1,$C$1)) D3に =IF(COUNT(B3),IF(MONTH(B3+7)=MONTH($B$1),B3+7,""),"") と入れて、K3セルまで右にフィルコピー 日付の表示形式はお好みのものに。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
2005年8月1日をB1に入れる。 B2に=B1+5-WEEKDAY(B1)で2005/8/4が初木曜日 どこでもよいが C16、D16、E16、・・・に 0 1 7 8 14 15 21 22 28 29 と入れる。 C2に=IF($C$1+C16>=DATE(YEAR($B$1),MONTH($B$1)+1,1),"",$C$1+C16) と入れて、K2、L2まで式複写。 C2,d2,E2、・・・・は 2005/8/4 2005/8/5 2005/8/11 2005/8/12 2005/8/18 2005/8/19 2005/8/25 2005/8/26 となる。しかしこの質問の不完全さは、 >毎火・木曜日の日付」を手入力す・・のセル番地が書いてないので、 なんとも完全な答えが書けないのです。具体的にセル番地と曜日を あげてください。 VBAを望んでいないのだろうから、関数を使う答えを期待しているのであろうが、関数を使うということは (1)結果の値が1箇所(1セルで)正し値を返すことはもちろんだが (2)うまく複写して複数セルに複写できることが必要。 連続していないセル(上記も木曜と金曜のように異質なものが並び、土ー水はいらないなどイレギュラー)では技巧を凝らさざるを得ない。 凝らしてもできないかもしれない。必ず方法があるとは限らない。
お礼
なるほど、まだまだVBAは勉強を始めたばかりですが、すべてを関数で何とかしようとするばかりでもいけない場合があるのですね。おっしゃるとおり、テンぱるあまり、とても不親切な不完全な質問になってしまっていました。今後は気をつけたいと思います。参考になるアドバイスありがとうございました。
- WWolf
- ベストアンサー率26% (51/192)
ベタかもしれませんが・・・ 下記のロジックをシート1のコードにCopy&Pasteし シート1のA1に年、B1に月を入れたら・・・ 参考に Private Sub Worksheet_Change(ByVal Target As Range) Dim TsukiFlag, MonthFlag Dim myYear, myMonth Dim myDate As Date Dim myWeekDay As Integer TsukiFlag = 0: MonthFlag = 0 myYear = Worksheets(1).Range("A1").Value myMonth = Worksheets(1).Range("B1").Value If Target.Row = 1 And Target.Column = 1 Or Target.Column = 2 Then If myYear <> "" Then If Target.Value <> "" Then TsukiFlag = 1 End If End If If myMonth <> "" Then If Target.Value <> "" Then MonthFlag = 1 End If End If If TsukiFlag = 1 And MonthFlag = 1 Then Worksheets(1).Columns(3).Clear Worksheets(1).Columns(4).Clear j = 1 myDay = myYear & "/" & myMonth & "/1" For i = 1 To Day(DateAdd("d", -1, DateAdd("m", 1, myDay))) myDate = DateSerial(myYear, myMonth, i) myWeekDay = WeekDay(myDate) If myWeekDay = 3 Or myWeekDay = 5 Then Worksheets(1).Cells(j, 3).Value = i Worksheets(1).Cells(j, 4).Value = WeekdayName(WeekDay(myDate)) j = j + 1 End If Next End If Else Exit Sub End If End Sub
お礼
お~、これでできてしまうんですね!!マクロはなかなか理解できずわからないままだったのですが、これを機に試してみて、今後は色々覚えてみたいと思いいました。なにせ必要に迫られているのできっと頑張れそうです。苦笑 どうもありがとうございました。
補足
すみませんー…ありがとうございます。そうですよね、いろんなパターンがあるのですから、「右」になのか「下に」なのかわからなきゃしょうがないですよね…。不勉強でした。右列に日付を、縦に商品リストを載せたいのでshiotann99の【仮定】通りでした。 ※DATEとかYEARに()でいろいろ入れ子にできるなんて知りませんでした。関数辞典にも載っていなかったのに…。早速やってみます。どうもありがとうございました。