Задачка действительно решается на примере таймера:
cTimer.cls:
VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END Attribute VB_Name = "cTimer" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = False Attribute VB_Exposed = True Option Explicit Dim intInterval As Long Public Event Tick() Dim fStop As Boolean Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Property Get Interval() As Long Interval = intInterval End Property
Public Property Let Interval(i As Long) intInterval = i End Property
Public Sub StartTimer() fStop = False MainCycle End Sub
Public Sub StopTimer() fStop = True End Sub
Private Sub MainCycle() Do 'Sleep intInterval DoEvents RaiseEvent Tick Loop Until fStop = True End Sub
Dim index As Integer Dim intPicturesCount As Integer Dim WithEvents tmrMain As cTimer Attribute tmrMain.VB_VarHelpID = -1
Private Sub UserForm_Initialize() Label1.Caption = 1 Set tmrMain = New cTimer tmrMain.Interval = 1000 End Sub
Private Sub UserForm_Terminate() Set tmrMain = Nothing End Sub
Private Sub cmdStart_Click() tmrMain.StartTimer End Sub
Private Sub cmdStop_Click() tmrMain.StopTimer End Sub
Private Sub tmrMain_Tick() On Error GoTo ErrClear Label1.Caption = CInt(Label1.Caption) + 1 Label1.Visible = True Exit Sub ErrClear: Label1.Caption = 1 End Sub
modMain.bas:
Attribute VB_Name = "modMain" Option Explicit
Public Sub start_timer_form() frmMain.Show 0 End Sub
запускать надо через процедуру start_timer_form. Тогда наглядно видно, что Excel не висит при работе бесконечного цикла...
{quote}{login=McCinly}{date=25.01.2010 01:14}{thema=}{post}Только создав новое приложение. Вы можете написать программу, запустите ее из VBA, а она будет порождать процессы какие только захотите, но все это будет за рамками текущего приложения Excel.
А средствами VBA увы никак.{/post}{/quote}
А разве 1 приложение не будет ждать пока завершаться процедуры в новом?
Через обработку событий. Как в примере с созданием компонента-таймера. Таймер будет проверять в бесконечном цикле, переменную или пользовательский объект с параметрами запуска процедур. Правда вопрос насколько ресурсу будут загружены. Вообщем ушел пробовать...
Есть необходимость в фоновом режиме запускать процедуры, не подвешивая основное приложение, например, создавать в фоновом режиме документы word на основе данных из таблицы excel. Когда документ word создается один проблемы большой нет, когда документов уже 10 и больше, то проблема становится ощутимой.