[[20061231105723]] 『土日祝日を除く日付』(正) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『土日祝日を除く日付』(正)

いつもお世話になります。
教えてください。

下記のようにA列に日付B列に曜日が入っています。

C列に土日祝日を抜いた日付、D列に曜日を返したい。

C2以下、D2以下に入れる計算式をご教授願えませんか。

宜しくお願いします。

Win XP , Ex 2003

 A     B    C     D

 日付   曜日   日付    曜日

2007/1/1  祝(月) 2007/1/2   火

2007/1/2  火   2007/1/3   水

2007/1/3  水   2007/1/4   木

2007/1/4  木   2007/1/5   金

2007/1/5  金   2007/1/9   火

2007/1/6  土   2007/1/10   水

2007/1/7  日

2007/1/8  祝(月)

2007/1/9  火

2007/1/10  水

               (正)


 計算式でなくてすみません。
 VBA でしたら下記のような感じでできます。

 シートのタブを右クリックし、「コードの表示」を選択
 右側の大きなウィンドウへ下記をコピーします。
 「ツール」⇒「マクロ」⇒「マクロ」から getWeekDay を選んで実行すると、
 処理がされます。

 Sub getWeekDay()
    Dim regExp As Object
    Set regExp = CreateObject("VBScript.RegExp")
    regExp.Pattern = "[日土祝]"

    Dim lastLine As Long
    lastLine = Range("A65535").End(xlUp).Row

    Dim wdLine As Long
    wdLine = 2
    For i = 2 To lastLine
        If Not regExp.test(Cells(i, "B").Value) = True Then
            Cells(wdLine, "C").Value = Cells(i, "A").Value
            Cells(wdLine, "D").Value = Cells(i, "B").Value
            wdLine = wdLine + 1
        End If
    Next
 End Sub

 式である必要がありましたら、読み飛ばしてください。
 (Mook)

 年内最後の書込みになるでしょうか。
 
 フィルタオプションの方法を考えてみました。
 
 A列に日付、B列に曜日、C列を作業列として使用しD・E列に抽出するものです。
	[A]	[B]	[C]
[1]	日付	曜日	
[2]	2007/1/1	祝(月)	FALSE ← =SUM(COUNTIF(B2,{"祝","土","日"}&"*"))=0
[3]	2007/1/2	火	
[4]	2007/1/3	水	
[5]	2007/1/4	木	
[6]	2007/1/5	金	
[7]	2007/1/6	土	
[8]	2007/1/7	日	
[9]	2007/1/8	祝(月)	
[10]	2007/1/9	火	
[11]	2007/1/10	水	
 
1)C列を作業列とし、
  C2 =SUM(COUNTIF(B2,{"祝","土","日"}&"*"))=0
2)データ → フィルタ → フィルタオプションの設定
  ○指定した範囲 にチェックを入れ
  リスト範囲  : $A$1:$C$11
  検索条件範囲 : $C$1:$C$2
  抽出範囲   : $D$1
  として、OK。
 
 (キリキ)(〃⌒o⌒)b 

 (Mook) さん、(キリキ)さん

新年おめでとうございます。
年末の忙しい時にご教授くださり有難うございました。

                  (正)

(Mook) さんへ

VBAも勉強したく早速コピーして実行しましたところ、

コンパイルエラー 変数が定義されていませんと出ます。

VBAは慣れてないので使い方が間違っているのかな?

                      (正)

(キリキ)さんへ

希望通りの答えが得られました。有難うございます。
早速利用させていただきました。

C2の{ }で囲った式もフィルターオプションも初めて使いました。

厚かましいお願いですが、C2の式の解説をして頂けませんでしょうか。

