PROGRAMMING WORKSHOP

자재관리 | 청구서화일의 관리분석.

앞페이지에서 [자재청구서작성 도구]를 만들었다
그런데 청구서화일이 폴더에 계속 쌓여간다면
이것을 좀 어떻게 관리하는 방법이 없을까?
라는 생각을 갖게 되는 것은 사람이면 당연한 것이다
[자재청구서 도구]를 통하여 발생하는 정보들을 관리해 보도록 하자
ADO를 활용하여 DB시스템을 만들어 보는 것도 좋겠지만
이것은 차후로 미루고 엑셀만 갖고 해보도록 하자

STEP_5 ---------------------------------

우선 현재 작성되어 보관되고 있는 폴더내의 청구서화일의
내용을 어딘가를 통하여 항상 볼수 있는 장치를 달아 보자
우선 워크시트를 사용해 보자
UserForm등의 사용은 나중에 고려해 보고, 워크시트를 먼저 하는 것이
좋을 것 같다
예를 들어서 [청구서]화일을 만들어서 저장할때마다
Log시트에 청구서생성날짜와 시간, 화일명,청구품목의 건수등을
기록하여 두면 이것이 전체 흐름의 내용을 알게 될것이다
자재담당과 논쟁이 붙더라도 청구근거를 확실하게 제시 할 수 있는
도구가 되고 , 다음 진급에 ...[그 친구 정확하기가 칼 같더라구!!]..
고려가 되겠지..^^
그리고 Log시트의 해당 행을 더블크릭하면 해당화일이 열려서
상세확인을 할 수도 있을 것이다

1)[청구서]를 저장할때 Log화일이 존재여부확인 없으면 만들고
2)[청구서]화일의 요약내용을 하나의 행에 추가시키고,
   [작성일],[청구일],[반입예정일],[건수],[화일명]등,,
3)Log 화일의 원하는 행을 더블크릭하면 해당[청구서]화일이 열린다
요기까지 해본다

아래의 프로시져 하나 삽입하면 끝이다
Log시트를 더블크릭하면 해당 화일이 열리는 것은 다음 스텝에서..

'########### 최종 신청서 화일을 저장하면서
'            Log 시트에 내용 요약 기록, 히스토리시트
Sub writeLogSheet(sFileName As String, datRequestDate As Date, _
              datSupplyDate As Date, iItemNum As Integer, iTotal As Integer)
Dim shtLog As Worksheet
Dim rLogStart As Range
On Error Resume Next
'############### Log시트 찾아서 없으면 새로 만든다
Set shtLog = ThisWorkbook.Worksheets(modMain.SHT_LOG)
If shtLog Is Nothing Then
  Err.Clear
  Set shtLog = ThisWorkbook.Worksheets.Add
  With shtLog
      .Name = modMain.SHT_LOG
      With .Cells
          .Font.Name = "맑은 고딕"
          .Font.Size = 10
      End With
      .Range("A1").Resize(, 7) = Array("작성일자", _
                                  "화일명", _
                                  "청구일자", _
                                  "반입일자", _
                                  "주문건수", _
                                  "주문총량", _
                                  "실제반입일")
  End With
End If
Set rLogStart = shtLog.Range("A" & shtLog.Rows.Count).End(xlUp).Offset(1).Resize(, 7)
'################################################

'####### Write Datas
With rLogStart
  .Cells(1) = Now
  .Cells(2) = sFileName
  .Cells(3) = datRequestDate
  .Cells(4) = datSupplyDate
  .Cells(5) = iItemNum
  .Cells(6) = iTotal
  .Cells(7) = ""
  .Range("A1").CurrentRegion.Columns.AutoFit
End With
End Sub

***[LOG-IN]***

STEP_6 ---------------------------------

Log 시트를 더블크릭하면 해당 화일 열기를 하자
이 소루션은 최초질문하신분의 끈질김 덕분에 계속 잘 진행된다
각 분야별..끈기 있고 VBA는 없어도 업무에 대한 로직만 확실하면
모두 질문들 보내시면 된다..순서대로 만들어 드릴테니까..
First Come, First Served!! 먼저 온 순서대로..

위의 로그시트의 화일명의 일련번호가 없다고 한다..
종종 변수를 덜렁대고 다른 것을 드리대어서 그런것..
Log시트를 좀더 보기 좋게 수정하도록 하고
화일열기..를 하자

더블 크릭하여 화일을 여는 것은 DoubleClick이벤트프로시져를 활용하는 것
각 시트별 BeforeDoublcClick 이벤트프로시져에 하지 않고
ThisWorkBook모듈시트에서 작성을 하였었다
이제 더블크릭하면 이루어지는 작업이 한두개 생긴것이 아니다
초보님들은 이때 정신을 바짝 차려야 한다
ThisWorkBook모듈시트내의 BeforeDoubleClick이벤트프로시져가
복잡해져 가는 것이다..
조건문을 사용하여 ..어떤 시트의 셀을 다블크릭하였을때???인지
잘 따져가면서 해야지..헷갈리면 이전에 하였던것까지 엉켜서
엉망이 될 수 있게 되는 순간이니까..
소루션에 기능을 추가 하다보면..코드가 쌓이고 쌓여서
헷갈리게 되는 것이다
아무튼 아직은 그렇게 헷갈리는 것은 아니니까..별문제 없지만
앞으로 더 추가 되면 아마도 방법을 바꾸어야 하는 경우도 생길 것이다
그러니 계속 기능추가 요청하여 다른 방법으로 바꾸던가..
조건문을 좀더 체계적으로 정리하던가하는 기회를 맛보시기를..
화일을 여는 것은 지극히 기초중의 기초일 것이고

Dim sFile As String
sFile = Target.EntireRow.Cells(2)
If sFile = "" Then GoTo OUT
sFile = ThisWorkbook.Path & "\" & sFile
Dim oOpenBook As Workbook
Set oOpenBook = Workbooks.Open(sFile)
If oOpenBook Is Nothing Then
    MsgBox sFile & " 이 삭제 된 것 같습니다..확인하시고 다시하세요"
Else
    '화일이 열린상태..특별이 뭐 할 일이 없을 것이고
End If

***[LOG-IN]***

STEP_7 ---------------------------------

화일을 관리하다보면 손으로 삭제를 하여 버리는 수가 많을 것이다
화일시스템에 있는 화일과 LogSheet에 있는 화일기록과 다른 수가
생길수 있을 것이다
그렇가면 화일시스템의 화일내용을 관찰하고 LogSheet의 내용과
비교하여 보아야 좀더 안전한 관리가 될 것이다
이것을 해보도록 하자
아래의 그림과 같이 위에서 만든 로그화일에 버튼을 하나 추가하여
만드는 것으로 수정하고
버튼을 크릭하면 폴더내의 [청구서]화일을 주욱..찾아서
Log시트의목록과 비교를 하여..어떻게 할 것인지 결정하도록 하자



그런데 화일이 생성된 날짜를 알아내야 하는데 ..어디서 알아내지??

Sub checkFiles()
Dim sPath As String
Dim sFile As String
Dim iX As Integer
On Error Resume Next
sPath = ThisWorkbook.Path & "\"
Do
    If iX = 0 Then
        sFile = Dir(sPath)
    Else
        sFile = Dir
    End If
    If sFile <> "" Then
        MsgBox sFile & vbNewLine & FileDateTime(sPath & sFile)
    End If
    iX = iX + 1
Loop Until sFile = ""
End Sub

위와 같이 FileDateTime I/O함수로 알아내면 된다
그렇게 찾아내어 보고서를 아래와 같이 하나 만들면 비교가 될 것이다



***[LOG-IN]***