Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell / 25 сообщений из 44, страница 1 из 2
05.11.2010, 20:19
    #36939615
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Написал макрос, там в цикле перерисовывается диаграмма.

Как вставить кнопку остановки макроса, т.к. данных очень много и не всегда может быть желание дождаться конца.

Я кнопку нарисовал. В листе где она находиться прописал что делать когда она нажимается (может не правильно)

Код: plaintext
1.
2.
3.
Private Sub CommandButton1_Click()
i = LastRow
End Sub

Цикл в макросе задан следующим образом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    
   i =  0 
    

    Do While i < LastRow
    i = i +  1 
 
'  здесь идет перерисовка графика

    Loop

Как теперь внутрь цикла вставить, чтобы принажатии кнопки i становилось равным LastRow?

Заранее благодарен
...
Рейтинг: 0 / 0
05.11.2010, 20:24
    #36939617
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
вставить команду DoEvents в цикл (там, где у вас комментарий)
...
Рейтинг: 0 / 0
05.11.2010, 20:38
    #36939630
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro,

В общем сработало программа остановилась, но из-за ошибки :)

Код: plaintext
Object variable or Width block not set

Надо просто DoEvents написать или имя кнопки указать тоже ?
...
Рейтинг: 0 / 0
05.11.2010, 20:44
    #36939638
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarhShocker.Pro,

В общем сработало программа остановилась, но из-за ошибки :)

Код: plaintext
Object variable or Width block not set

Надо просто DoEvents написать или имя кнопки указать тоже ?

Покажите весь существенный код, включая определение переменных и укажите строку, на которой произошла ошибка
...
Рейтинг: 0 / 0
05.11.2010, 20:45
    #36939639
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
...
Рейтинг: 0 / 0
05.11.2010, 20:54
    #36939649
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Sub Anim()

    i =  0 
    
    LastRow = Range("A10").CurrentRegion.Rows.Count -  2 
    
    tdelay = Range("I2:I2").Value

    Range("F2:F2").Value = LastRow
    

    Do While i < LastRow
    i = i +  1 
    yy = i +  7 
    a = "=Data!R" & yy & "C3:R" & yy & "C20"
    b = "=Data!R" & yy & "C21:R" & yy & "C38"
    
    ActiveChart.SeriesCollection( [b]1 ).Values = a[/b] ' ошибка появляется здесь
    ActiveChart.SeriesCollection( 2 ).Values = b
    ActiveChart.PlotArea.Select

    y = Timer + tdelay
    Do While Timer < y
'    DoEvents
    Loop
    
    DoEvents
    
    Loop
   
End Sub

Перед запуском щелкаю на диаграмму которая потом перерисовывается, иначе выскакивает таже ошибка. Про явное указание типов переменных, я уже где-то читал, но здесь не стал заморачиваться, чтобы еще не искать как переменные с помощью Dim определяются :). Но здесь я так понимаю это не причем. Здесь видимо когда я щелкаю на кнопку диаграмма перестает быть активной и программа не знает к чему применить команду ActiveChart.SeriesCollection(1).Values (насколько я понял).

Я раньше встречал вот такую команду
Код: plaintext
Sheets("Data").ChartObjects( 1 ).Activate
, но я не знаю как посмотреть какой у меня номер диаграммы.
...
Рейтинг: 0 / 0
05.11.2010, 21:09
    #36939661
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro,

было несколько диаграм раньше, поэтому не знал какой номер сейчас добавил эту строчку все работает без выделения диаграммы в начале, но при нажатии кнопки программа не останавливается. Привожу конечный текст программы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Sub Anim()

    i =  0 
    
    LastRow = Range("A10").CurrentRegion.Rows.Count -  2 
    
    tdelay = Range("I2:I2").Value

    Range("F2:F2").Value = LastRow
    

    Do While i < LastRow
    i = i +  1 
    yy = i +  7 
    a = "=Data!R" & yy & "C3:R" & yy & "C20"
    b = "=Data!R" & yy & "C21:R" & yy & "C38"
    
    Sheets("Data").ChartObjects( 1 ).Activate
    ActiveChart.SeriesCollection( 1 ).Values = a
    ActiveChart.SeriesCollection( 2 ).Values = b
    ActiveChart.PlotArea.Select

    y = Timer + tdelay
    Do While Timer < y
