Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2009, 20:06   #1
Ples
 
Регистрация: 01.04.2009
Сообщений: 4
По умолчанию Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается.

У меня целый день работает макрос в одной книге - собирает статистику из биржевого терминала. Я не могу одновременно работать в другом файле. Когда я нахожусь в другом файле, в момент очередного обновления данных и исполнения макроса, вылетает ошибка - либо Error9, либо Error1004.
А нужно, чтобы макрос крутился непрерывно параллельно с другой работой.

Макрос запускается с помощью обработки события Private Sub Worksheet_Calculate(). Макрос копирует статистику на соседний лист.

В прикрепленных файлах пример. Макрос находится в Книге1. Открываем обе книги и переходим в книгу 2. Имитируем ситуацию. В книге 2 меням значение в ячейке А1 и в Книге 1 запускается макрос. Но вылетает ошибка.

Private Sub Worksheet_Calculate()
Workbooks("Книга1").Worksheets("Л1" ).Range("E1:E2").Select
Selection.Copy
Range("E3:E4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub

Чем можете , подскажите плиз, а то получается, что если работает макрос, то больше ничего на компе делать нельзя.
спс
Вложения
Тип файла: rar Documents.rar (13.7 Кб, 34 просмотров)

Последний раз редактировалось Ples; 01.04.2009 в 22:35.
Ples вне форума Ответить с цитированием
Старый 02.04.2009, 01:58   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Замените свой макрос на этот код:
Код:
Private Sub Worksheet_Calculate()
    Me.[e1:e2].Copy Me.[e3:e4]
End Sub
Или, если надо копировать только значения ячеек (копирование форматирования ячеек недопустимо), используйте такой вариант:
Код:
Private Sub Worksheet_Calculate()
    Me.[e1:e2].Copy: Me.[e3:e4].PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 02.04.2009, 21:26   #3
Ples
 
Регистрация: 01.04.2009
Сообщений: 4
По умолчанию

Спасибо. Проверил. На Книгах из примера работает, не виснет.
Но не могу продолжить логику. Не пойму как применить "Me." к листам???
Мне нужно, чтобы когда макрос в своей книге переходит с одного листа на другой, а я в это время нахожусь в другой книге, чтобы процесс не зависал.
спс

Вот эта часть у меня находится на Листе1
Private Sub Worksheet_Calculate()
Application.ScreenUpdating = False
ГлобальныйМодульМой
Application.ScreenUpdating = True
End Sub
= = =

А вот эта в Module1
Sub ГлобальныйМодульМой()
Sheets("Текущf").Select !!! ИЛИ здесь зависает ! ! !
If Range("M9") = "1" Then !!! ИЛИ ЗДЕСЬ зависает ! !

Range("E11:E12").Select
Selection.Copy
Range("F11:F12").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range("P6:P11").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Сигма").Select
Range("C6:C11").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

еще раз спс

Последний раз редактировалось Ples; 03.04.2009 в 11:08.
Ples вне форума Ответить с цитированием
Старый 06.04.2009, 13:05   #4
Ples
 
Регистрация: 01.04.2009
Сообщений: 4
По умолчанию

Уважаемые!
У кого-либо есть опыт работы сразу двух разных макросов.
Ну, например, один что-либо долго считает или заполняет 1000 карточек, а в это время в другом файле другой макрос делает совсем другую работу.
Ну или пока один макрос что-то считает, мы руками что-либо делаем в другом файле.
Ples вне форума Ответить с цитированием
Старый 06.04.2009, 13:42   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Ну или пока один макрос что-то считает, мы руками что-либо делаем в другом файле
Многое зависит от самого макроса.
Если макрос написан корректно, он нисколько не мешает работе в другом файле.

Чтобы всё работало, надо:
1) убрать все Select и Activate из кода. (они там абсолютно не нужны)
2) придётся отказаться от Application.ScreenUpdating = False
3) Обязательно использовать оператор Doevents - чтобы макрос время от времени передавал управление операционной системе (которая должна обработать ваши действия типа нажатия кнопок)

А Ваш макрос можно значительно упростить: (если при этом не переключаться на другую книгу)
Код:
Sub ГлобальныйМодульМой()
    If Sheets("Текущий").Range("M9") = 1 Then
        Sheets("Текущий").Range("E11:E12").Copy Sheets("Текущий").Range("F11:F12")
        Sheets("Текущий").Range("P6:P11").Copy Sheets("Сигма").Range("C6:C11")
    End If
End Sub
Цитата:
Ну, например, один что-либо долго считает или заполняет 1000 карточек
Если макрос написан правильно, и комп не очень древний, эти 1000 карточек можно заполнить за секунду.

Цитата:
Не пойму как применить "Me." к листам???
Помещаете код в модуль ЭтаКнига, тогда можно будет записать макрос в таком виде:
Код:
Sub ГлобальныйМодульМой()
    If Me.Sheets("Текущий").Range("M9") = 1 Then
        Me.Sheets("Текущий").Range("E11:E12").Copy Me.Sheets("Текущий").Range("F11:F12")
        Me.Sheets("Текущий").Range("P6:P11").Copy Me.Sheets("Сигма").Range("C6:C11")
    End If
End Sub

Или так в любом другом модуле: (в таком виде макрос не помешает вам работать с другими книгами)
Код:
Sub ГлобальныйМодульМой()
    With Workbooks("ИмяМоейКниги.xls").Worksheets("Текущий")
        If .[M9] = 1 Then
            .[E11:E12].Copy .[F11:F12]
            .[P6:P11].Copy Workbooks("ИмяМоейКниги.xls").Worksheets("Сигма").[C6:C11]
        End If
    End With
End Sub

Последний раз редактировалось EducatedFool; 06.04.2009 в 13:49.
EducatedFool вне форума Ответить с цитированием
Старый 06.04.2009, 15:10   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

чтобы не мешало работать, макрос должен быть "быстрым"
или, как сказано выше, разделить его на части операторами doevents

а копирование данных быстрее всего чисто vbaшными методами:

range()=range().value
slan вне форума Ответить с цитированием
Старый 16.04.2009, 10:58   #7
Ples
 
Регистрация: 01.04.2009
Сообщений: 4
По умолчанию

Спасибо. Вроде получилось. Теперь позволяет работать в других книгах Еxcel.
Но
1. Вылетаетп о ошибке при запуске Outlook. Это и раньше было.

2. Не получилось разместить макрос в модуле "Этакнига". т.к. генерируемое на листе "Текущий" событие не видит "ГлобальнымодульМой", если он лежит в "Этойкниге"
Использовал вот эту идею.
Sub ГлобальныйМодульМой()
With Workbooks("ИмяМоейКниги.xls").Works heets("Текущий")
If .[M9] = 1 Then
.[E11:E12].Copy .[F11:F12]
.[P6:P11].Copy Workbooks("ИмяМоейКниги.xls").Works heets("Сигма").[C6:C11]
End If
End With
End Sub
Может еще что не понял?

2. ???????????????? Скажите, плиз,
"DoEvents",
как я понял открывает временные окна для операционки. А вот эта штука
"Application.EnableEvents = True" снимает запрет реагировать на События.
Так как они пишутся очень похоже, скажите, а "DoEvents" - это случайно не "конец всех ограничений"? Может он тоже разрешает события?
Ples вне форума Ответить с цитированием
Старый 16.04.2009, 11:07   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Вылетаетп о ошибке при запуске Outlook. Это и раньше было
Тут мы Вам ничем помочь не сможем, не увидев файл.
Те файлы, которые прикреплены к посту #1, не должны вызывать появление сообщения об ошибке.
Скорее всего, какой-то из ваших макросов пытается работать с почтой.
Не увидев кода этого макроса, посоветовать что-либо затруднительно.

Цитата:
Не получилось разместить макрос в модуле "Этакнига"
Ну так создайте стандартный модуль, и поместите код в него.

Цитата:
Скажите, плиз, "DoEvents", как я понял открывает временные окна для операционки.
Ну что-то вроде этого.
Точнее, этот оператор временно передаёт управление операционной системе, чтобы та успела сделать свои дела (обработать нажатия клавиш и т.д. и т.п.)
Цитата:
Может он тоже разрешает события?
Нет, события он не разрешает.
А вот Application.EnableEvents = True - разрешает.
"конец всех ограничений" присутствует только лишь в виде дорожных знаков.
Разработчики excel до этого ещё не додумались.
EducatedFool вне форума Ответить с цитированием
Старый 17.12.2016, 18:15   #9
Toxanter
Новичок
Джуниор
 
Регистрация: 17.12.2016
Сообщений: 1
Вопрос

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Многое зависит от самого макроса.
Если макрос написан корректно, он нисколько не мешает работе в другом файле.

Чтобы всё работало, надо:
1) убрать все Select и Activate из кода. (они там абсолютно не нужны)
2) придётся отказаться от Application.ScreenUpdating = False
3) Обязательно использовать оператор Doevents - чтобы макрос время от времени передавал управление операционной системе (которая должна обработать ваши действия типа нажатия кнопок)

А Ваш макрос можно значительно упростить: (если при этом не переключаться на другую книгу)
Код:
Sub ГлобальныйМодульМой()
    If Sheets("Текущий").Range("M9") = 1 Then
        Sheets("Текущий").Range("E11:E12").Copy Sheets("Текущий").Range("F11:F12")
        Sheets("Текущий").Range("P6:P11").Copy Sheets("Сигма").Range("C6:C11")
    End If
End Sub

Если макрос написан правильно, и комп не очень древний, эти 1000 карточек можно заполнить за секунду.



Помещаете код в модуль ЭтаКнига, тогда можно будет записать макрос в таком виде:
Код:
Sub ГлобальныйМодульМой()
    If Me.Sheets("Текущий").Range("M9") = 1 Then
        Me.Sheets("Текущий").Range("E11:E12").Copy Me.Sheets("Текущий").Range("F11:F12")
        Me.Sheets("Текущий").Range("P6:P11").Copy Me.Sheets("Сигма").Range("C6:C11")
    End If
End Sub

Или так в любом другом модуле: (в таком виде макрос не помешает вам работать с другими книгами)
Код:
Sub ГлобальныйМодульМой()
    With Workbooks("ИмяМоейКниги.xls").Worksheets("Текущий")
        If .[M9] = 1 Then
            .[E11:E12].Copy .[F11:F12]
            .[P6:P11].Copy Workbooks("ИмяМоейКниги.xls").Worksheets("Сигма").[C6:C11]
        End If
    End With
End Sub
EducatedFool, приветствую.
Решал тут свою задачу, столкнулся с подобной проблемой.
Здесь вставляются заодно и формулы
Код:
Sheets("Текущий").Range("E11:E12").Copy Sheets("Текущий").Range("F11:F12")
В начале вы писали, что если нужны только значения, то подойдет
Код:
Private Sub Worksheet_Calculate()
    Me.[e1:e2].Copy: Me.[e3:e4].PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub
Данный код не будет нарушать параллельную работу макросов в других книгах если в них тоже используются Copy & Paste?

Последний раз редактировалось Toxanter; 17.12.2016 в 18:52.
Toxanter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заставить работать макрос при защите листа qwertyuzer Microsoft Office Excel 4 11.02.2009 15:20
Не работает макрос при обновлении ячеек в реальном времени из другой книги Maxx Microsoft Office Excel 3 12.01.2009 11:42
Как запустить макрос при изменении другой книги Excel? Град Microsoft Office Excel 12 10.06.2008 10:01
как заставить работать макрос при определенном значении ячейки? Град Microsoft Office Excel 5 30.05.2008 16:06