나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 참서리 (k5953)

추천:  2
파일:     월별_일일_업무_일지.xlsm (110KB) 조회:  1763
제목:   [RE]일일업무일지 VBA 오류 질문
     
 

'-----------------------------------------
Sub work_report()
'-----------------------------------------


    ' 순수 작업 날짜 가져오기
    Dim days As Variant: days = get_days
    
    ' 화면 갱신 해제
    Application.ScreenUpdating = False
    
    '-------------------------
    ' 기존시트 삭제
    '-------------------------
    ' 경고 해제
    Application.DisplayAlerts = False
    ' 각 시트를 돌며
    For Each sht In Worksheets
        ' 시트 이름이 main,원본이 아니면 시트 삭제
        If sht.Name <> "main" And sht.Name <> "원본" Then sht.Delete
    Next
    ' 경고 설정
    Application.DisplayAlerts = True
    
    '원본(template) 시트
    Dim shtX As Worksheet: Set shtX = Worksheets("원본")
    shtX.Visible = xlSheetVisible
    
    
    Dim shtY As Worksheet
    
    ' 작업일을 돌며( 0-전 달 마지막 작업 날)
    For i = 1 To UBound(days)
    
        ' 원본 시트 마지막에 추가
        shtX.Copy After:=Worksheets(Worksheets.Count)
        ' 복사된 원본 시트
        Set shtY = Worksheets(Worksheets.Count)
        ' 현재 작업일
        shtY.[H1].Value = days(i)
        ' 전 일 작업일
        shtY.[C6].Value = days(i - 1)
        ' 시트 이름 설정
        shtY.Name = days(i) & "(" & Format(days(i), "aaa") & ")"
        
    Next i
    
    ' main시트 선택
    Worksheets("main").Activate
    
    '원본 시트 감추기
    shtX.Visible = xlSheetVeryHidden
    
    ' 화면 갱신 설정
    Application.ScreenUpdating = True
    
End Sub


'------------------------------------------
Function get_days() As Variant
'------------------------------------------

    Dim sDate As Date, eDate As Date
    '해당 월 시작일
    sDate = DateSerial([D2].Value, [E2].Value, 1)
    ' 해당 월 종료일
    eDate = DateSerial([D2].Value, [E2].Value + 1, 0)
    
    ' ArrayList 선언
    Dim oList As Object: Set oList = CreateObject("System.Collections.ArrayList")
    
    '법정공휴일
    Dim holidays As Range: Set holidays = [ holidays[공휴일] ]
    Dim curDate As Date
    Dim beforeDate As Date
    
    '전 달 마지막 날
    beforeDate = get_last_month_date(sDate, holidays)
    
    ' 전 월 마지막 근무일 추가
    oList.Add beforeDate
    
    ' 현재 월 1일부터 마지막 날가지 돌려
    For curDate = sDate To eDate
        ' 월-금 그리고 공휴일에 해당되지 않으면
        If Weekday(curDate, vbMonday) < 6 And WorksheetFunction.CountIf(holidays, curDate) = 0 Then
            'ArrayList에 추가
           oList.Add curDate
        End If
        
    Next
    
    get_days = oList.toarray ' ArrayList의 요소들을 배열로 반환



End Function


'-------------------------------------------------------------------------
Function get_last_month_date(ByVal sDate As Date, holidays As Range)
'-------------------------------------------------------------------------

  '  Dim holidays As Range: Set holidays = [holidays[공휴일]]
  '  Dim sDate As Date: sDate = DateSerial(2019, 5, 1)
    
    
    Do
        ' 해당 일 전 날
        sDate = sDate - 1
          ' 월-금 그리고 공휴일에 해당되지 않으면 빠져 나가기
        If Weekday(sDate, vbMonday) < 6 And WorksheetFunction.CountIf(holidays, sDate) = 0 Then Exit Do
    Loop
    
    get_last_month_date = sDate
    
End Function


 
[불량 게시물 신고]  
참서리다음 Youtube 동영상에 자세히 설명되어 있습니다.
https://youtu.be/ihRQMc0oZD4
06-09 (00:35)
삭제 ■신고
        
  

작성일 : 2019-06-08(22:52)
최종수정일 : 2019-06-08(22:52)
 


 ◎ 관련글

  제 목   작성자   날짜
일일업무일지 VBA 오류 질문 우쭈맘 2019-05-28
[RE]일일업무일지 VBA 오류 질문 참서리 2019-06-08
[RE]일일업무일지 VBA 오류 질문 dew 2019-05-29