'    DoEvents
    Loop
    
    DoEvents
    
    Loop
   
End Sub
...
Рейтинг: 0 / 0
05.11.2010, 21:14
    #36939665
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Вытащил
Код: plaintext
Sheets("Data").ChartObjects( 1 ).Activate
т.к. по моему эта команда даже не давала на кнопку нажать.

Теперь после нажатия кнопки вылетает ошибка

Метод Select из класса Area завершен не верно

и дебаг ссылается на эту строку
Код: plaintext
ActiveChart.PlotArea.Select
...
Рейтинг: 0 / 0
05.11.2010, 21:23
    #36939668
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarhПро явное указание типов переменных, я уже где-то читал, но здесь не стал заморачиваться
Но здесь я так понимаю это не причем

В результате переменная i тут:
Код: plaintext
1.
2.
Sub Anim()
    i =  0    
End Sub
и тут:
Код: plaintext
1.
2.
3.
Private Sub CommandButton1_Click()
i = LastRow
End Sub
это абсолютно разные переменные. И программированием второй вы ничего не добьетесь для первой.
Это ваша ошибка при работе с переменными.
Что же касается диаграмм мне сложнее дать совет, потому что я с ними очень мало работал.

ЗЫ: DoEvents - это дать возможность выполнить другие события, так что лучше вставьте во внутренний цикл.
...
Рейтинг: 0 / 0
05.11.2010, 23:41
    #36939783
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro alegarhПро явное указание типов переменных, я уже где-то читал, но здесь не стал заморачиваться
Но здесь я так понимаю это не причем

В результате переменная i тут:
Код: plaintext
1.
2.
Sub Anim()
    i =  0    
End Sub
и тут:
Код: plaintext
1.
2.
3.
Private Sub CommandButton1_Click()
i = LastRow
End Sub
это абсолютно разные переменные. И программированием второй вы ничего не добьетесь для первой.
Это ваша ошибка при работе с переменными.
Что же касается диаграмм мне сложнее дать совет, потому что я с ними очень мало работал.

ЗЫ: DoEvents - это дать возможность выполнить другие события, так что лучше вставьте во внутренний цикл.

Так я и хотел остановить цикл за счет того, что указал I = LastRow, т.к. i становиться равной LasRow и должна выйти из цикла, т.к. условие выполнения цикла пока i < LastRow
Код: plaintext
Do While i < LastRow
Я правильно понял, что это не сработает? Тогда как остановить цикл кнопкой?

C графиками вопросов не осталось все работает прекрасно, надо только как то научиться выходить из цикла по желанию :)
...
Рейтинг: 0 / 0
05.11.2010, 23:50
    #36939787
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarhЯ правильно понял, что это не сработает? Тогда как остановить цикл кнопкой?

это не сработает, потому что вы не хотите разбираться
- с оператором Dim
- с областями определения переменных
- с данным мной в FAQ советом
- в моем сообщении, в котором я сказал, что эти переменные "i" - это две разных переменных (так же, как и LastRow) и никакого отношения друг к другу не имеют
...
Рейтинг: 0 / 0
06.11.2010, 00:01
    #36939793
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro,

я посмотрю определение переменных, но что-то слишком сложно получается. Я решил использовать i = LasRow как самое простое, что мне на ум пришло, но может быть есть другой способ. Например, при нажатии кнопки просто завершить выполнение подпрограммы.

Что нить типа, если кнопка нажата, то какой-нить параметр становиться True и тогда я смогу вставить If в котором, при True I = LastRow.
...
Рейтинг: 0 / 0
06.11.2010, 00:19
    #36939804
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarh,

Ё-мое
я в третий раз вам повторяю, что проблема в том, что это РАЗНЫЕ переменные. Это неважно, что у них одинаковые имена, они определены в РАЗНЫХ процедурах.
Будет это LastRow или True - это неважно. Важно то, что переменная "i" в процедуре Anim не изменяется.
Чтобы она изменялась, вам нужно определить ее как глобальную или хотя бы на уровне модуля.

