|
* 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.
- 엑셀 버전(95,97,2000,xp,2003,2007): 2019
* 아래줄에 질문을 작성하세요 >>
안녕하세요. 다음과 같은 코드를 작성중입니다.
Sub Update_data()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("User")
ws.Range("A2:F300").ClearContents
ThisWorkbook.RefreshAll
DoEvents
Dim lastRow As Long
Dim i As Long
Dim cutRange As Range
Dim currentDate As Date
Dim oneMonthBefore As Date
currentDate = Empty
' 작업할 시트 선택
Set ws = ThisWorkbook.Sheets("User")
' I1 셀에 입력된 날짜 가져오기
If IsDate(ws.Range("I1").Value) Then
If Format(ws.Range("I1").Value, "yyyy-mm-dd") <> ws.Range("I1").Text Then
MsgBox "Please enter the date in the format 'YYYY-MM-DD'", vbExclamation
Exit Sub
End If
currentDate = ws.Range("I1").Value
Else
MsgBox "날짜를 입력해주세요", vbExclamation
Exit Sub
End If
oneMonthBefore = DateAdd("m", -1, currentDate)
' 마지막 행 확인
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' 숫자로 시작하는 행을 찾아서 잘라내고 아래에 붙이기
For i = lastRow To 2 Step -1
If IsNumeric(Left(ws.Cells(i, "B").Value, 1)) Then
If cutRange Is Nothing Then
Set cutRange = ws.Rows(i)
Else
Set cutRange = Union(cutRange, ws.Rows(i))
End If
cutRange.Cut
DoEvents
ws.Rows(lastRow + 1).Insert Shift:=xlDown
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Set cutRange = Nothing
End If
Next i
' E열에서 currentDate 이후의 날짜가 있는 행 삭제
lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row ' 다시 lastRow 업데이트
For i = lastRow To 2 Step -1
If ws.Cells(i, "E").Value > currentDate Then
ws.Rows(i).Delete
End If
Next i
' 기준 날짜 한달 이전 퇴사자 삭제
lastRow = ws.Cells(ws.Rows.Count, "F").End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, "F").Value = "Z" And ws.Cells(i, "E").Value < oneMonthBefore Then
ws.Rows(i).Delete
lastRow = lastRow - 1
i = i - 1
Else
Debug.Print "oneMonthBefore: " & oneMonthBefore
Debug.Print "Date in E column: " & ws.Cells(i, "E").Value
End If
Next i
End Sub
제가 현재 상황을 글로 잘 설명이 될지 모르겠는데요.
User 시트에는 파워쿼리를 통해 불러온 데이타가 있습니다.
그냥 매크로를 실행하면 단순하게
Clear로 지우고, RefreshAll로 새로고침 되고, 새로고침된 데이타 관련 편집 입니다.
그런데 매크로를 실행하면 Clear로 삭제가 된 상태에서 편집이 이루어지고, 그 이후에 셀에 데이타가 나옵니다.
셀에 데이타가 Clear된 상태에서 편집이 이루어지니 아무런 편집 작업도 되지 않고, 나중에 새로고침된 데이타만 나옵니다.
그래서 RefreshAll 바로 다음에 Doevents 를 넣어봤지만 마찬가지고요.
데이타는 200행도 안되는 적은 양이며 새로고침하는데 오랜 시간이 걸리는것도 아닙니다.
이게 이상한게
VBA에 중단점을 만들고 실행하거나 F8키를 통해 한줄한줄 실행하면 정상적으로 됩니다. 하지만 F5키로 한번에 실행하면 그럽니다.
혹시나 해서 RefreshAll 다음에 msgbox를 넣어 확인후 진행하도록 해봤지만 msgbox가 떠 있는 상태에서도 셀은 Clear된 상태입니다. 확인을 누르면 역시 Clear된 상태로 진행되어 마지막에 새로고침된 데이타가 표시됩니다.
무슨짓을 해도 새로고침된 데이타가 마지막에 셀에 나타납니다. 마치 RefreshAll이라는 명령은 Sub에서 그렇게 작동되도록 되어 있는건가 싶은 생각이 들정도인데요.
도무지 해결책이 보이지 않아 질문드립니다. |
|