VbComponents.제거가 항상 모듈을 제거하는 것은 아닙니다.
다른 프로젝트에서 가져온 기존 VBA 코드 모듈을 덮어쓰는 데 칩 피어슨의 코드를 사용하려고 합니다.원래 코드는 여기.
제가 보고 있는 특정 섹션은 다음과 같습니다.
With ToVBProject.VBComponents
.Remove .Item(ModuleName)
End With
이 .VBComponents.Remove
호출은 VBA 실행이 중지된 후에만 실제로 적용되는 경우가 있습니다. 즉, 삭제 작업은 모든 문이 완료되거나 코드가 중단점에 도달한 후 디버깅을 중지할 때까지 적용되지 않습니다.은 새 할 때 .
Set VBComp = Nothing
Set VBComp = ToVBProject.VBComponents(CompName)
If VBComp Is Nothing Then
ToVBProject.VBComponents.import filename:=FName
Else
If VBComp.Type = vbext_ct_Document Then
'delete the module's code,
'import a temp module,
'copy over the temp module code,
'delete the temp module
End If
End If
모듈 삭제가 아직 유효하지 않아요.VBComp
그렇지 않습니다Nothing
아는 한, 가 입니다 입니다 가 .는..import
불리지 않을 겁니다
제가 댓글을 달더라도.if VBComp.Type = vbext_ct_document then
그리고.end if
떤이도존를게다새의rt다oegleeewo'te새es의존가도VBComp.Type
실행이 .즉,드이면은히고는다지할를다지는할t를즉,s,,nelolte이l면sd고은,히
이상한 점은 이러한 현상이 모든 모듈에서 일어나는 것이 아니라는 것입니다. 일부 모듈은 실제 삭제된 후 실시간으로 삭제됩니다.VBComponents.Remove
전화.
여러 포럼에서 이에 대한 다양한 게시물을 보았지만 만족스러운 해결책은 없었습니다.은그고을e다를 바꾸는 방법을 사용하고 ..Remove
호출 대상:
With ToVBProject.VBComponents
.Item(ModuleName).name = ModuleName & "_remove"
.Remove .Item(ModuleName & "_remove")
End With
그래서 이름을 바꾸면서ModuleName
하지 않는 것처럼 따라서더상는로며서지서며s로상는o지e더e .import
호출이 발생합니다.는론된이는을다이다de는s론,o 모듈이 없다고 가정합니다.ModuleName & "_remove"
실제로 존재합니다.
더 좋은 해결책이 있습니까?
이름 변경을 시도해보니 시트 모듈과 This Workbook에 문제가 생겼습니다.그래서 문서가 아닌 모듈만 이름을 바꾸려고 약간 수정했습니다.이것은 깨끗하게 작동하는 것 같습니다.
If .Item(ModuleName).Type <> vbext_ct_Document Then
.Item(ModuleName).Name = ModuleName & "_OLD"
.Remove .Item(ModuleName & "_OLD")
Else
.Remove .Item(ModuleName)
End If
이 질문은 오랜만에 하는 질문인데 제가 지금까지 언급하지 않았던 것을 생각해 낸 것 같습니다.
끝날 가 종료되도록 한 ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔApplication.onTime
.
그래서 예를 들면
Private Sub ImportModules()
With ThisWorkbook.VBProject.VBComponents
.Remove .Item(ModuleName)
Application.onTime Now + TimeValue("00:00:01"), tmpImportModules
End With
End Sub
Public Sub tmpImportModules()
With ThisWorkbook.VBProject.VBComponents
.Import filename:=FName
End With
End Sub
가 가 ThisWorkbook
그러면 엑셀은 모듈에 매달려서 삭제하지 않을 수도 있습니다.방법은 다음을 사용하여 Excel에서 전화를 숨기는 것입니다.Application.run("foo")
등의 직통 전화 대신에foo()
.
Excel 2010에서 나는 이것이 통했습니다.
저는 작동하는 트리거와 작동하지 않는 트리거를 알아보기 위해 코드 모듈을 제거/교체하는 데 끝없는 시간을 보냈습니다.
다른 워크북에서 코드 모듈 제거/교체
이것이 지금까지 가장 덜 문제가 되는 접근 방식이며, 이것이 제가 코드 모듈 관리(Code Module Management)로 구현한 이유입니다.여기서 아직 열리지 않은 워크북은 파일 대화상자에서 선택할 수 있도록 설정된 경우 워크북은 다음과 같이 열립니다.
Application.EnableEvents = False
....Open "workbook-fullname" ' selected in a file dialog
Application.EnableEvents = False
이전에 대상 워크북을 수동으로 열었을 때(따라서 열려 있는 워크북 목록으로 선택할 수 있도록 표시됨) VBA-Code가 실행되는 것을 막지 않았으므로(이를 달성할 수 있는 방법은 여기를 참조) 코드 모듈 관리가 작동하지 않습니다.물론 이는 Workbook_Open에서 코드를 실행할 때 발생하는 문제입니다.
나의 결론은:매크로(하위 프로시저, 기능 등)가 실행되면 VBA-Code의 복사본이 메모리에 저장됩니다.따라서 코드 모듈을 제거한 절차가 완료되기 전에는 제거 작업이 수행되지 않습니다.따라서 Import(가져오기)는 코드 모듈이 여전히 존재하는 것으로 간주하고 동일한 이름에 숫자 접미사가 있는 코드 모듈을 가져와 이름을 고유하게 만듭니다.그리고 물론 이런 경우는 항상...
'이 워크북'의 코드 모듈 제거/교체 *)
지금까지 저는 이를 달성할 방법을 찾지 못했습니다. 다른 코드 모듈에서 선언되지 않은 클래스 모듈을 제외하고는 말입니다. 하지만 우연히 알게 되었습니다!따라서 제거 전에 모든 선언을 일시적으로 언급하려고 했습니다.완전 성공!제거 및 가져오기가 정상적으로 작동했습니다.하지만 제가 마침내 이전에 언급된 선언 코드 줄의 주석을 해제하려고 했을 때, 엑셀은 항상 충돌했습니다(두 경우 모두 .DeleteLines and.).선과 를 삽입합니다.줄 바꾸기).저는 이에 대한 해결책을 찾지 못했기 때문에 적어도 당분간은 시도하는 것을 포기했습니다.
정리, 제거, 전송, 내보내기, 가져오기 및 동기화를 훨씬 덜 번거롭고 저장 및 신뢰할 수 있도록 하려면 코드 모듈 관리를 참조하십시오.전송 또는 제거를 위해 잘못된 '대상' 워크북을 선택해도 실행 취소 기능 때문에 드라마가 되지 않습니다.
*) ActiveWorkbook과 ThisWorkbook의 차이점은 여기서 중요합니다.이 워크북은 VBA 코드가 실행되는 워크북이고 Active Workbook은 다른 워크북일 수 있습니다.보통 둘 다 동일하기 때문에 차이에 주의를 기울이지 않아도 상관없습니다.
PowerPoint에 대해서도 동일한 문제가 있었지만, 이 솔루션은 VBA를 구현하는 모든 Microsoft Office 애플리케이션에 적용될 수 있을 것 같습니다.
문제가 발생한 후에는 더 이상의 문제가 발생하지 않았습니다.Remove
별도의 절차로:
Public Sub RemoveVBComponent(ioVBComponents As VBComponents, ioVBComponent As VBComponent)
Call ioVBComponents.Remove(ioVBComponent)
End Sub
내가 이렇게 불렀다는 건
With ToVBProject
Call RemoveVBComponent(.VBComponents,.VBComponents.Item(ModuleName))
End With
전에 이런 일을 겪은 적이 있습니다.'DoEvents' 명령은 종종 도움이 됩니다.한 번 해봤어요?
다른 경우에는 명령어를 do while loop에 넣고 부울을 사용하여 문제의 명령어가 성공했는지 지속적으로 확인했습니다.DoEvents 명령을 루프에 포함시켜야 하는 경우가 있습니다.
루프에 무언가를 넣어서 그렇게 많은 사이클이 지난 후에 그것이 포기하는 것을 기억하세요.무한한 고리에 갇히는 것은 성가실 수 있습니다.
저는 몇 달 동안 이 문제와 씨름해 왔고 마침내 Rob Bovey(http://www.apps-pro.com/) 덕분에 해결책을 찾았습니다.
비결은.Application.OnTime
코드 모듈을 삭제한 후 실행할 코드로 두 번째 프로시저를 호출하는 기능입니다.
Application.OnTime Now(), "Your_Procedure_Part2"
이는 VBA 코드가 중지되었다가 다시 시작되는 것을 모방하는 것으로 보입니다.호출 절차에서 이 행 뒤에 오는 코드는 실행되지 않습니다.
Chip Pearson이 말했듯이 워크북의 구성 요소를 충돌 없이 관리할 수 있는 유일한 방법은 다른 워크북 내의 코드를 사용하는 것입니다.추가 기능으로 사용하는 CompMan.xlam 워크북에 필요한 모든 것을 넣었습니다.워크북에서 간단한 코드 라인으로 저장할 때마다 모든 모듈을 내보낼 수 있습니다.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
#If DevTest Then
mCompMan.ExportAll ThisWorkbook
#End If
End Sub
이를 통해 다시는 VBA 작업을 수행하지 않으며 다른 워크북으로 가져올 수 있는 모듈도 있습니다.적어도 코드 작업을 위해 매크로가 포함된 워크북을 전용 폴더에 보관해야 한다고 덧붙여야 합니다.
저도 같은 문제가 있었습니다.제 경우 모듈의 프로시저가 실행 중일 때 .remove가 작동하지 않습니다.
그래서 다른 vb 컴포넌트와는 독립적인 업데이트 모듈을 만들었습니다.
언급URL : https://stackoverflow.com/questions/19800184/vbcomponents-remove-doesnt-always-remove-module
'programing' 카테고리의 다른 글
부트스트랩 팝업에 형태가 포함되어 있습니까? (0) | 2023.09.08 |
---|---|
해시 테이블을 문자열 배열로 변환하는 중 (0) | 2023.09.08 |
자동 필터를 추가하고 정렬하면 Excel이 충돌합니다. (0) | 2023.09.08 |
SQL 조건을 사용하여 두 테이블에서 데이터 가져오기 (0) | 2023.09.08 |
Jenkins Git 플러그인:특정 태그를 만드는 방법은? (0) | 2023.09.08 |