エクセル初心者です。
勤務時間が自動計算できる表を作ろうとしています。
A1に出勤時間、B1に退社時間を入れ、C1に勤務時間が自動で入る…といったものです。
http://oshiete.goo.ne.jp/qa/8754769.htmlを参考にして、
下記マクロを入れるところまではできました。
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
If .Value <> "" Then
If IsNumeric(.Value) Then
If .Value < 2400 And .Value Mod 100 < 60 Then
Application.EnableEvents = False
.Value = TimeSerial(Int(.Value / 100), .Value Mod 100, 0)
.NumberFormatLocal = "h:mm"
Application.EnableEvents = True
Else
MsgBox "入力値が不正です"
.Select
.ClearContents
End If
ここまではよかったのですが、同じシートで三名分の出退勤を管理するために
上記マクロをコピペしてRange(”A:B”)の数値だけ変えてみてもダメでした。
どのように変更すればいいのでしょうか。
わかりにくい質問ですがご教授ください。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんにちは。
>A1に出勤時間、B1に退社時間を入れ、C1に勤務時間が自動で入る
質問としては、A列/B列に入れたら、C列が自動的に出てくるのをマクロで行うという意味なのでしょうか?
それは、少しやっかいですね。それらにまつわる時間の休み時間とか、どうするのでしょうか?
日をまたぐ計算も出てくるのでしょうか?
昼の休憩は、1時間(12~13時)、夜休憩は、18~19:30分というところかな。
深夜もありますね。深夜は省略します。残業時間などの計算もまだ含まれていません。
マクロの専門の人なら、どうということもありませんが、マクロ処理は、なかなか難しくなってしまうからです。
たぶん、私のマクロは、もう4~5回、同じようなものを書いていますが、毎度同じ使われないとは思うのですが、こんなようになると感じていただければ幸いです。
>(A1,B1,C1)、(E1,F1,G1)、(I1,J1,K1)
>という風になり、参照先の列が変わってしまうのです
つまり、私の方法では、D列, H列には値は入れられません。
TimeDiff(Time1, Time2) ユーザー定義関数のところで、細かな計算をしていきます。
この項目の最後は、カーソルが右に動かすためのボタン用のマクロです。トグルになっていますから、もう一度実行すれば、カーソルは下に行くようになります。
'//シートモジュール
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myTime As Variant
With Target
If .Count > 1 Then Exit Sub
If .Value = "" Then Exit Sub
If Not IsNumeric(.Value) Then Exit Sub
If .Column Mod 4 = 0 Then .ClearContents: Exit Sub
Application.EnableEvents = False
If .Column Mod 4 > 0 Then
.ClearFormats
.NumberFormatLocal = "[h]:mm"
.Value = Num2Time(.Value2)
End If
If .Column Mod 4 = 2 Then
.Offset(, 1).ClearFormats
.Offset(, 1).NumberFormatLocal = "[h]:mm"
.Offset(, 1).Value = TimeDiff(.Offset(, -1).Value, .Value)
End If
Application.EnableEvents = True
End With
End Sub
Private Function Num2Time(ByVal myValue As Variant)
'数値時間変換
Dim myTime As Variant
Dim myH As Long
If Len(myValue) > 4 Then myTime = Left(myValue, 4)
myTime = Format$(myValue, "00:00")
myH = Mid(myTime, 1, 2)
If myH >= 24 Then
myTime = (myH \ 24) + (myH Mod 24) / 24 + Mid(myValue, 4, 2) / (24 * 60#)
Else
myTime = (myH Mod 24) / 24 + Mid(myTime, 4, 2) / (24 * 60#)
End If
Num2Time = myTime
End Function
Private Function TimeDiff(Time1, Time2)
'時間計算 Time1:出社時間 Time2:退社時間
Dim BeginT As Double: BeginT = TimeValue("8:30") '始業
Dim EndT As Double: EndT = TimeValue("17:30") '終業
Dim sDBreak As Double: sDBreak = TimeValue("12:00") '昼始め
Dim eDBreak As Double: eDBreak = TimeValue("13:00") '昼終わり
Dim diff1 As Double
Dim diff2 As Double
If Time1 < 1 Then
diff1 = sDBreak - Application.Min(Time1, sDBreak)
diff2 = EndT - Application.Min(Time2, eDBreak)
TimeDiff = diff1 + diff2
Else
'夜交代制用
End If
End Function
Sub ChangeDirect() 'これは、別途ボタンに付けるとよいでしょう。
'右にカーソルが進んだり、下に進んだりする設定マクロ・これはトグルになっています。
With Application
If .MoveAfterReturnDirection = xlToRight Then
.MoveAfterReturnDirection = xlDown
MsgBox "カーソルが下に進みます"
Else
.MoveAfterReturnDirection = xlToRight
MsgBox "カーソルが右に進みます"
End If
End With
End Sub
'///
No.3
- 回答日時:
No.1です。
>そのため(出社、退社、勤務時間)がそれぞれ
>(A1,B1,C1)、(E1,F1,G1)、(I1,J1,K1)
>という風になり
すでにNo.2さんが回答されていますので、余計なお世話かもしれませんが
If Intersect(Target, Range("A:B,E:F,I:J")) Is Nothing Or Target.Count > 1 Then Exit Sub
でも大丈夫だと思います。
※ 1か月分というコトですので、範囲をもっと限定し
Range("A1:B31,E1:F31,I1:J31")
とすれば同列の他のセルは通常の表示になります。
※ C・G・K列は前回のような数式で処理します。m(_ _)m
No.2
- 回答日時:
If Intersect(Target, Range("A:B")) Is Nothing Or Target.Count > 1 Then Exit Sub
の部分を
If Intersect(Target, Union(Range("A:B"), Range("E:F"), Range("I:J"))) Is Nothing Or Target.Count > 1 Then Exit Sub
にしてください。
No.1
- 回答日時:
こんばんは!
>A1に出勤時間、B1に退社時間を入れ、C1に勤務時間が自動で入る…といったものです。
すなわちA・B列に時刻を入力すればC列に自動で勤務時間を表示させたい!というコトでしょうか?
そうであればお示しのコードそのままで
C1セル(セルの表示形式やユーザー定義から [h]:mm としておく)に
=IF(COUNT(A1:B1)=2,B1-A1,"")
という数式を入れフィルハンドルで下へ3行分コピーしてみてはどうでしょうか?
※ 休憩時間(昼食時間)等引き算が必要な場合、仮に1時間の休憩時間がある場合は
=IF(COUNT(A1:B1)=2,B1-A1-"1:00","")
のように適宜変更してみてください。
※ 3名分だけというコトなので、ChangeイベントはA・B列すべてに適応するのでなく
>Range("A:B")
の部分を
>Range("A1:B3")
のように変更しても良いと思います。
通常、1行目は項目行にするのが一般的ですので、実際データ入力はA2~B4の範囲だと
>Range("A2:B4")
のように変更してください。
当然のコトですが、C列の数式は2行目以降に入るコトになり
=IF(COUNT(A2:B2)=2,B2-A2-"1:00","")
になると思います。m(_ _)m
丁寧な回答ありがとうございます!
質問が説明不足で申し訳ないのですが
タテに1ヶ月分の勤怠表をヨコに3名分並べたいです。
そのため(出社、退社、勤務時間)がそれぞれ
(A1,B1,C1)、(E1,F1,G1)、(I1,J1,K1)
という風になり、参照先の列が変わってしまうのです。
この場合でも対処法はあるのでしょうか。
重ねての質問になりすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
行数が不規則な一週間ごとの合...
-
シート保護の状態で行の追加を...
-
エクセルVBA 複数列をコピーす...
-
エクセルでマクロを使った特定...
-
エクセル VBA 指定の範囲内をコ...
-
エクセルのマクロ、AVERAGEIFを...
-
Excel関数のことで教えてくださ...
-
A1セルに入力したら、入力時間...
-
エクセルの複数のセルを一括で...
-
エクセルで既に入力してある文...
-
Excelで同じセルに箇条書きをし...
-
複数の文字列のいずれかが含ま...
-
数式が入ったセルを含めて、数...
-
EXCELで○ヶ月を○年○ヶ月に変換...
-
「エクセル」特定の行(セル)...
-
値を入力後、自動的にアクティ...
-
自動入力で今月はMONTH(TODAY()...
-
お肉の下のシートを煮込んでし...
-
エクセル関数で、飛び飛びの複...
-
Excelで社歴管理をしており4年...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELにて複数列を同条件(色)...
-
一行おきにコピーするマクロが...
-
エクセルで行挿入した際、自動...
-
行数が不規則な一週間ごとの合...
-
Excelの非表示列も含めてコピー
-
エクセル マクロ 貼り付け先が...
-
シート保護の状態で行の追加を...
-
エクセルで表示された値だけ行...
-
エクセルで空白以外のセルの値...
-
エクセル VBA 指定の範囲内をコ...
-
エクセルの関数について(日付で...
-
[Excel VBA]空白セル以外に連番...
-
エクセルで反転コピー
-
【初歩】エクセルでのマクロ(...
-
エクセルで縦に長い表を印刷
-
エクセルVBA 複数列をコピーす...
-
マクロで値がある列までコピー
-
Excel VBAで日にちを入力して線...
-
《エクセル2000》A列・B列の和...
-
マクロ ScrollColumn について
おすすめ情報