- ベストアンサー
前日の差を求める。
セル B2~B17に前半の日付を、セル F2~F16 に後半の日付を入れています。セル C2~C17 、G2~G16 にはそれに対応する曜日がはいっています。セル D2~D17 、H2~H16 には数字のデーターが入ります。 E列とI列 に前日との差をマクロで表示する方法を教えて下さい。ただし、D列(H列)の土日祭日セルにデーターは入れず、無表示です。また、D列 (H列) にデーターが入っている所のみ前日との差をE列(I列)に表示する。初日のみ前日のデーターがない為、E列(I列)は無表示とする。また、月曜日の前日は、金曜日。火曜日が祭日の時は、水曜日の前日は月曜日。また、つき始めが日曜日から始まる時は2日目初日のデーター、つき始めが土日から始まる時は、3日目が初日のデーターです。今年の5月でしたら6日目が初日データーとなります。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >test2()の方、プログラムを掲載する時に編集してしまい 1行間違えてました。訂正してください。 If (syoniti = False) Then '月の初営業日は前営業日のデータのみセット ↓ If (syoniti = True) Then '月の初営業日は前営業日のデータのみセット です。 >Sub test() のI列 の16行目で計算をとめるのにはどうすればいいか。 For i = 4 To 8 Step 4 '4=D列,8=H列 For j = 2 To 17 '2行目~17行目 if ( i = 8 and j = 17 ) then exit for end if 以下同じ のような感じにすればいいのでは? (あまりスマートではないですが・・・)
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。少し改良しました。 Sub test01() d1 = 2: d2 = 2 For i = 2 To 16 If i = d1 Then GoTo p01 If Cells(i, "D") = "" Then Else Cells(i, "E") = Cells(i, "D") - Cells(d1, "D") d1 = i End If '---- p01: If i = 2 Then Cells(i, "I") = Cells(i, "H") - Cells(16, "E") d2 = i Else If Cells(i, "H") = "" Then Else Cells(i, "I") = Cells(i, "H") - Cells(d2, "H") d2 = i End If End If Next i End Sub
お礼
どうもありがとうございました。また、よろしくお願い致します。
- taisuke555
- ベストアンサー率55% (132/236)
データを2列にするとちょっと難しくなった気になりますね。 imogasiさんも仰っていますが、休日判定は少々面倒なので、 「休日は入力がない」事を前提にしています。 ・testは行がD列、H列ともに17行目まで判断しても問題ない場合 test2はH列はどうしても16行目までにしたい場合 ・月初めの営業日の判定に[syoniti]という変数を利用していますが、 数字のデータが0でないとか、マイナスにならない場合は [zenjitu]変数を利用する事もできると思います。 ・前営業日データを[zenjitu]という変数に入れています。 数字が整数なのか小数もあるのか分かりませんでしたので Long型を使用しています。データに合わせて変更してください。 Sub test() Dim zenjitu As Long Dim syoniti As Boolean syoniti = True For i = 4 To 8 Step 4 '4=D列,8=H列 For j = 2 To 17 '2行目~17行目 If (Cells(j, i) <> "") Then 'データが入っている If (syoniti = True) Then '月の初営業日は前営業日のデータのみセット zenjitu = Cells(j, i) syoniti = False Else '1列右に前営業日との差を表示 Cells(j, i + 1) = Cells(j, i) - zenjitu '前営業日として今日のデータをセット zenjitu = Cells(j, i) End If End If Next j Next i End Sub Sub test2() Dim retu As Variant Dim gyou As Variant Dim zenjitu As Long Dim syoniti As Boolean retu = Array("D", "H") gyou = Array(17, 16) syoniti = True For i = 0 To 1 '0=D列,1=H列 For j = 2 To gyou(i) '2行目~16or17行目 If (Cells(j, retu(i)) <> "") Then 'データが入っている If (syoniti = False) Then '月の初営業日は前営業日のデータのみセット zenjitu = Cells(j, retu(i)) syoniti = False Else '1列右に前営業日との差を表示 Cells(j, retu(i)).Offset(, 1) = Cells(j, retu(i)) - zenjitu '前営業日として今日のデータをセット zenjitu = Cells(j, retu(i)) End If End If Next j Next i End Sub 参考になりますでしょうか?
補足
どうもありがとうございます。Sub test2() ですが、Sub test() 見たいに、初日のデーターは、入っていても前日のデーターがない為 E列 を無表示にするにはどうすればいいか。また、Sub test() のI列 の16行目で計算をとめるのにはどうすればいいか。無理いってすみませんがよろしくお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
・質問文雑感 F列より右は、繰り返しなので、書なくても良い。 問題を読む人に時間をかけ、回答者を逃がすだけ。 D列計数の「前日比」を出したい。休業日はデータがなく 遡って直近営業日と比較する、で意味が判る。 ●計数数字データの「有り無しに信を置けるなら」 Sub test01() d1 = 2: d2 = 2 For i = 2 To 16 If Cells(i, "D") = "" Then Else Cells(i, "E") = Cells(i, "D") - Cells(d1, "D") d1 = i End If Next i End Sub 変数d1,d2には計数数字データの入った(今までの)最後の行(番号数)を覚えていて、後の行の利用に備えています。 F列より右は、 If Cells(i, "H") = "" Then Else Cells(i, "I") = Cells(i, "H") - Cells(d2, "H") d2= i End If をFor Nextの後半に挟めば良い。 ●D列、H列のデータの有無に頼らないならば、土日の曜日は簡単に判別できるが、祝日や年末年始・お盆の休日を判定するのが面倒です。
補足
どうもありがとうございます。無理いってすみませんが、初日のデーターは、前日のデーターがない為比較出来ない為 E列 は無表示にするには、どうすればいいのかよろしくお願いします。
お礼
どうもありがとうございました。うまくいきました。また、よろしくお願い致します。