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

仕事でExcelを使用しています。
 部下の各担当者に配布する発注書を毎月更新作成しているのですが、ほかにも多数の書類を月末時に作成しており「毎火・木曜日の日付」を手入力するのが結構手間です…。
 できれば自動で表示させられたらなんて思ったのですが、例えば商品名などをA列に入力するとして、その右のB列から、毎火・木曜日のみを表示させる、何か良い手はありますでしょうか?
また、翌月1日が火曜日の場合など、翌月にかかってしまうのも困るので、これは非表示にしたいのですが…。
もしできるなら本当に助かりますのでご存知の方、お教え下さい。よろしくお願いいたします。

A 回答 (3件)

ベタかもしれませんが・・・


下記のロジックをシート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
    • good
    • 0
この回答へのお礼

お~、これでできてしまうんですね!!マクロはなかなか理解できずわからないままだったのですが、これを機に試してみて、今後は色々覚えてみたいと思いいました。なにせ必要に迫られているのできっと頑張れそうです。苦笑
どうもありがとうございました。

お礼日時:2005/08/08 01:01

2005年8月1日をB1に入れる。


B2に=B1+5-WEEKDAY(B1)で2005/8/4が初木曜日
どこでもよいが
C16、D16、E16、・・・に
0178141521222829
と入れる。
C2に=IF($C$1+C16>=DATE(YEAR($B$1),MONTH($B$1)+1,1),"",$C$1+C16)
と入れて、K2、L2まで式複写。
C2,d2,E2、・・・・は
2005/8/42005/8/52005/8/112005/8/122005/8/182005/8/192005/8/252005/8/26
となる。しかしこの質問の不完全さは、
>毎火・木曜日の日付」を手入力す・・のセル番地が書いてないので、
なんとも完全な答えが書けないのです。具体的にセル番地と曜日を
あげてください。
VBAを望んでいないのだろうから、関数を使う答えを期待しているのであろうが、関数を使うということは
(1)結果の値が1箇所(1セルで)正し値を返すことはもちろんだが
(2)うまく複写して複数セルに複写できることが必要。
連続していないセル(上記も木曜と金曜のように異質なものが並び、土ー水はいらないなどイレギュラー)では技巧を凝らさざるを得ない。
凝らしてもできないかもしれない。必ず方法があるとは限らない。
    • good
    • 0
この回答へのお礼

なるほど、まだまだVBAは勉強を始めたばかりですが、すべてを関数で何とかしようとするばかりでもいけない場合があるのですね。おっしゃるとおり、テンぱるあまり、とても不親切な不完全な質問になってしまっていました。今後は気をつけたいと思います。参考になるアドバイスありがとうございました。

お礼日時:2005/08/08 00:56

こんにちは~



●質問に不明な点があります。
> その右の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セルまで右にフィルコピー

日付の表示形式はお好みのものに。

この回答への補足

すみませんー…ありがとうございます。そうですよね、いろんなパターンがあるのですから、「右」になのか「下に」なのかわからなきゃしょうがないですよね…。不勉強でした。右列に日付を、縦に商品リストを載せたいのでshiotann99の【仮定】通りでした。

※DATEとかYEARに()でいろいろ入れ子にできるなんて知りませんでした。関数辞典にも載っていなかったのに…。早速やってみます。どうもありがとうございました。

補足日時:2005/08/08 00:48
    • good
    • 0

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