Option Explicit

' This fixed fixture has exactly three rows, A1:C4.
' Save a separate .xlsm copy if testing. No macro is embedded in the XLSX.
Public Sub CopyIncompleteRows()
    Dim src As Worksheet, dst As Worksheet, sh As Object
    Dim data As Variant, result() As Variant
    Dim r As Long, c As Long, n As Long, outRow As Long, lastRow As Long
    Dim status As String, phase As String
    On Error GoTo Failed
    phase = "validation"
    Set src = ThisWorkbook.Worksheets("원본")
    For Each sh In ThisWorkbook.Sheets
        If sh.Name = "미완료" Then
            Err.Raise vbObjectError + 101, , "미완료 시트가 이미 있습니다. 기존 결과를 확인하세요."
        End If
    Next sh
    For c = 1 To 3
        lastRow = src.Cells(src.Rows.Count, c).End(xlUp).Row
        If lastRow <> 4 Then Err.Raise vbObjectError + 102, , "A:C는 머리글과 정확히 세 데이터 행이어야 합니다."
    Next c
    If src.Range("A1").Value2 <> "작업명" Or src.Range("B1").Value2 <> "상태" Or src.Range("C1").Value2 <> "담당" Then
        Err.Raise vbObjectError + 103, , "머리글이 작업명/상태/담당과 다릅니다."
    End If
    data = src.Range("A1:C4").Value2
    For r = 1 To 4
        For c = 1 To 3
            If src.Cells(r, c).HasFormula Or IsError(data(r, c)) Then
                Err.Raise vbObjectError + 104, , "수식 또는 오류값은 이 입력 계약에서 허용하지 않습니다."
            End If
            If VarType(data(r, c)) <> vbString Then Err.Raise vbObjectError + 105, , "모든 입력은 비어 있지 않은 텍스트여야 합니다."
            If Len(Trim$(CStr(data(r, c)))) = 0 Then Err.Raise vbObjectError + 106, , "빈 입력이 있습니다."
            If InStr(1, "=+-@", Left$(Trim$(CStr(data(r, c))), 1), vbBinaryCompare) > 0 Then
                Err.Raise vbObjectError + 108, , "수식으로 오해될 수 있는 선두 문자는 이 예제에서 허용하지 않습니다."
            End If
        Next c
    Next r
    For r = 2 To 4
        status = CStr(data(r, 2))
        If status <> "완료" And status <> "진행" And status <> "대기" Then
            Err.Raise vbObjectError + 107, , "상태는 완료/진행/대기 중 하나여야 합니다."
        End If
        If status <> "완료" Then n = n + 1
    Next r
    ReDim result(1 To n + 1, 1 To 3)
    For c = 1 To 3: result(1, c) = data(1, c): Next c
    outRow = 1
    For r = 2 To 4
        If CStr(data(r, 2)) <> "완료" Then
            outRow = outRow + 1
            For c = 1 To 3: result(outRow, c) = data(r, c): Next c
        End If
    Next r
    phase = "new sheet creation"
    Set dst = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    dst.Name = "미완료"
    phase = "output writing"
    dst.Range("A1").Resize(n + 1, 3).NumberFormat = "@"
    dst.Range("A1").Resize(n + 1, 3).Value2 = result
    MsgBox CStr(n) & "개 행을 새 미완료 시트에 기록했습니다. 원본은 수정하지 않았습니다."
    Exit Sub
Failed:
    MsgBox "중단(" & phase & "): " & Err.Description & vbCrLf & _
        "새 시트가 생겼다면 부분 결과를 직접 확인하세요. 기존 시트는 자동 삭제하지 않습니다."
End Sub