宜しくお願いします。

                 (正)


 >C2の式の解説をして頂けませんでしょうか。
 はいはい。
 
 C2 に入力されている関数は、
 =SUM(COUNTIF(B2,{"祝","土","日"}&"*"))=0
 と入力されていますね?
 
 ココで出てくる関数の「SUM」と「COUNTIF」の関数の意味は、おわかりでしょうか?
 
 まず、一つずつ分解してみましょうb
 =SUM(COUNTIF(B2,{"祝","土","日"}&"*"))=0
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 これは、CONTIF関数を一気に、3つの条件で考えています。
 一つずつにすると、、、
 
 =COUNTIF(B2,"祝*")
 =COUNTIF(B2,"土*")
 =COUNTIF(B2,"日*")
 の3つになります。
 
 上から「1」「0」「0」になりますね?
 ※ココでの「*」は、ワイルドカードになります。
  ヘルプで確認してみてください。
 
 上記ででたものを、SUM関数で足しています。
 こんな感じで、、、
 =SUM(1,0,0)
 結果は、「1」ですね?
 
 その結果を「=0」で、ゼロと等しいかどうかを見ています。
 その結果は、「FALSE」となります。
 
 上記を、フィルタオプションの検索条件に使用しています。
 C2 の、数式を C11 までコピペしてください。
 「TRUE」になるものがありますね?
 その「TRUE」になっているものを抽出することになります。
 
 >コンパイルエラー 変数が定義されていませんと出ます。
 こちらは、コードの上に
 「Option Explicit」が入っていませんか?
 入っていれば、消してみるか
 変数を、下記の様に追加してください。
 Dim i As Long
 
 (キリキ)(〃⌒o⌒)b

 キリキさん、フォローありがとうございました。
 確かにi の宣言が抜けてました(^^;;。

 今回のケースは、簡単に数式で処理できるんですね。
 勉強になりました。
 (Mook)

キリキさん

ご丁寧な解説有難うございました。
大変よく解り勉強になりました。

>「Option Explicit」が入っていませんか?

入っていました。
外せば正常に動きました。

また、Option Explicit が入っている状態で、

Dim wdLine As Long の次に
Dim i As Long を追加しましても正常に動きました。

VBAは不慣れなもので、すみませんがもう一度教えてください。

シートのタブを右クリックし、「コードの表示」を選択すれば、
Option Explicit が既に入っている状態でした。

@ Option Explicit と Dim i As Long の関係はどういうことなんでしょうか?

A Dim i As Long を追加した行の位置はこれで正しいでしょうか?

よろしくお願いします。

               (正)


 1番に関しての
 「Option Explicit」は、そのまま Option Explicit ステートメント のヘルプを
 「Dim i As Long」は、Dim ステートメント のヘルプを
 各々、参照して見てください。
 
 また、
 >Option Explicit が既に入っている状態でした。
 こちらは、Micriosoft Visual Basic の画面の、
 ツール → オプション の【編集】タブの
 □変数の宣言を強制する をチェックすることで、自動的に(新規で立ち上げたときに)付けることが出来ます。
 変数の宣言をすることで、余計なメモリを使うことなくプログラミングをすることができるのだと思います。
 
 2は、通常(勝手にσ(^o^;)がそう思っています。)は、一番上にまとめて宣言するようです。
 
 Sub TEST()
   Dim i As Long
   Dim x As Variant
   Dim n As Integer, c As Integer

  処理
 

 End Sub
 
 のような感じでしょうか。
 
 まぁ何処の位置に宣言しても、上から下へコードは処理されていきますので、その変数を使用する前(上)でしたら問題ないのかもしれませんね^^
 
 (キリキ)(〃⌒o⌒)b 
   


(キリキ)さん

再々ご教授有難うございました。

今後とも宜しくご指導のほどお願いします。

               (正)


はじめまして、takeと申します。
今回、[[20061231105723]]

 Sub getWeekDay()
    Dim regExp As Object
    Set regExp = CreateObject("VBScript.RegExp")
    regExp.Pattern = "[日土祝]"

    Dim lastLine As Long
    lastLine = Range("A65535").End(xlUp).Row

    Dim wdLine As Long
    wdLine = 2
    For i = 2 To lastLine
        If Not regExp.test(Cells(i, "B").Value) = True Then
            Cells(wdLine, "C").Value = Cells(i, "A").Value
            Cells(wdLine, "D").Value = Cells(i, "B").Value
            wdLine = wdLine + 1
        End If
    Next
 End Sub

を厚かましくコピペ使って作りました。

後、12月29日、30日、31日、1月2日、3日、8月13、14日、15日を
除く方法を教えて貰えませんか?
VBAは詳しくないので出来ればまたコピペ出来るようにお願い出来ませんか?
宜しくお願いします。
(take) 2015/01/17(土) 22:00


 別トピなので、新規にトピをたて、そこで、この元トピを参照する形にしたほうが
 いいと思うんだけど。Mookさんのコードも、xl2007が登場する前のもので、現時点では
 65536 というマジックナンバーを使わないほうがいいとか、あるいは、処理自体で、B列の
 値を参照せず、別途、休日リストを設定して対応したほうがいいんじゃないだろうかとか
 別処理案もでてくるかもしれない。

 とはいえ、もし、この形で対応するなら、12月29日や30日のB列を 休(月) や 休(火) という形にして
 regExp.Pattern = "[日土祝]"  を regExp.Pattern = "[日土祝休]" とすればいけるんじゃない?

(β) 2015/01/17(土) 22:37


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.