2014-01-21 4 views
0

VBA 모듈에서 사용할 수있는 3 개의 다른 하위가 있으며 VBA 단추를 통해 활성화 된 고유 한 Sub에서 일련의 하위를 호출하려고합니다. 코드 실행 아래 한 번에 여러 개 실행 고유 VBA 하위의 하위

:

Sub Updateworkbook() 

Call Unprotectworkbook 
Call CopyAndPaste 
Call Protectworkbook 

End Sub 

처음 Sub Unprotectworkbook() 후이 실행되는 다른 Sub 호출 및 실행되지 않습니다. 왜 이런 일이 일어나는가? 참조 용 Unprotectworkbook() 하위 코드 아래

(변경 End Exit Sub에) 다음과 같이
Sub Unprotectworkbook() 

Dim myCount 
    Dim i 
    myCount = Application.Sheets.Count 
    Sheets(1).Select 
    For i = 1 To myCount 
     ActiveSheet.Unprotect "password" 
     If i = myCount Then 
      End 
     End If 
     ActiveSheet.Next.Select 
    Next i 

End Sub 
+1

코드가 정확합니다. 'Unprotectworkbook' sub에 무언가가있을 수 있으므로 질문에 코드를 추가해야합니다. 통합 문서에 코드 실행에 영향을 줄 수있는 이벤트가 있습니까? –

+0

'Unprotectworkbook' 코드를 보여줄 수 있습니까? –

+1

'서브'의 내용을 볼 수 없다면 질문에 대답하기가 어렵습니다. 그것은 눈을 가린 건초 더미에서 바늘을 찾는 것과 같습니다. – L42

답변

2

이 코드를 수정

Sub Unprotectworkbook() 

Dim myCount 
    Dim i 
    myCount = Application.Sheets.Count 
    Sheets(1).Select 
    For i = 1 To myCount 
     ActiveSheet.Unprotect "password" 
     If i = myCount Then 
      Exit Sub 
     End If 
     ActiveSheet.Next.Select 
    Next i 

End Sub 

또는 당신은 단순히 다음 단계로 변경할 수 있습니다 :

Sub Unprotectworkbook() 
    Dim sh 
    For Each sh In Sheets 
     sh.Unprotect "password" 
    Next 
End Sub 
1

대답하기가 어렵습니다. 모든 세 가지 하위에있는 코드를 보지 않고 질문하십시오. 하지만

일부 포인터 : - 단지 대신 for 루프에서 Sheet(i).Unprotect "password"를 사용

  1. 당신은 그것을 수정하기 위해 각각의 시트를 선택할 필요가 없습니다.

  2. 또한 for 루프가 있으므로 For i = 1 To myCount 문을 올바르게 정의한 경우 코드를 끝내야 할 필요가 없습니다. 즉, If i = myCount Then End 부분을 제거하십시오.

  3. 다음과 같이 For 루프를 정의 할 수 있습니다. For i = 1 To Application.Sheets.Count 코드를 단순화 한 다음 myCount 변수를 제거 할 수 있습니다.

  4. 오차를 최소화하기 위해 항상 변수를 데이터 유형으로 정의해야합니다 (예 : Dim i As Integer). 난 강력 VBA에 대한 자습서의 몇 가지를 실행하는 데 조언을

도 등 오타로 인한 혼란과 오류를 최소화하기 위해

  • 항상 각 모듈의 상단에 사용 Option Explicit, 주위에 제비 뽑기 다. 다음은 검색 할 때 첫 번째 것일 뿐이므로 시도하지 않았습니다. Excel VBA Basic Tutorial 1

  • 1

    이 방법이 도움이 될 경우 빈 항목을 먼저 테스트하기 위해 다른 3 개의 서브 세트를 만드는 것이 좋습니다. 그렇지 않으면 위의 다른 답변 중 하나를 사용하십시오.

    Sub msgTEST0() 'Call msgTEST0 
        Call msgTEST1 
        Call msgTEST2 
        Call msgTEST3 
    End Sub 
    
    
    Sub msgTEST1() 
        MsgBox "MSG1" & Space(10), vbQuestion 
    End Sub 
    
    Sub msgTEST2() 
        MsgBox "MSG2" & Space(10), vbQuestion 
    End Sub 
    
    Sub msgTEST3() 
        MsgBox "MSG3" & Space(10), vbQuestion 
    End Sub