Option Explicit
Dim ms As Worksheet '明細シート
Dim sz As Worksheet '処理済シート
Dim maxrow_ms As Long '明細最大行
Dim maxrow_sz As Long '処理済最大行
Dim count As Long '処理件数
Public Sub 更新処理()
Dim ret As Integer
Set ms = Worksheets("明細")
Set sz = Worksheets("処理済")
maxrow_ms = ms.Cells(Rows.count, 1).End(xlUp).Row 'A列 最大行取得
maxrow_sz = sz.Cells(Rows.count, 1).End(xlUp).Row 'A列 最大行取得
count = 0
ms.Range("E2:E" & maxrow_ms).Value = "" '状態クリア
Call check_status("建物") '建物シートのチェック
Call check_status("機械") '機械シートのチェック
If count = 0 Then
MsgBox ("処理済データなし")
Exit Sub
End If
ret = MsgBox("処理件数=" & count & vbLf & "完了データの移動及び処理済データの削除を開始します", vbOKCancel)
If ret = vbCancel Then Exit Sub
Call delete_line("建物") '建物シートの処理済み行削除
Call delete_line("機械") '機械シートの処理済み行削除
Call copy_compline '完了行のコピー
Call delete_compline '完了行の削除
MsgBox ("処理完了")
End Sub
'処理済行のチェック
Private Sub check_status(ByVal sheet_name As String)
Dim maxrow As Long
Dim ws As Worksheet
Dim wrow As Long
Dim result As Boolean
Dim name As String
Dim kingaku As Variant
Dim errmsg As String
errmsg = ""
Set ws = Worksheets(sheet_name)
maxrow = ws.Cells(Rows.count, 2).End(xlUp).Row 'B列 最大行取得
For wrow = 2 To maxrow
If ws.Cells(wrow, "B").Value = "処理済" Then
name = ws.Cells(wrow, "C").Value
kingaku = ws.Cells(wrow, "D").Value
If kingaku = "" Then errmsg = "合計金額が空です"
If name = "" Then errmsg = "名前が空です"
If errmsg = "" Then
Call check_kingaku(name, kingaku, errmsg) '合計金額のチェック
End If
'エラーがあればエラーメッセージ表示後、処理中止
If errmsg <> "" Then
MsgBox ("シート名=" & sheet_name & " " & wrow & "行" & vbLf & errmsg & vbLf & "処理を打ち切ります")
ws.Select
ws.Cells(wrow, "B").Select
End
End If
End If
Next
End Sub
'金額チェック
Private Sub check_kingaku(ByVal name As String, ByVal kingaku As Variant, ByRef errmsg As String)
Dim wrow As Long
Dim find As Boolean
Dim sum_kingaku As Variant
Dim row_count As Long
Dim row_array() As Long
Dim i As Long
row_count = -1
find = False
sum_kingaku = 0
For wrow = 2 To maxrow_ms
If ms.Cells(wrow, "E").Value = "" And ms.Cells(wrow, "B").Value = name Then
sum_kingaku = sum_kingaku + ms.Cells(wrow, "D").Value
row_count = row_count + 1
ReDim Preserve row_array(row_count)
row_array(row_count) = wrow
find = True
End If
Next
If find = True Then
If kingaku = sum_kingaku Then
For i = 0 To UBound(row_array)
wrow = row_array(i)
ms.Cells(wrow, "E").Value = "完了"
Next
count = count + 1
Else
errmsg = "合計金額が不一致です"
End If
Else
errmsg = "名前が不一致です"
End If
End Sub
'処理済行の削除
Private Sub delete_line(ByVal sheet_name As String)
Dim maxrow As Long
Dim ws As Worksheet
Dim wrow As Long
Set ws = Worksheets(sheet_name)
maxrow = ws.Cells(Rows.count, 2).End(xlUp).Row 'B列 最大行取得
For wrow = maxrow To 2 Step -1
If ws.Cells(wrow, "B").Value = "処理済" Then
ws.Rows(wrow).Delete
End If
Next
End Sub
'完了行のコピー
Private Sub copy_compline()
Dim wrow As Long
Dim wrow2 As Long
wrow2 = maxrow_sz
For wrow = 2 To maxrow_ms
If ms.Cells(wrow, "E").Value = "完了" Then
sz.Range("A" & wrow2 & ":E" & wrow2).Value = ms.Range("A" & wrow & ":E" & wrow).Value
wrow2 = wrow2 + 1
End If
Next
End Sub
'完了行の削除
Private Sub delete_compline()
Dim wrow As Long
Dim wrow2 As Long
wrow2 = maxrow_sz
For wrow = maxrow_ms To 2 Step -1
If ms.Cells(wrow, "E").Value = "完了" Then
ms.Rows(wrow).Delete
End If
Next
End Sub