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

작성자:  

 나루토로 (bombz)

추천:  0
파일:     조회:  35
제목:   ReafreshAll 명령의 결과가 나중에 적용되는 문제
     
  * 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.

 - 엑셀 버전(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에서 그렇게 작동되도록 되어 있는건가 싶은 생각이 들정도인데요.
도무지 해결책이 보이지 않아 질문드립니다.
 
[불량 게시물 신고]  
캬~프리죄송합니다. 질문에 대한 답은 아닙니다. 20년 전에 제가 경험한 것과 같아서... 당시 doevent, srcreenupdate, timer 까지 써가며 해결해보려 했었는데 해결했는지는 기억이 잘 나질 않네요. 
비베에서는 잘 돌아갔는데 유독 vba에서 안되는 것은 당시에 개발환경의 차이라고 생각하고, 필요없는 개체나 함수 등을 넣고 우연을 기대했었던것 같습니다. 
답은 못 드렸지만 잘 해결되기 바랍니다.
04-23 (16:41)
삭제 ■신고
캬~프리doevent는 clear 뒤, refresh 뒤에도 쓰고, 
timer, screen..도 이벤트를 발생하니까 썻던 거 같아요...

04-23 (16:46)
삭제 ■신고
나루토로글 감사합니다.
저도 doevent, timer 다 시도해봤지만 안되더라고요.
다른 매크로로 만들어 마지막에 call로 해도 마찬가지고...
사실상 답이 없는 상태네요.
04-27 (17:17)
삭제 ■신고
        
  

작성일 : 2024-04-22(10:13)
최종수정일 : 2024-04-22(10:13)