|
* 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.
- 엑셀 버전(95,97,2000,xp,2003,2007):2016
* 아래줄에 질문을 작성하세요 >>
안녕하세요!
VBA 관련 질문있어 올립니다.
아래 코드는 일일 업무일지이며
한달을 만드는 과정에서 주말,공휴일 빼고 만드는 것을 만들었는데요
이것저것 짜집기식이라서 잘몰라 남깁니다
1. 공휴일을 Input박스로 입력하여 나타나지 않게 하는데요~
여러개 입력을 해도 모두 빠져야 하는것인데 한개만 입력 할 수 있고 여러개를 입력하면 오류발생합니다.
2. 양식을 보면 날짜가 있는데요~ C6셀에 보시면 전날입력이 되지만
주말이나 공휴일이 생기면 공휴일 전날이 나와야 하는데 그것도 조언부탁드립니다.
제가 설명을 잘 했는지 모르겠습니다.
---------------------------------------------------------------------
Sub 일일업무일지()
Dim 작성연 As Integer, 작성월 As Integer, 마지막일자 As Integer, j As Integer, i As Integer, 주말 As Integer
Dim 날짜 As Date
Dim 개수 As Double
Dim 공휴일 As String, 공휴일자() As String, 요일 As String
Dim 비고 As Boolean
Dim wrs As Worksheet
Application.DisplayAlerts = False
작성연 = Application.InputBox("연도를 입력하세요" & Chr(13) & _
"작성을 취소하려면 [취소] 단추를 클릭하세요", Title:="연도 입력", Type:=1)
If 작성연 = 0 Then Exit Sub
작성월 = Application.InputBox("월을 입력하세요" & Chr(13) & _
"작성을 취소하려면 [취소]단추를 클릭하세요", Title:="월 입력", Type:=1)
If 작성월 = 0 Then Exit Sub
Application.DisplayAlerts = True
공휴일 = Application.InputBox("주말을 제외하고 공휴일을 쉽표로 구분해서 입력하세요" & _
"예로들어 1,7,20으로 입력." & Chr(13) & _
"공휴일이 없으면 입력값 없이 [확인]단추, 취소하려면 [취소]단추를 클릭", Title:="공휴일 입력", Type:=3)
' If 공휴일 = " false" Then
' Exit Sub
' ElseIf 공휴일 = "" Then
' 개수 = 0
' Else
' 공휴일자 = Split(공휴일, ",")
' 개수 = UBound(공휴일자)
' End If
'
If 공휴일 = "" Then
개수 = 0
ElseIf 공휴일 = False Then
Exit Sub
Else
공휴일자 = Split(공휴일, ",")
개수 = UBound(공휴일자)
End If
Application.DisplayAlerts = False
마지막일자 = Day(DateSerial(작성연, 작성월 + 1, 0))
For i = 1 To 마지막일자
주말 = Weekday(DateSerial(작성연, 작성월, i))
날짜 = Format(작성연 & " - " & 작성월 & "-" & i, "yyyy-mm-dd")
요일 = Format(날짜, "aaa")
If 개수 > -1 Then
If 요일 = "토" Or 요일 = "일" Then
Else
For j = 0 To UBound(공휴일자)
If 공휴일자(j) <> i Then
Sheets("원본").Copy after:=Sheets(Sheets.Count)
Range("h1") = DateSerial(작성연, 작성월, i)
Sheets(Sheets.Count).Name = 작성월 & "월" & i & "일" & "(" & 요일 & ")"
Else
End If
Next
End If
Else
If 요일 = "토" Or 요일 = "일" Then
Else
Sheets("h1") = DateSerial(작성연, 작성월, i)
Sheets(Sheets.Count).Name = 작성월 & "월" & i & "일" & "(" & 요일 & ")"
End If
End If
Next
Application.DisplayAlerts = False
For Each wks In Sheets
If wks.Name Like "sheet*" Then wks.Delete
Next
Application.DisplayAlerts = True
ThisWorkbook.Save
ActiveWorkbook.Save
Sheets(1).Activate
Application.DisplayAlerts = True
End Sub
==============[우쭈맘님 글에 대한 답변입니다]==============
아래와 같이 수정해보세요.
Sub 일일업무일지()
Dim wst As Worksheet
Dim rSoc As Range
Dim 작성연 As Integer, 작성월 As Integer, 마지막일자 As Integer, 개수 As Integer
Dim i As Integer, j As Integer
Dim 날짜 As Date
Dim 공휴일 As Variant
Dim bCreate As Boolean
With Application
.DisplayAlerts = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
작성연 = Application.InputBox("연도를 입력하세요" & Chr(13) & _
"작성을 취소하려면 [취소] 단추를 클릭하세요", Title:="연도 입력", Type:=1)
If 작성연 = 0 Then GoTo Exit_Sub
작성월 = Application.InputBox("월을 입력하세요" & Chr(13) & _
"작성을 취소하려면 [취소]단추를 클릭하세요", Title:="월 입력", Type:=1)
If 작성월 = 0 Then GoTo Exit_Sub
공휴일 = Application.InputBox("주말을 제외하고 공휴일을 쉽표로 구분해서 입력하세요" & _
"예로들어 1,7,20으로 입력." & Chr(13) & _
"공휴일이 없으면 입력값 없이 [확인]단추, 취소하려면 [취소]단추를 클릭", Title:="공휴일 입력", Type:=3)
If 공휴일 = "False" Then
GoTo Exit_Sub
Else
공휴일 = Split(공휴일, ",")
개수 = UBound(공휴일)
End If
For Each wst In Worksheets
If wst.Name <> "원본" Then wst.Delete
Next
Set rSoc = Worksheets("원본").Range("A1:N11")
마지막일자 = Day(DateSerial(작성연, 작성월 + 1, 0))
For i = 1 To 마지막일자
날짜 = DateSerial(작성연, 작성월, i)
bCreate = False
If Weekday(날짜) = 7 Or Weekday(날짜) = 1 Then ' 주말제외(7-토요일,1-일요일)
Else
bCreate = True
For j = 0 To 개수
If 공휴일(j) = i Then ' 입력한 공휴일제외
bCreate = False
Exit For
End If
Next
End If
If bCreate Then
With Worksheets.Add(after:=Worksheets(Worksheets.Count))
rSoc.EntireColumn.Copy .Range("A1")
With .Range("H1")
.NumberFormat = "yyyy-mm-dd"
.Value = 날짜
.MergeArea.HorizontalAlignment = xlCenter
End With
With .Range("C6")
.HorizontalAlignment = xlCenter
.NumberFormat = "(yyyy-mm-dd)"
.FormulaR1C1 = "=IF(WEEKDAY(R[-5]C[5])=1, R[-5]C[5]-2, IF(WEEKDAY(R[-5]C[5])=2, R[-5]C[5]-3, R[-5]C[5]-1))"
End With
With .Range("F11")
.HorizontalAlignment = xlLeft
.NumberFormat = "(mm월 dd일)"
.FormulaR1C1 = "=R[-5]C[-3]"
End With
With .Range("L11")
.HorizontalAlignment = xlLeft
.NumberFormat = "(mm월 dd일)"
.FormulaR1C1 = "=R[-10]C[-4]"
End With
.Name = Format(날짜, "m월d일(aaa)")
End With
End If
Next
rSoc.Parent.Activate
ThisWorkbook.Save
Exit_Sub:
With Application
.DisplayAlerts = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub |
|