Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2880 / 13646 ツリー ←次へ | 前へ→

【65457】時刻・分数の矛盾チェック パトラッシュ 10/5/23(日) 22:42 質問[未読]
【65465】Re:時刻・分数の矛盾チェック 超初心者 10/5/24(月) 14:28 発言[未読]
【65488】Re:時刻・分数の矛盾チェック パトラッシュ 10/5/26(水) 2:07 質問[未読]

【65457】時刻・分数の矛盾チェック
質問  パトラッシュ  - 10/5/23(日) 22:42 -

引用なし
パスワード
   下のようなフォーマットで時刻と分数が並んでいます。

 A列     B列     C列
(曜日)   (時刻)   (分数)

 月      0400      015
 月      0415      030
 ・      ・       ・
 ・      ・       ・
 月      2750      010
 火      0400      020
 ・      ・       ・
 ・      ・       ・
 日      2755      005

*B列の時刻は24時間表示で各曜日0400〜2759まで。
 :(コロン)は入れていない。
*各曜日の一番頭の開始時刻は必ず0400。
 各曜日の最後の時刻+分数は必ず2800となって終わる。
*時刻・分数は一定ではない。(毎回異なる。)
*行数も各曜日とも一定ではない。(毎曜日異なる。)

<やりたいこと>
時刻と分数が次の行の時刻と矛盾がないかどうか
(分数が足らない,時間が重複するなど)を自動的にチェックし
矛盾のあるセルに色をつけると同時に矛盾がある旨のメッセージBOX
を表示させたい。

これをマクロで自動的に行いたいのですが
どのようなプログラムを記述すればできますでしょうか?
(使用しているエクセルのバージョンは2003です。)

【65465】Re:時刻・分数の矛盾チェック
発言  超初心者  - 10/5/24(月) 14:28 -

引用なし
パスワード
   ▼パトラッシュ さん:

案)をひとつ。

自作関数をひとつ作ります。
Function fxTimeAdd(myNow As Integer, myAdd As Integer) As Integer
  Dim myTime As Integer
  
  myTime = (Int(myNow / 100) * 60 + (myNow Mod 100)) + myAdd
  
  fxTimeAdd = Format(myTime / 1440, "hhmm")
  If myTime > 1440 Then fxTimeAdd = fxTimeAdd + 2400
End Function
時間(分)を足してhhmm形式の数値で返します。
(翌日(47:59)までのみ対応)

B3以下に
=IF(fxTimeAdd(B2,C2)>=2800,400,fxTimeAdd(B2,C2))
また、必要であればB列の書式は"0000"にしておく。

C2以下に、条件付書式にて
[数式が][=fxTimeAdd($B2,$C2)>2800]
にて
書式を設定しておく。

A3以下に
=MID("月火水木金土日月",FIND(A2,"月火水木金土日")+IF(B3<B2,1,0),1)


A・B列は計算ゆえ、入力不要(A2,B2のみ入力)。
よって、
> (分数が足らない,時間が重複する
は発生しない。

C列のみ入力。
条件付書式で2800を超えるものについてチェック。


注意点として、C列の分数が1日(1440分)を
超えたものについては、正常作動しません。
また、
> 矛盾がある旨のメッセージBOX
は出ません m(_~_)m


ご希望のものとは違うかもしれませんが、参考までに。。。

【65488】Re:時刻・分数の矛盾チェック
質問  パトラッシュ  - 10/5/26(水) 2:07 -

引用なし
パスワード
   ▼超初心者 さん:

ありがとうございます。

あらかじめ関数を設定しておいて入力すれば,
>A・B列は計算ゆえ、入力不要(A2,B2のみ入力)。
>よって、
>> (分数が足らない,時間が重複する
は発生しない。

は、ひとつのヒントになったような気がします。


ただ、すでに入力してあるものに対してチェックを行いたいというのが私が
今回求めるところです。

みなさまには引き続き案をご提供いただけましたらと思います。

1.例えば、B3のセルが2155、B2のセルが2100、C2のセルが055
  だったとすれば、B3のセルは2155でOKとしてセルには何も色付けしない。
  仮にここでB3のセルが2155でなければNGとしてセルを赤く塗りつぶす
  といったことができないでしょうか?

例えば、下のような感じで。
(ただし、これでは※の部分で処理が止まってしまいますし、単純な足し算の
ため時間計算が合わなくなります。)

Sub test()

Dim LastRow As Long
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row, _
         .Offset(, 2).End(xlUp).Row _
         )
  End With


For i = 2 To LastRow '最終行を取得

If Range("B" & i) <> Range("B" & i - 1) + Range("C" & i - 1) Then ※
  Range("B" & i).Select
  With Selection.Interior
     .ColorIndex = 3
  End With

Else
  Range("B" & i).Select
  With Selection.Interior
     .ColorIndex = xlNone
End With
End If
Next i
End Sub


2.さらに,例えばA列が月曜のときのC列の分数の合計が1440分でなければ
  特定のセルに色を塗るまたはメッセージを出すといったことをしたいです。
  (各曜日の合計分数は必ず1440分になるという仕様です。)
  例えば,下のような感じで(いけるのかどうかわかりませんが)。
  ※C列の分数の合計を求める部分がわかりません。

  If Range("A" & i) = "月" And ※C列の分数の合計 <> 1440 Then
  Range("B" & i).Select
  With Selection.Interior
     .ColorIndex = 3
  End With

End If
Next i
End Sub

2880 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free