2014-01-21 5 views
0

У меня есть три разных Subs, доступных в модуле VBA, и вы хотите вызвать эти серии Subs из уникального Sub, активированного с помощью кнопки VBA.Запуск сразу нескольких подписей от уникального VBA Sub

Ниже код, выполняющийся:

Sub Updateworkbook() 

Call Unprotectworkbook 
Call CopyAndPaste 
Call Protectworkbook 

End Sub 

После первого Sub Unprotectworkbook() запускается другой Sub не вызывается и выполняется. Почему это происходит?

Ниже Unprotectworkbook() Суб код для справки

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» может быть что-то, поэтому вам нужно добавить его в свой вопрос. Существуют ли какие-либо события в вашей книге, которые повлияют на выполнение кода? –

+0

Можете ли вы показать код «Unprotectworkbook»? –

+1

трудно ответить на ваш вопрос, если мы не можем видеть содержимое ваших 'subs'. это похоже на поиск иглы в сеноваде с завязанными глазами. – L42

ответ

2

Измените код следующим образом (изменение 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 
      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

Очень сложно ответить ваш вопрос, не видя кода во всех трех субмаринах.

Некоторые указатели хотя:

  1. Вам не нужно, чтобы выбрать каждый лист, чтобы изменить его - просто использовать Sheet(i).Unprotect "password" в цикл вместо.

  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.

  5. Всегда использование Option Explicit в верхней части каждого модуля, а также свести к минимуму путаницу и ошибки, вызванные опечатками и т.д.

Я настоятельно советую вам бежать через пару учебников по VBA, там много вокруг. Следующее - это только первое, когда я искал, я не пробовал: 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 
Смежные вопросы