Если бы вы прочитали мою статью на ФАКе и последовали бы моему совету поставить Option Explicit, вы бы это уже давно поняли.
...
Рейтинг: 0 / 0
06.11.2010, 02:36
    #36939869
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro,

Спасибо, большое. Обязательно завтра прочитаю, как и говорил :)
...
Рейтинг: 0 / 0
06.11.2010, 11:40
    #36939987
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Флаг As Boolean
Public Sub Прерывание()
Флаг = True
Dim счёт As Double
Do
счёт = счёт +  1 
DoEvents
Loop While Флаг
MsgBox счёт
End Sub

Sub Кнопка1_Щелкнуть()
Флаг = False
End Sub
...
Рейтинг: 0 / 0
06.11.2010, 15:13
    #36940170
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.Pro alegarhЯ правильно понял, что это не сработает? Тогда как остановить цикл кнопкой?

это не сработает, потому что вы не хотите разбираться
- с оператором Dim
- с областями определения переменных
- с данным мной в FAQ советом
- в моем сообщении, в котором я сказал, что эти переменные "i" - это две разных переменных (так же, как и LastRow) и никакого отношения друг к другу не имеют

Прочитал я ваш FAQ только связи я никакой не вижу. Там же не написано как задать переменную чтобы она учавствовала в обоих подпрограммах. А это я как и писал уже раньше читал.
...
Рейтинг: 0 / 0
06.11.2010, 15:30
    #36940184
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarhПрочитал я ваш FAQ только связи я никакой не вижу. Там же не написано как задать переменную чтобы она учавствовала в обоих подпрограммах. А это я как и писал уже раньше читал.
то есть вы вместо того, чтобы последовать умному совету решили все-таки поспорить на абстрактные темы :)

как только у вас появился бы Option Explicit, у вас сразу бы возник вопрос к самому себе, куда написать Dim и вопрос был бы решен.

К тому же, ответ на него уже дал alex77755
...
Рейтинг: 0 / 0
06.11.2010, 15:32
    #36940187
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
вот нашёлся ещё один не знающий Оклиптик
...
Рейтинг: 0 / 0
06.11.2010, 15:38
    #36940190
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alex77755,

Спасибо, но теперь вообще работать перестало.

To All
Гляньте, пожалуйста, что я не туда вставил, т.к. из последнего примера у меня много не понятного было.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Sub Anim()

    Option Explicit
    
    Public Flag As Boolean
    Dim i, yy, LastRow As Integer, a, b, c As String
    Dim y, tdelay As Double
    
    i =  0 
    Flag = True
    
    LastRow = Range("A10").CurrentRegion.Rows.Count -  2 
    
    tdelay = Range("I2:I2").Value

    Range("F2:F2").Value = LastRow
    
    Sheets("Data").ChartObjects( 1 ).Activate
    
    Do While i < LastRow
    i = i +  1 
    yy = i +  7 
    a = "=Data!R" & yy & "C3:R" & yy & "C20"
    b = "=Data!R" & yy & "C21:R" & yy & "C38"
    
    ActiveChart.SeriesCollection( 1 ).Values = a
    ActiveChart.SeriesCollection( 2 ).Values = b
    ActiveChart.PlotArea.Select
    
    c = "=Data!R" & yy & "C2"
    Range("G4:G4").Value = c

    y = Timer + tdelay
    Do While Timer < y
'        DoEvents
    Loop

     DoEvents
    
    If (Flag = False) Then
        i = LastRow
    End If
    
    Loop
  
End Sub

Sub CommandButton1_Click() 'Раньше эта подпрограмма была в Sheet1 я её перенес в Modul3 тудаже где и соновная. Зря? 
    Flag = False
End Sub

Теперь запускаю и сразу ошибка Compile error: Invalid Inside procedure и Debag на первую строчку Sub Anim
...
Рейтинг: 0 / 0
06.11.2010, 15:40
    #36940194
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarh
Теперь запускаю и сразу ошибка Compile error: Invalid Inside procedure и Debag на первую строчку Sub Anim

1) Вам перевести ошибку?
2) Я ведь четко в факе написал:
авторНапишите в заголовке каждого своего модуля ( то есть перед всеми другими переменными, функциями и процедурами ):
Option Explicit

Если вы так внимательно будете слушать советы, вы эту, простенькую, в общем-то, задачу еще неделю решать будете
...
Рейтинг: 0 / 0
06.11.2010, 15:41
    #36940195
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarh, Вас это: прервать работу любого макроса можно парой клавиш Ctrl+Break
Не устраивает?
...
Рейтинг: 0 / 0
06.11.2010, 16:00
    #36940209
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.ProЕсли вы так внимательно будете слушать советы, вы эту, простенькую, в общем-то, задачу еще неделю решать будете
Также посмотрите внимательно, где alex77755 посоветовал вам определить переменную Flag и где вы ее определили.
...
Рейтинг: 0 / 0
06.11.2010, 16:01
    #36940211
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Shocker.ProShocker.ProЕсли вы так внимательно будете слушать советы, вы эту, простенькую, в общем-то, задачу еще неделю решать будете
Также посмотрите внимательно, где alex77755 посоветовал вам определить переменную Flag и где вы ее определили.
Также внимательно посмотрите синтаксис Dim
Код: plaintext
1.
    Dim i As Integer, yy As Integer, LastRow As Integer, a As String, b As String, c As String
    Dim y As Double, tdelay As Double
...
Рейтинг: 0 / 0
06.11.2010, 16:04
    #36940214
alegarh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
Ципихович Эндрю,

Вот это дельный совет :) C него и надо было начинать. Но не красиво как-то получается, ошибка выскакивает и т.п. Из любви к искуству хочеться сделать красиво :)

Я понимаю что это простенькая задача, но учитывая, что я первый раз позавчера вообще VBA открыл и с объектно-ориентированнм програмированием вообще не сталкивался, отсюда и все трудности.

Не знаю, я что тут напзывается процедурами и функциями. Включил автоматическую вставку Option Explicit, запустил Макрорекордер и тогда понял, что не туда вставил. Аналогом Option Explicit пользуюсь в фортране, но там она после заголовка программы вставляется вроде, на память не помню, всегда смотрю синтаксис по своим предыдущим програмкам.

Перевести я и сам могу только перевод мне ни о чем не говорит. "Неправильная внутренняя процедура". В общем поменял я все/ Заработало снова, но когда нажимаю кнопку стоп. Мне вылетает следующая ошибка Run Time Error 1004: Метод Select из класса PlotArea завершен не верно. Смысл было кнопку городить еслши все равно с ошибкой вылетает. Можно действительно Cntr+Breake и все :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Option Explicit
Public Flag As Boolean
    
Public Sub Anim()


    Dim i, yy, LastRow As Integer, a, b, c As String
    Dim y, tdelay As Double
    
    i =  0 
    Flag = True
    
    LastRow = Range("A10").CurrentRegion.Rows.Count -  2 
    
    tdelay = Range("I2:I2").Value

    Range("F2:F2").Value = LastRow
    
    Sheets("Data").ChartObjects( 1 ).Activate
    
    Do While i < LastRow
    i = i +  1 
    yy = i +  7 
    a = "=Data!R" & yy & "C3:R" & yy & "C20"
    b = "=Data!R" & yy & "C21:R" & yy & "C38"
    
    ActiveChart.SeriesCollection( 1 ).Values = a
    ActiveChart.SeriesCollection( 2 ).Values = b
    ActiveChart.PlotArea.Select    ' debug идет сюда
    c = "=Data!R" & yy & "C2"
    Range("G4:G4").Value = c

    y = Timer + tdelay
    Do While Timer < y
'        DoEvents
    Loop

     DoEvents
    
    If (Flag = False) Then
        i = LastRow
    End If
    
    Loop
   
End Sub
...
Рейтинг: 0 / 0
06.11.2010, 16:08
    #36940217
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell
alegarhМетод Select из класса PlotArea завершен не верно. Смысл было кнопку городить еслши все равно с ошибкой вылетает. Можно действительно Cntr+Breake и все :)

Если бы спрашивали, как остановить макрос, получили бы другой совет.

Я думаю, проблема в том, что как только вы уводите фокус с активной диаграммы на кнопку, у вас перестает быть актуальным объект ActiveChart. Замените его везде на:
Код: plaintext
Sheets("Data").ChartObjects( 1 )
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как вставить в макрос кнопку, чтобы останавливать цикл VBA Excell / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]