• ベストアンサー

前日の差を求める。

セル 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日目が初日データーとなります。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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       以下同じ のような感じにすればいいのでは? (あまりスマートではないですが・・・)

kkazumi
質問者

お礼

どうもありがとうございました。うまくいきました。また、よろしくお願い致します。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#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

kkazumi
質問者

お礼

どうもありがとうございました。また、よろしくお願い致します。

回答No.2

データを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 参考になりますでしょうか?

kkazumi
質問者

補足

どうもありがとうございます。Sub test2() ですが、Sub test() 見たいに、初日のデーターは、入っていても前日のデーターがない為 E列 を無表示にするにはどうすればいいか。また、Sub test() のI列 の16行目で計算をとめるのにはどうすればいいか。無理いってすみませんがよろしくお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

・質問文雑感 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列のデータの有無に頼らないならば、土日の曜日は簡単に判別できるが、祝日や年末年始・お盆の休日を判定するのが面倒です。

kkazumi
質問者

補足

どうもありがとうございます。無理いってすみませんが、初日のデーターは、前日のデーターがない為比較出来ない為 E列 は無表示にするには、どうすればいいのかよろしくお願いします。

関連するQ&A