Страницы: 1
RSS
Асинхронное выполнение операций
 
Всем доброго времени суток!  
 
Подскажите можно ли в VBA реализовать асинхронное выполнение процедур (макросов)?
 
В том смысле, что пока выполняется один, можно запустить и другой?
 
{quote}{login=Юрий М}{date=24.01.2010 05:55}{thema=}{post}В том смысле, что пока выполняется один, можно запустить и другой?{/post}{/quote}  
 
Совершенно верно...
 
{quote}{login=The_Prist}{date=24.01.2010 08:54}{thema=Re: Re: }{post}{quote}{login=lawlex}{date=24.01.2010 08:52}{thema=Re: }{post}Совершенно верно...{/post}{/quote}Совершенно никак...А позвольте полюбопытствовать: зачем?{/post}{/quote}  
 
Есть необходимость в фоновом режиме запускать процедуры, не подвешивая основное приложение, например, создавать в фоновом режиме документы word на основе данных из таблицы excel. Когда документ word создается один проблемы большой нет, когда документов уже 10 и больше, то проблема становится ощутимой.
 
А если попробовать переложить эту работу на Word?  
 
Макрос Excel создаёт копию таблицы в определенном месте диска, и запускает некий документ Word с макросом в автозапуске.  
Макрос ищет временную таблицу, и формирует на её основе документы.  
 
При этом Excel абсолютно не загружен.  
 
PS: Я бы просто оптимизировал макрос - для создания 10 файлов Word обычно достаточно и 2-3 секунд.
 
{quote}{login=EducatedFool}{date=24.01.2010 10:09}{thema=}{post}А если попробовать переложить эту работу на Word?  
 
Макрос Excel создаёт копию таблицы в определенном месте диска, и запускает некий документ Word с макросом в автозапуске.  
Макрос ищет временную таблицу, и формирует на её основе документы.  
 
При этом Excel абсолютно не загружен.  
 
PS: Я бы просто оптимизировал макрос - для создания 10 файлов Word обычно достаточно и 2-3 секунд.{/post}{/quote}  
 
Оптимизировать можно, но тогда потеряется большая часть функциональности, а этого бы не хотелось. Вообщем-то вопрос заключался не в том как мне ускорить работу Excel, а в том существует ли возможность в VBA запускать процедуры в фоновом режиме.  
Насколько мне известно, из любого приложения Microsoft Office можно вызывать функции Win32Api. Когда-то, давно читал, что через Win32API возможно реализовать асинхронный запуск команд, через поиск найти как это сделать мне удалось и возможно ли это в VBA?! Ответа пока нет, но что-то мне подсказывает, что если из VBA есть возможность вызывать функции Win32API, то значит и существует возможность запускать команды в фоновом режиме...
 
проще всего создать еще одну копию иксель:  
 
Set excel = New excel.Application  
 
загрузить туда копию вашего файла и запускать макросы там, тогда псевдомногозадачность будет осуществляться средствами widows..
Живи и дай жить..
 
но если нужно именно word-документы создавать, то таким же образом можно запустить и word, чего копии лишние плодить, и макрос поместить там же
Живи и дай жить..
 
{quote}{login=слэн}{date=25.01.2010 09:00}{thema=}{post}проще всего создать еще одну копию иксель:  
 
Set excel = New excel.Application  
 
загрузить туда копию вашего файла и запускать макросы там, тогда псевдомногозадачность будет осуществляться средствами widows..{/post}{/quote}  
 
Думаю, что ответ надо искать где-то здесь...  
 
http://kitkitch.narod.ru/articles/vbatut/21_ch_15.html  
 
Через обработку событий. Как в примере с созданием компонента-таймера.  
Таймер будет проверять в бесконечном цикле, переменную или пользовательский объект с параметрами запуска процедур. Правда вопрос насколько ресурсу будут загружены.  
Вообщем ушел пробовать...
 
Только создав новое приложение. Вы можете написать программу, запустите ее из VBA, а она будет порождать процессы какие только захотите, но все это будет за рамками текущего приложения Excel.    
 
А средствами VBA увы никак.
 
{quote}{login=McCinly}{date=25.01.2010 01:14}{thema=}{post}Только создав новое приложение. Вы можете написать программу, запустите ее из VBA, а она будет порождать процессы какие только захотите, но все это будет за рамками текущего приложения Excel.    
 
А средствами VBA увы никак.{/post}{/quote}  
 
А разве 1 приложение не будет ждать пока завершаться процедуры в новом?
 
Задачка действительно решается на примере таймера:  
 
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  
 
frmmain.frm:  
 
VERSION 5.00  
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} frmMain    
  Caption         =   "Пример реализации Таймера"  
  ClientHeight    =   3120  
  ClientLeft      =   45  
  ClientTop       =   435  
  ClientWidth     =   4710  
  OleObjectBlob   =   "frmMain.frx":0000  
  StartUpPosition =   1  'CenterOwner  
End  
Attribute VB_Name = "frmMain"  
Attribute VB_GlobalNameSpace = False  
Attribute VB_Creatable = False  
Attribute VB_PredeclaredId = True  
Attribute VB_Exposed = False  
Option Explicit  
 
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 не висит при работе бесконечного цикла...
Страницы: 1
Читают тему
Наверх