知識、知恵のカタマリ

[PR]コレがGoogleの検索ストーリー

解決済

clip!clip!
Ads By Google

VBAで稼働日を求めたいのですがうまく出来ずに困っています。



A列:日付2008/1/1~2009/3/31まで入っています。

B列:『休』とお休みに該当した日をいれます。(土日とは限らない)
例として1月1日(A1セル)が休みとしたらB1セルに『休』と入れお休み表にします。

C列:適当な日を手入力します。(規則性は全く無し)

D列:C列の3稼働日後を入れたいです。

AやB列からどうスキャンし3稼働日後を出したらよいのか…

説明だと分かりづらいかもしれませんのでこんな感じの結果を得たいエクセルがあるので見ていただいた方が分かるかとも思います。
どなたかヒントでもあれば教えて下さい。
お願いします。


2008-06-12 22:23の質問
Excel  VBA  稼働日  
Excel
「Microsoft Office Excel」のホームページです
office.microsoft.com/ja-jp/excel/
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。

回答(3)

3.

2008-06-14 10:17:05ベスト
Option Explicit

Sub Macro1()
   Dim r As Long, FoundRow As Long
   Dim d As Variant
   
   For r = 2 To Cells(65536, 3).End(xlUp).Row
       d = Cells(r, 3).Value
       If IsDate(d) Then '日付だったら
           FoundRow = F_SearchRow(Cells(r, 3).Value)
           If FoundRow > 0 Then
               Cells(r, 4).Value = F_Search3Kadoubigo(FoundRow)
           End If
       End If
   Next
   
End Sub

Function F_SearchRow(d As Date) As Long
   Dim r As Long
   
   For r = 2 To Cells(65536, 1).End(xlUp).Row
       If d = Cells(r, 1).Value Then
           F_SearchRow = r
           Exit Function
       End If
   Next
   r = 0 '該当日付がなかったら0
End Function

Function F_Search3Kadoubigo(wRow As Long) As Variant
   Dim r As Long, ct As Integer
   
   ct = 0
   For r = wRow To Cells(65536, 1).End(xlUp).Row
       If Cells(r, 2).Value <> "休" Then
           ct = ct + 1
           If ct = 3 Then '3稼働日後を探せたら抜ける
               F_Search3Kadoubigo = Cells(r, 1).Value
               Exit Function
           End If
       End If
   Next
   F_Search3Kadoubigo = "3日後不明"
End Function

rem 2/11の3稼働日後は、2/18じゃなくて2/15ですよね???

ありがとうございます。ちょっと仕様が変わってしまったので追加書き込みしてあります。

1.

2008-06-13 02:20:50
土日は、稼働日に入らない様ですが、祝日は別にデータを持つのでしょうか?

何にしても、
今調べようとしている稼働日が
「休」マークが付けられているか、
マークは無いが、土日祝日であるなら、スキップしつつ、3日分数えればいいと思います。
回答レベル : アドバイス

2.

2008-06-13 16:14:50
>AやB列からどうスキャンし3稼働日後を出したらよいのか…
半分だけですけど、理解できますか?

Sub test()

Dim i, j, sagasu

For i = 2 To 18
   Cells(i, 3).Select
   sagasu = Cells(i, 3).Value
   For j = 2 To 92
       If Cells(j, 1).Value = sagasu Then
           MsgBox j
       End If
   Next
Next
End Sub
Ads By Google

コメント(4)

2008-06-14 09:32:00

Dim i, j, sagasu じゃ
Variant宣言と一緒ですが…

2008-06-14 10:19:07

65536は、Excel2003までのExcelの最大行数ということで了承してください。

#3.  BLUEPIXY
2008-06-15 00:50:26

3>2/11の3稼働日後は、2/18じゃなくて2/15ですよね???
土日を除くという仕様だと解釈しましたが・

#4.  はち
2008-06-15 15:07:24

>>#1
失礼しました。下記の様に訂正します。
Dim i As Long, j As Long, sagasu As Variant

最近のPCでは、変数すべてVariant型でも殆んど問題ないので、個人的にはいつもこのように宣言してる癖が出てしまいました。

トラックバック(2)

トラックバックURL: