Excel VBA質問箱 IV

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

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


80 / 13645 ツリー ←次へ | 前へ→

【82073】色付きセル&数値入りセルの個数を数えたい へっぽこです 22/10/13(木) 8:40 質問[未読]
【82074】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/13(木) 9:03 発言[未読]
【82075】Re:色付きセル&数値入りセルの個数を数え... マナ 22/10/13(木) 14:17 発言[未読]
【82076】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/14(金) 7:11 質問[未読]
【82077】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/14(金) 8:08 発言[未読]
【82078】Re:色付きセル&数値入りセルの個数を数え... マナ 22/10/14(金) 17:11 発言[未読]
【82079】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/14(金) 19:31 発言[未読]
【82080】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/17(月) 8:26 発言[未読]
【82081】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/17(月) 9:37 発言[未読]
【82082】Re:色付きセル&数値入りセルの個数を数え... マナ 22/10/17(月) 13:32 発言[未読]
【82083】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/17(月) 21:15 お礼[未読]
【82084】Re:色付きセル&数値入りセルの個数を数え... へっぽこです 22/10/17(月) 21:19 お礼[未読]

【82073】色付きセル&数値入りセルの個数を数えた...
質問  へっぽこです  - 22/10/13(木) 8:40 -

引用なし
パスワード
   建設業です。
毎月の作業内容毎のユニット(1ユニット=15分)を計算しています。
引き継がれている書式があり、その体裁は崩したくありません。

(A)入力セルについて
(A1)Sheets("月間ユニット集計")のRange("R18:DI41")に縦方向に31日、横方向に24時間(15分毎)に区切った月表があります。
(A2)月表は時間区分(定時間、時間外、深夜時間、休日、法定休日等々)にセル毎に色分けされています。
(A3)作業者は毎日当日の作業番号(6桁数値)をその作業の開始時間のセルに入力します。
(A4)1日の中で異なる作業が発生し、その都度作業番号を開始時間のセルに入力します。
(A5)作業が発生していない時間(昼休み、会議、出張等)は当該時間内のセルの色を無色にします。

(B)集計セルについて
(B1)Sheets("ユニット集計")のRange("A50:A69")に作業番号、Range("H50:N69")に時間区分が設定されています。
(B2)月の作業番号毎、時間区分毎のユニット数を月末に集計、入力します。

(C)留意すること
(C1)作業者の入力ミスで物件番号の入ったセルの着色を消している。→ユニット数にはカウントされない。
(C2)日の始まりの着色セルに物件番号を設定していない。→作業番号不明。
(C3)次の作業番号までの間のセルに無着色セルがある場合(A5)も次のセルが着色セル&空白なら続いて同じ作業番号のユニットとしてカウントする。

(D)VBAでしたいこと
(D1)(B2)の集計、入力を自動、かつ短時間で処理したい。
(D2)(C1)、(C2)の入力設定忘れをメッセージ表示したい。

(E)試したこと
作業番号が入力されたセルの作業番号を、異なる作業番号が入力されているセルまでコピペし、
セルの色毎にそれを集計。集計後同じ作業番号が続くセルをClearContents。
→処理時間が永遠かと思われるほどかかりました。

どなたかお知恵を貸してくれる方、いらっしゃいましたら宜しくお願いします。

【82074】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/13(木) 9:03 -

引用なし
パスワード
   >(C1)作業者の入力ミスで物件番号の入ったセルの着色を消している。→ユニット数にはカウントされない。
>(C2)日の始まりの着色セルに物件番号を設定していない。→作業番号不明。

物件番号→作業番号と読み換えてください。

【82075】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/13(木) 14:17 -

引用なし
パスワード
   ▼へっぽこです さん:

>→処理時間が永遠かと思われるほどかかりました。

それを提示してください。

【82076】Re:色付きセル&数値入りセルの個数を数...
質問  へっぽこです  - 22/10/14(金) 7:11 -

引用なし
パスワード
   ▼マナ さん:

>それを提示してください。

色々編集して現在は下記の通り。
以前ほどには処理に時間がかからなくなった気がします。

ただ、
(1)とても泥臭い処理を行っている気がします。
(2)連続作業番号削除がどんな場面でも正確に処理されるのか、が気になっています。

もっとスマートな方法があればご教授ください。

Function CountCcolorText(range_data As Range, criteriaC As Range, criteriaT As Range) As Long '指定した色のセル数_and_指定した文字セルのカウント
Dim datax As Range
Dim xcolor As Long
Dim xtext As String

Application.Volatile
CountCcolorText = 0

xcolor = criteriaC.Interior.ColorIndex
xtext = criteriaT.Value

For Each datax In range_data
  If datax.Interior.ColorIndex = xcolor And datax.Value = xtext Then
   CountCcolorText = CountCcolorText + 1
  End If
Next datax
End Function


Sub 作業番号連続コピー()
  Sheets("月間ユニット集計").Activate
'***********************************************************************
'色の付いているセルだけを選択する
  For Each rng In Range("R11:DI41")
   If rng.Interior.ColorIndex <> xlNone Then 'セルに色が付いている場合
    If selectRng Is Nothing Then '最初にヒットした場合
     Set selectRng = rng
    Else
     Set selectRng = Application.Union(selectRng, rng) '色が付いているセルを選択範囲に追加していく
    End If
   End If
  Next rng
'***********************************************************************
'作業番号コピー
  For Each rng In selectRng '着色セル範囲内で
   If rng <> "" And rng.Offset(0, 1).Interior.ColorIndex <> xlNone And rng.Offset(0, 1) = "" Then 'セルに文字があり隣のセルが着色され,隣のセルが空欄の場合
    rng.Offset(0, 1).Value = rng
   ElseIf rng = "" And rng.Interior.ColorIndex <> xlNone Then 'セルに文字が無くセルが着色されている場合
    rng = rng.End(xlToLeft)
   End If

   If rng = Cells(rng.Row, "F") Or rng = Cells(rng.Row, "H") Or rng = Cells(rng.Row, "J") Or rng = Cells(rng.Row, "L") Or rng = Cells(rng.Row, "N") Or rng = Cells(rng.Row, "P") Then '列F,H,J,L,N,Pには別数値設定済
    rng.ClearContents
   End If
  Next rng
'***********************************************************************
'着色セルand数値セル集計
  For iR = 50 To 69
   If Cells(iR, 1) <> "" Then
    For iC = 6 To 14 Step 2
     Cells(iR, iC) = CountCcolorText(selectRng, Cells(48, iC), Cells(iR, 1)) 'セル(48, iC)には時間区分毎の設定色がせっていされています。
    Next iC
'無着色セルand数値セル集計
    Cells(iR, 16) = CountCcolorText(Range("R11:DI41"), Cells(48, 16), Cells(iR, 1)) 'セル(iR, 16)は作業番号有り、かつ無着色エラーの検出用。
   End If
  Next iR
End Sub

Sub 連続作業番号削除()
Application.ScreenUpdating = False
  Sheets("月間ユニット集計").Activate
   For iC = 113 To 18 Step -1
    For iR = 11 To 41
     If Cells(iR, iC) = Cells(iR, iC - 1) Then
      Cells(iR, iC).ClearContents
     End If
     If Cells(iR, iC) <> "" And Cells(iR, iC - 1) = "" And Cells(iR, iC) = Cells(iR, iC).End(xlToLeft) Then
      Cells(iR, iC).ClearContents
     End If
    Next iR
   Next iC
End Sub

【82077】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/14(金) 8:08 -

引用なし
パスワード
   記入漏れです。

Public rng As Range
Public selectRng As Range
Public iC As Integer
Public iR As Integer

【82078】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/14(金) 17:11 -

引用なし
パスワード
   ▼へっぽこです さん:

集計結果を書き込む列(F,H,J,L,N,P)の
隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?

【82079】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/14(金) 19:31 -

引用なし
パスワード
   ▼マナ さん:

>集計結果を書き込む列(F,H,J,L,N,P)の
>隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?

個人PCから書き込んでいます。
すみません、明日明後日はテレワーク移動日のため月曜日に返信します。

【82080】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/17(月) 8:26 -

引用なし
パスワード
   ▼マナ さん:

>集計結果を書き込む列(F,H,J,L,N,P)の
>隣の列(G,I,K,M,O,Q)には、何があるのでしょうか?

Q列は全て空欄です。
G,I,K,M,Oは各々隣のF,H,J,L,Nと結合されたセルとなっています。

【82081】Re:色付きセル&数値入りセルの個数を数...
発言  へっぽこです  - 22/10/17(月) 9:37 -

引用なし
パスワード
   ▼マナ さん:

>G,I,K,M,Oは各々隣のF,H,J,L,Nと結合されたセルとなっています。

追伸です。
上記列G,I,K,M,OとF,H,J,L,Nの結合は解除できると思います。

【82082】Re:色付きセル&数値入りセルの個数を数...
発言  マナ  - 22/10/17(月) 13:32 -

引用なし
パスワード
   Sub test()
  Dim rngF As Range, rngT As Range
  Dim dicX As Object, dicY As Object
  Dim w, k As Long
  Dim r As Range, c As Range
  Dim 作業 As String, 区分
  
  Set rngF = Range("R11:DI41")
  Set rngT = Range("F50:P69")
  ReDim w(1 To rngT.Rows.Count, 1 To rngT.Columns.Count)
  
  Set dicX = CreateObject("scripting.dictionary")
  Set dicY = CreateObject("scripting.dictionary")
  
  For k = 1 To rngT.Rows.Count
    作業 = rngT(k, -4).Value
    If 作業 <> "" Then dicY(作業) = k
  Next
  
  For k = 1 To rngT.Columns.Count Step 2
    区分 = rngT(-1, k).Interior.ColorIndex
    dicX(区分) = k
  Next
    
  For Each r In rngF.Rows
    作業 = ""
    For Each c In r.Cells
      区分 = c.Interior.ColorIndex
      If Not dicX.exists(区分) Then 区分 = xlNone
      If c.Value <> "" Then 作業 = c.Value
      If Not dicY.exists(作業) Then
        If 区分 <> xlNone Or 作業 <> "" Then
          Application.Goto c, -1
          MsgBox c.Address(0, 0) & "セルの作業番号不明"
          Exit Sub
        End If
      End If
      If c.Value <> "" Or 区分 <> xlNone Then
        w(dicY(作業), dicX(区分)) = w(dicY(作業), dicX(区分)) + 1
      End If
    Next
  Next
  
  rngT.Value = w
  
End Sub

【82083】Re:色付きセル&数値入りセルの個数を数...
お礼  へっぽこです  - 22/10/17(月) 21:15 -

引用なし
パスワード
   ▼マナ さん:
おお、私の長々とした記述に比べ、ずいぶんコンパクトに!
今、走らせてみましたがスッキリ動きました。

ReDimというステートメントなど見たこともないので調べてみましたが、
勉強不足で理解できませんでした。

また明朝、作成していただいたコードを読み解いてみようと思います。
ありがとうございました!

【82084】Re:色付きセル&数値入りセルの個数を数...
お礼  へっぽこです  - 22/10/17(月) 21:19 -

引用なし
パスワード
   また不明な点があると思いますのでその時はご教示ください。

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