Active Workbook까지 기다립니다.Refresh All 완료(VBA)
액티브 워크북을 호출하는 서브가 있습니다.Refresh All: XML 원본에서 새 데이터를 가져온 후 여러 번 변경합니다.문제는 RefreshAll 명령어가 완료될 때까지 충분한 시간이 주어지지 않기 때문에 다음 서브 및 함수가 올바르게 실행되지 않고 반복된 행이 올바르게 지워지지 않는다는 것입니다.
어플리케이션을 사용해 보았습니다.대기 및 슬립 기능은 새로 고침 프로세스도 일시 중지하는 것 같습니다.나머지 코드는 새로 고침 프로세스가 완료될 때까지 기다렸다가 실행하기만 하면 됩니다.
이 구현 방법에 대한 의견이 있으십니까?지금은 RefreshAll을 호출하지 않는 것만으로 해결할 수 있었습니다.이것에 의해, 후에 실행하는 2번째 플로우를 실장할 수 있게 됩니다만, 이것은 좋은 회피책이 아닙니다.
이 중 명확하지 않은 부분이 있으면 알려주세요.감사해요.
편집 그래서 아래 게시글에서 몇 가지 제안을 해 봤는데, 이것이 제가 생각해낸 것입니다."기록 매크로"를 수행한 후 테이블 속성에서 "배경 새로 고침 사용"을 선택 취소해도 아무 결과도 발생하지 않습니다.그 후 리프레쉬도 했어요.이는 기록된 매크로의 결과입니다.
With ActiveWorkbook.Connections("XMLTable")
.Name = "XMLTable"
.Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh
ActiveWorkbook 클래스.연결에는 BackgroundQuery 옵션이 없으므로 False로 설정할 수 있습니다.좋은 생각 있어요?
확실히 해두기 위해서.이것은 Excel이 테이블로 Import하는 웹 사이트에서 호스트되는 XML 파일입니다.그런 다음 데이터를 피벗과 다른 것으로 호출합니다.여기서의 목표는 웹 사이트에서 테이블로의 Import 프로세스가 다른 명령을 실행하기 전에 완료될 수 있도록 하는 것입니다.감사해요.
EDIT2: 조금 더 조사한 결과 다음 페이지가 발견되었습니다.http://www.mrexcel.com/forum/excel-questions/564959-execute-code-after-data-connection-refresh-finished.html XML 유형의 연결에는 BackgroundQuery 부울이 없는 것 같습니다.이 옵션은 xlConnection 유형인 ODBC 및 OLEDB 연결에만 사용할 수 있습니다.TypeODBC 및 xlConnection각각 타입 OLEDB.사용하고 있는 XML 접속은 xlConnection 타입입니다.BackgroundQuery 옵션이 없는 TypeXMLMAP.여기서 어디로 가야 할지 아는 사람 있어요?현시점에서는 엑셀 시트에 두 개의 매크로버튼을 별도로 만드는 것밖에 생각하고 있지 않습니다.하나는 새로고침용이고 다른 하나는 데이터 수정용입니다만, 이 옵션은 마지막까지 사용하고 싶습니다.
저도 같은 문제가 있었습니다만, 데이터 접속이 백그라운드 리프레쉬가 유효하게 되어 있기 때문에, DoEvents는 도움이 되지 않았습니다.대신 Wayne G를 사용합니다. Dunn의 답변은 출발점으로서 다음과 같은 솔루션을 개발했습니다.이 솔루션은 저에게 매우 적합합니다.
Sub Refresh_All_Data_Connections()
For Each objConnection In ThisWorkbook.Connections
'Get current background-refresh value
bBackground = objConnection.OLEDBConnection.BackgroundQuery
'Temporarily disable background-refresh
objConnection.OLEDBConnection.BackgroundQuery = False
'Refresh this connection
objConnection.Refresh
'Set background-refresh value back to original value
objConnection.OLEDBConnection.BackgroundQuery = bBackground
Next
MsgBox "Finished refreshing all data connections"
End Sub
MsgBox는 테스트 전용으로 코드가 대기하면 삭제할 수 있습니다.
또, 포커스가 변경되었을 경우에 대비하여 코드가 있는 워크북을 대상으로 하기 때문에, 액티브 워크북보다 This Workbook을 선호합니다.십중팔구 이것은 문제가 되지 않겠지만, 나는 다소 조심하고 싶다.
편집: xlConnection 사용에 대한 편집 내용을 방금 확인했습니다.BackgroundQuery 옵션이 없는 TypeXMLMAP 연결입니다. 죄송합니다.OLEDBC Connection 타입을 갱신하는 방법을 찾고 있는 분(저와 같은 분)을 위해 상기 사항을 남겨둡니다.
단, @Wayne G.던이 암호를 줬어코드 붙이고 싶지 않을 때는 이쪽입니다.백그라운드 새로고침을 비활성화하려면 이 체크박스를 꺼야 합니다.
면책사항: 아래 코드는 일부 크래시를 캐싱한 것으로 알려졌습니다.조심해서 사용하세요.
Excel 2010 이상에서의 이 답변에 따르면
CalculateUntilAsyncQueriesDone합니다.
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
모든 쿼리에 대해 "백그라운드 새로 고침"을 해제해야 합니다.백그라운드 새로고침이 켜져 있는 경우 새로고침이 발생하고 문제가 발생하는 동안 Excel이 계속 작동합니다.
[ Data ] > [ Connections ]> [ Properties ]> (체크박스를 끄면) 백그라운드 새로고침이 활성화됩니다.
다음은 http://www.mrexcel.com/forum/excel-questions/510011-fails-activeworkbook-refreshall-backgroundquery-%3Dfalse.html에서 찾을 수 있는 솔루션입니다.
모든 피벗캐시의 백그라운드쿼리 속성을 False로 설정하거나 워크북의 모든 피벗캐시를 루프합니다.
Code:
For Each pc In ActiveWorkbook.PivotCaches
pc.BackgroundQuery = False
pc.Refresh
Next
이렇게 하면 모든 피벗 캐시 백그라운드쿼리 속성이 false로 유지됩니다.다음과 같이 각 설정을 유지할 수 있습니다.
코드:
For Each pc In ActiveWorkbook.PivotCaches
originalBGStatus = pc.BackgroundQuery
pc.BackgroundQuery = False
pc.Refresh
pc.BackgroundQuery = originalBGStatus
Next
이 방법은 효과가 있었습니다.
ActiveWorkbook.refreshall
ActiveWorkbook.Save
워크북을 저장할 때 새로 고침을 완료해야 합니다.
이상적이지 않을 수 있지만 "어플리케이션"을 사용해 보십시오.OnTime"은 모든 리프레시 프로세스가 완료될 때까지 나머지 코드의 실행을 일시 정지합니다.의 실행을 일시 정지합니다.
새로 고침 목록의 마지막 테이블이 새로 고침이 완료되었음을 나타내는 플래그만으로 구성된 가짜 테이블이라면 어떻게 하시겠습니까?이 테이블은 절차 시작 시 "Application"을 사용하여 삭제됩니다.OnTime"은 15초마다 실행되며 가짜 테이블이 채워져 있는지 확인합니다.입력되어 있는 경우는, 「어플리케이션」을 종료합니다.OnTime" 체커를 켜고 나머지 절차를 계속 진행합니다.
좀 이상하긴 하지만 잘 될 거야
실행 시도:
ActiveSheet.Calculate
컨트롤 버튼이 데이터 세트의 값을 변경하는 워크시트에서 사용합니다.클릭할 때마다 Excel이 이 명령을 실행하고 그래프가 즉시 업데이트됩니다.
앞의 행이 처리를 완료하지 않아 VBA 코드의 일부 행이 실행에 어려움을 겪고 있을 때 도움이 된 트릭이 있습니다.앞의 행을 Sub에 넣습니다.이러한 회선을 실행하기 위해 Sub를 호출하면 후속 회선이 실행되기 전에 회선이 완료될 수 있습니다.저는 https://peltiertech.com/에서 이 기술을 배웠고 Windows 클립보드의 타이밍 문제를 해결하는 데 도움이 되었습니다.
Excel Web Query를 사용하지 않는 경우 URL을 별도의 Workbook으로 열어 볼 수 있습니다.이 경로로 이동하면 "배경 새로 고침 사용"을 해제한 경우와 마찬가지로 웹 요청이 완료되면 결과 데이터에 대해 작업할 수 있습니다.
단, Excel은 수신인 셀에 로드 메시지를 표시하거나 정지시키는 대신 요청 중에 진행 표시줄을 표시합니다.
다음 질문에 대한 답변을 참조하십시오.쿼리가 완료되면 Excel 웹 쿼리에서 데이터를 후처리하려면 어떻게 해야 합니까?
이 접근방식의 단점은 데이터 처리를 사용자가 직접 관리해야 한다는 것입니다.Excel에서는 데이터를 지정된 대상에 저장할 수 없습니다.
우리는 당신이 해왔던 것과 비슷한 일을 시도하다가 결국 이 길로 가게 되었습니다.
저는 같은 문제를 안고 있었고, 위의 모든 해결책을 시도해 보았지만 성공하지 못했습니다.저는 결국 전체 쿼리를 삭제하고 새로운 쿼리를 생성하여 문제를 해결했습니다.
새로운 것은 동작하지 않는 것과 같은 설정입니다(단순히 복사한 것과 같은 쿼리 정의입니다).
이게 왜 문제를 해결했는지 모르겠지만, 해결했어요.
위의 몇 가지 제안을 시도했는데, 저에게 가장 좋은 해결책은 각 연결에 대해 백그라운드 쿼리를 비활성화하는 것이었습니다.
With ActiveWorkbook.Connections("Query - DL_3").OLEDBConnection
.BackgroundQuery = False
End With
Microsoft Query의 경우 Connections --> Properties로 이동하여 Enable background refresh를 선택 해제할 수 있습니다.
이렇게 하면 새로 고침 실행 중에 발생하는 모든 작업이 중지됩니다.입력 시 데이터를 새로 고친 다음 새로 고친 데이터에 대해 사용자 양식을 실행해야 했습니다. 이 방법은 저에게 완벽하게 작동했습니다.
나도 비슷한 요구를 한 적이 있다.많은 테스트 결과, 심플하지만 그다지 우아하지 않은 솔루션을 발견했습니다(고객에게 효과가 있을지 어떨지 잘 모르겠습니다).
매크로 새로고침이 Excel이 가져오는 데이터인 후 "Calculate"라는 행을 매크로에 추가했습니다(일반적으로 계산을 수동으로 설정한 경우 워크북 재계산에 사용됩니다).
이 작업을 수행할 필요가 없지만 에 이 작업을 추가하면 Excel은 데이터가 새로 고쳐질 때까지 기다렸다가 매크로의 나머지 작업을 계속합니다.
저는 "BackgroundQuery:=False는 단독으로 동작하지 않지만 "DoEvents"를 추가하면 문제가 해결됨
.QueryTable.Refresh BackgroundQuery:=False
VBA.Interaction.DoEvents
바보같이 들릴지 모르지만 그게 최선이고 가장 쉬운 해결책이 될 수도 있어요.
엑셀 파일을 추가로 작성하셔야 합니다.비어 있을 수도 있습니다.또는 디렉토리의 다른 기존 Excel 파일을 사용할 수도 있습니다.
'시작'
Workbooks.Open("File_where_you_have_to_do_refresh.xlsx")
Workbooks("File_where_you_have_to_do_refresh.xlsx").RefreshAll
Workbooks.Open("Any_file.xlsx)
'Excell is waiting till Refresh on first file will finish'
Workbooks("Any_file.xlsx).Close False
Workbooks("File_where_you_have_to_do_refresh.xlsx").Save
또는 다음을 사용합니다.
Workbooks("File_where_you_have_to_do_refresh.xlsx").Close True
내 모든 파일들은 제대로 작동하고 있어.
이 문제를 해결하기 위해 제가 한 일은 워크북을 저장하는 것입니다.그러면 닫기 전에 강제로 새로 고쳐집니다.
다음 작업을 수행하기 전에 여러 공식을 복사할 때도 동일한 방법이 적용됩니다.
언급URL : https://stackoverflow.com/questions/22083668/wait-until-activeworkbook-refreshall-finishes-vba
'programing' 카테고리의 다른 글
| 프로젝트 빌드 시 코코아팟 오류 (0) | 2023.04.09 |
|---|---|
| 루비, 문자열에서 마지막 N자를 제거하시겠습니까? (0) | 2023.04.09 |
| PuTTY 세션목록을 내보내기 또는 Import하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
| git diff 파일을 어떻게 가져와 같은 저장소의 복사본인 로컬 브랜치에 적용합니까? (0) | 2023.04.09 |
| GitHub에서 커밋을 삭제하려면 어떻게 해야 하나요? (0) | 2023.04.09 |
