![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
画像みたいな感じで、5連勤、6連勤、7連勤・・・と、それぞれ連勤があるかないかをチェックをしたいのですが、5連勤以上しか見ることができず、6連勤があっても5連勤もありになってしまいます。関数でこうした処理は不可能でしょうか?
マクロもChatGPTと一緒に頑張ってみたんですが、こちらの伝え方が悪いのかどうがんばっても重複処理をしてしまいます。
それぞれの連勤回数を出力するようにできないでしょうか?
Sub CountConsecutive()
Dim dataRange As Range
Dim cell As Range
Dim consecutiveCount As Integer
Dim output5Consecutive As Range
Dim output6Consecutive As Range
Dim output7Consecutive As Range
Dim output8Consecutive As Range
Dim output9Consecutive As Range
Dim output10Consecutive As Range
Dim set5ConsecutiveCount As Integer
Dim set6ConsecutiveCount As Integer
Dim set7ConsecutiveCount As Integer
Dim set8ConsecutiveCount As Integer
Dim set9ConsecutiveCount As Integer
Dim set10ConsecutiveCount As Integer
Dim isConsecutive As Boolean
Dim ignoreCounts As Collection
Dim ignoreCount As Integer
' データの範囲を指定(F5:AJ5に合わせて変更)
Set dataRange = Range("F5:AJ5")
' 5回連続の結果を出力するセルを指定(AY7に合わせて変更)
Set output5Consecutive = Range("AY7")
' 6回連続の結果を出力するセルを指定(AZ7に合わせて変更)
Set output6Consecutive = Range("AZ7")
' 初期化
consecutiveCount = 0
set5ConsecutiveCount = 0
set6ConsecutiveCount = 0
set7ConsecutiveCount = 0
set8ConsecutiveCount = 0
set9ConsecutiveCount = 0
set10ConsecutiveCount = 0
isConsecutive = False
Set ignoreCounts = New Collection
' データを順に確認
For Each cell In dataRange
If cell.value = "出勤" Then
consecutiveCount = consecutiveCount + 1
isConsecutive = True
Else
If isConsecutive Then
' 10回以上連続の場合は無視
If consecutiveCount >= 10 Then
ignoreCount = 10
Else
' 5回以上連続の場合
If consecutiveCount >= 5 And Not Contains(ignoreCounts, consecutiveCount) Then
set5ConsecutiveCount = set5ConsecutiveCount + 1
ignoreCounts.Add consecutiveCount
End If
' 6回以上連続の場合
If consecutiveCount >= 6 And Not Contains(ignoreCounts, consecutiveCount) Then
set6ConsecutiveCount = set6ConsecutiveCount + 1
ignoreCounts.Add consecutiveCount
End If
Then
set10ConsecutiveCount = set10ConsecutiveCount + 1
ignoreCounts.Add consecutiveCount
End If
End If
isConsecutive = False
consecutiveCount = 0
End If
End If
Next cell
' データ範囲の最後で5回以上連続している場合
If consecutiveCount >= 5 And Not Contains(ignoreCounts, consecutiveCount) Then
set5ConsecutiveCount = set5ConsecutiveCount + 1
ignoreCounts.Add consecutiveCount
End If
' データ範囲の最後で6回以上連続している場合
If consecutiveCount >= 6 And Not Contains(ignoreCounts, consecutiveCount) Then
set6ConsecutiveCount = set6ConsecutiveCount + 1
ignoreCounts.Add consecutiveCount
End If
' 結果を出力
output5Consecutive.value = "5回以上連続:" & set5ConsecutiveCount & "セット"
output6Consecutive.value = "6回以上連続:" & set6ConsecutiveCount & "セット"
End Sub
Function Contains(col As Collection, value As Variant) As Boolean
On Error Resume Next
Contains = (col.Item(value) <> 0)
On Error GoTo 0
End Function
![「エクセルで連勤チェックをしたいです。」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/1/543223490_6588bc0b5ce9d/M.jpg)
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
連投すみません
Functionで配列を返しています
As Variant型なので初期値はEmptyで 0が返りません
0を出力したい場合はFunctionの戻り型とFunction内の一時受けの変数の型を数値型に変更してください(IntegerまたはLong)
Private Function CountConsecutive_1(rng As Range, Fdkey As String, minimum As Integer) As Integer()
Dim x As Integer, arr() As Integer
No.6
- 回答日時:
#3です
>10連勤
連勤は例えなのでしょうけれど 黒いですねW
出力セルがAY7→5,6,7・・・ならば
5以上の連勤を連勤ごとの回数を全て出す セルの色とかもいらないのなら
Select Caseは不要ですね
>自力で頑張ってみます
全部VBAで処理する場合、分かり難い書き方をしてしまいましたので ちょっと添削(余計分かり難くなってればごめんなさい)
Set dataRng = Range("F5:AJ5") データ範囲
Set output5 = Range("AY7") 5連勤を出力セル
Range("F5:AJ10")とすると1行ずつ処理 出力は相対位置に出力
少しまとめた方が良いかもですが ステップ実行やdebug.Print
変数のtargetArea.Selectなどを差し込んで確認すると良いかも
自力でとの事なので余計なお世話ですが 一例の参考程度に
Sub test()
Const minimum As Integer = 5
Const kWord As String = "出勤"
Dim dataRng As Range
Set dataRng = Range("F5:AJ5")
Dim output5 As Range
Set output5 = Range("AY7")
Dim ans As Variant
Dim c As Long, r As Long
c = output5.Column - dataRng(dataRng.Columns.Count).Column
r = output5.Row - dataRng(1).Row
Dim targetArea As Range
Dim i As Long
For i = 1 To dataRng.Rows.Count
Set targetArea = dataRng.Areas(i)
ans = CountConsecutive_1(targetArea, kWord, minimum)
On Error Resume Next
targetArea.Item(targetArea.Count).Offset(r, c).Resize(, UBound(ans) + 1).Value = ans
Next
End Sub
Private Function CountConsecutive_1(rng As Range, Fdkey As String, minimum As Integer) As Variant()
Dim target As Range
Dim firstAddress As String
Dim getRng As Range
Set target = rng.Find(What:=Fdkey, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
After:=rng(rng.Count), _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
If target Is Nothing Then
'MsgBox "出勤はヒットしませんでした"
Else
firstAddress = target.Address
Set getRng = target
Do
Set getRng = Union(getRng, rng.FindNext(target))
Set target = rng.FindNext(target)
If target Is Nothing Then Exit Do
Loop While target.Address <> firstAddress
End If
Dim i As Integer, n As Integer
Dim x As Integer, arr()
For i = 1 To getRng.Areas.Count
If n < getRng.Areas(i).Count Then n = getRng.Areas(i).Count
Next
If n >= minimum Then
ReDim arr(0 To n - minimum)
Else
'MsgBox minimum & "連勤以上はヒットしませんでした"
Exit Function
End If
For i = 1 To getRng.Areas.Count
x = getRng.Areas(i).Count - minimum
If x >= 0 Then
arr(x) = arr(x) + 1
End If
Next
CountConsecutive_1 = arr
End Function
No.5
- 回答日時:
No2です。
>1か月の出勤日の中に、5連勤以上の勤務がそれぞれ何回あるかを数えたいというものでした。
えぇと・・・
例えば、連続勤務のブロックが、「3連勤、5連勤、7連勤、6連勤」とあった際に、
5連勤以上は3ブロックなので3を求めたいのか、あるいは、7連勤の内部を見ると初日から見れば7連勤、二日目から見れば6連勤・・なので7連勤内で5以上は3日、全体では6日として6を求めたいのかどちらなんでしょうね?
No2の関数内部で、vにはそれぞれの日から数えた連勤数が得られていますので、前者の数え方であれば5が何個あるか、後者の数え方であれば5以上が何個あるかを数えれば求められます。
COUNTIF関数で求められるかと思いましたが、COUNTIFで配列は使えないようなので、直接ループで数える方法にして追加修正してみました。
併せて、数えたい連勤数も指定できるように引数として追加してあります。
=countc(セル範囲, 指定文字列, 指定連続数)
で求められます。
以下は、上記のうちの前者のカウント方法での例です。
(セル範囲の行数は1行という前提は同じままです。)
Function countC(ByRef r As Range, ByRef s, ByRef c As Long) As Long
Dim i As Long, j As Long, n As Long
Dim v
v = r.Rows(1).Cells.Value
For i = 1 To UBound(v, 2)
n = 0
For j = i To UBound(v, 2)
If v(1, j) = s Then n = n + 1 Else Exit For
Next j
v(1, i) = n
Next i
countC = 0
For i = 1 To UBound(v, 2)
If v(1, i) = c Then countC = countC + 1
Next i
End Function
※ 後者のカウント方法にしたければ、cで判定しているカウント数を、c以上でカウントすれば求められます。
No.4
- 回答日時:
No1です。
私は関数を回答した覚えはありませんし連勤開始セルに色がつくから座標も明白です。
返答の位置を誤っておられませんか?
条件付き書式は試して頂けないのでしょうか?
すみません、一番最初に返事させていただいたのですが、条件付き書式でも試させていただきました。
おっしゃる通りの結果が帰ってきました。
ありがとうございます。
No.3
- 回答日時:
>画像みたいな感じで、5連勤、6連勤、7連勤・・・と、それぞれ連勤があるかないかをチェックをしたいのですが
範囲に5連勤がいくつ6連勤がいくつ・・・って事かな?
出力1セルみたいですけれど・・・最大連勤数なら#2様が回答されていますので 以下は読み飛ばしてください
画像が良く見えないのでコードの使用アドレスから想像して
AIのコードを添削するのはしんどそうなので
勝手な解釈で 新しく書くと
FIDで探してAreaを取得Areaの大きさで連続セルとして条件 カウント
範囲を変えるかもしれないのでPrivate Functionとして 出力をAY7から
右に5連勤・・8連勤回数
Case 5 が 5連勤 ブロックの処理 n5はカウント変数
.ColorIndex = で セルの色設定(コメント化で実行されないです)
Private Function CountConsecutive_1の戻り値は配列
CountConsecutive_1 = Array(n5, n6, n7, n8)
可変もできますが、とりあえず4つにしています
呼び出しや上記を条件に合わせて変更してください
とりあえず
一例のサンプル
Sub test()
Dim ans As Variant
ans = CountConsecutive_1(Range("F5:AJ5"), "出勤")
Range("AY7").Resize(, UBound(ans) + 1).Value = ans
End Sub
Private Function CountConsecutive_1(rng As Range, fdKey As String) As Variant()
Dim target As Range
Dim firstAddress As String
Dim getRng As Range
Set target = rng.Find(What:=fdKey, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
After:=rng(rng.Count), _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
If target Is Nothing Then
'MsgBox "出勤はヒットしませんでした"
Else
firstAddress = target.Address
Set getRng = target
Do
Set getRng = Union(getRng, rng.FindNext(target))
Set target = rng.FindNext(target)
If target Is Nothing Then Exit Do
Loop While target.Address <> firstAddress
End If
Dim i As Integer
Dim n5 As Integer, n6 As Integer, n7 As Integer, n8 As Integer
For i = 1 To getRng.Areas.Count
Select Case getRng.Areas(i).Count
Case 5
'getRng.Areas(i).Interior.ColorIndex = 33
n5 = n5 + 1
Case 6
'getRng.Areas(i).Interior.ColorIndex = 6
n6 = n6 + 1
Case 7
'getRng.Areas(i).Interior.ColorIndex = 3
n7 = n7 + 1
Case 8
'getRng.Areas(i).Interior.ColorIndex = 39
n8 = n8 + 1
End Select
Next
CountConsecutive_1 = Array(n5, n6, n7, n8)
End Function
こんなにわかりづらいコードだったのに、的確な回答ありがとうございます。
期待通りの結果が出ました。
10連勤があると、9連勤もカウントされてしまうのですが、ここからはいただいたコードを参考にさせていただいて、自力で頑張ってみます。
本当にありがとうございました。
No.2
- 回答日時:
こんにちは
>関数でこうした処理は不可能でしょうか?
可能とは思いますが、かなり面倒な計算になりそうに思います。
多分、VBAを利用する方が簡単ではないでしょうか。
一方で、ご提示の図は読解できない上に、機能しないコードを見せられても、何をどうしたいのかさっぱりわかりません。
勝手に解釈して、
「1行の連続範囲内で、指定文字が連続して出現する最大数を数える」
ということと解釈しました。
意味が違っている場合は、以下は無視してください。
以下の、ユーザ定義関数で可能と思います。
(事前に、標準モジュールにコピペしておいてください)
使い方は
=countC(セル範囲、指定文字)
となります。
※ セル範囲は、1行分の連続セル範囲とします。
Function countC(ByRef r As Range, ByRef s) As Long
Dim i As Long, j As Long, n As Long
Dim v
v = r.Rows(1).Cells.Value
For i = 1 To UBound(v, 2)
n = 0
For j = i To UBound(v, 2)
If v(1, j) = s Then n = n + 1 Else Exit For
Next j
v(1, i) = n
Next i
countC = Application.Max(v)
End Function
分かりづらい質問内容なうえに、画像も適当で申し訳ありません。
やりたいことは、1か月の出勤日の中に、5連勤以上の勤務がそれぞれ何回あるかを数えたいというものでした。
教えていただいたコードを参考にさせていただきます。
ありがとうございました。
No.1
- 回答日時:
マクロくまなくても条件付き書式でできますよ。
ちょっと画像が小さすぎて座標が読めないんですけど
その出勤を記入するセル範囲全体を選択して
数式としては 仮に範囲がD2から始まるなら
=COUNTIF(D2:H2,"出勤")=5
これは5連勤の先頭セルを色付けします。
D2:H2は横に5個ならぶ範囲なので
6連勤の場合はD2:I2になります。
同様に6連勤、7連勤と色を変えて設定して
その判断の順序を長いものから先に判断するように並べます。
試して頂けませんか?
丁寧な回答ありがとうございます。
やってみたらおっしゃる通りの結果が帰ってきました。
画像も荒くて申し訳ないです。
非常に厚かましいのですが、重ねて教えてもらってもいいでしょうか。
教えていただいた関数だと、範囲内に5連勤と4連勤があったら、間に空白があっても10連勤とカウントされてしまうのですが、例えば使用している環境だとF5:AJ5に31日分の出欠が入っていて、F5:J5に出勤、K5:M5に休、N5:S5に出勤と入っていた場合、5連勤と6連勤があると思うのですが、これをAY5に5連勤あり、AZ5に6連勤ありと表示させるようなことはできますでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) エクセルマクロで出力行の増やし方がわかりません。 4 2023/09/28 23:40
- Visual Basic(VBA) wordのマクロで思うように行きません(ファイル削除ができない) 3 2023/09/12 08:34
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) ワークシートチェンジ 1 2022/02/01 11:19
- Visual Basic(VBA) VBAに関して 2 2023/11/09 20:57
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
【エクセル】シフトで○が6個以上の場合に色を自動で変更したい Part.2
Excel(エクセル)
-
【エクセル】シフトで○が6個以上の場合に色を自動で変更したい
Excel(エクセル)
-
条件を満たす数値が連続して100個以上続いた場合、セルの色を変える方法
その他(Microsoft Office)
-
-
4
エクセルで同じ値が連続しているセルに色をつける方法を教えてください。
Excel(エクセル)
-
5
エクセル関数/連続した○◎●をカウントする関数
その他(Microsoft Office)
-
6
Excelで連続するデータの個数をカウントする方法を教えてください
Excel(エクセル)
-
7
スプレッドシートのセルに連続した数字が並んだ場合にそのセルの色を自動的に変えれますか?
Excel(エクセル)
-
8
Excel 条件付き書式で連続する同じ数字について、 一つの行で、4つ以上「1」が連続している場合に
Excel(エクセル)
-
9
Excelで連勤の氏名を抽出する
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで連勤チェックをした...
-
MySQL Connector C++について
-
like句を使って日本語を検索す...
-
接続ができません
-
MySQLカラム名は日本語と英数字...
-
ODP.NETのバージョン確認
-
mysqlがインストールされている...
-
副問合せにLIKE文を使う方法は...
-
mysqlコマンドにてタイムアウト
-
ERROR 1045 (28000) (using pas...
-
カンマ区切り
-
MySQLは起動しているが、PHPか...
-
Puttyでサーバー上のMySQLを操...
-
ハングル文字が入らない。
-
SQLのVARCHARとVARCHAR2の違い
-
パスワード入力を省略したい
-
存在しているファイルがロード...
-
VBAで変数内に保持された二次配...
-
列数が多いと結果が行単位に改...
-
経過時間(hhmmdd)をDATE型には...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
like句を使って日本語を検索す...
-
windows上のphpにおける全角ハ...
-
エクセルで連勤チェックをした...
-
my.cnf と my.ini の違い
-
phpMyAdminのデフォルトのLangu...
-
文字化け中。
-
MySQL Connector C++について
-
文字化け:xamppを利用したphp...
-
ODBC接続で全角文字が文字化け
-
Mysql移行後の文字化け
-
MySQL4.1.11の漢字がAccessで文...
-
Mysqlで外部から接続できない。
-
XAMPPでMySQLで文字化け、文字...
-
netscreen remoteに関して
-
mySQLデータベースに書き込む...
-
接続ができません
-
MySQLカラム名は日本語と英数字...
-
ODP.NETのバージョン確認
-
副問合せにLIKE文を使う方法は...
-
mysqlがインストールされている...
おすすめ情報