Страницы: 1
RSS
Отладка процедур обработки событий
 
Здравствуйте всем.
Хочу вот какой вопрос уточнить: когда используешь private sub на листе (например, selectionchange), и его вроде как нельзя проверить пошагово (через f8). Поэтому я в private sub пишу указание на макрос, который нужно запустить, а сам макрос пишу в модулях (у там уже нормально пошагово выполнение проверяю).
Но такой подход периодически какие-то подвисания дает, от которые только закрытие экселя помогает.
Подскажите, можно ли так делать, или я что-то не догоняю?
Спасибо.
 
Цитата
Евгений написал:
когда используешь private sub на листе (например, selectionchange), и его вроде как нельзя проверить пошагово (через f8).
Почему нельзя? Можно.
Цитата
Евгений написал:
а сам макрос пишу в модулях...
А где же их ещё писать? )
 
не догоняете
с точки зрения возможностей использования отладки ни у Private Sub ни у Sub нет НИКАКИХ преимкуществ друг перед другом.

вот с точки зрения запустить по F8 - можно процедуру у которой нет параметров, а приват она при этом или просто саб - не важно
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Юрий М написал:
А где же их ещё писать? )
Так) я думал, что для выполнения действий типа Private Sub worksheet_selectionchange код надо писать в самом листе.
Ну и, соответственно, при нажатии f8 ничего не происходит.

На всякий случай, пример кода, написан в листе (sheet1), внутри microsoft excel objects
Код
Private Sub worksheet_change(ByVal activecell As Range)
    If Not Application.Intersect(activecell, Range("b3")) Is Nothing Then
    Set pt1 = ActiveSheet.PivotTables("ÑâîäíàÿÒàáëèöà1")
    delete_pt2
    Dim pvf As PivotField
        'clear row fields
        For Each pvf In pt1.RowFields
        pvf.Orientation = xlHidden
        Next pvf
        'choose table type
        sub_qwe
        'fill row field
        With pt1.PivotFields(qwe1)
        .Orientation = xlRowField
        .Position = 1
        End With
    Else: Exit Sub
    End If
End Sub


F8 не работает. Сам код работает. Если перенести в след.вид:
Код
Private Sub worksheet_change(ByVal activecell As Range)
worksheet_change  
End Sub

и все процедуры перенести в модуль, который назван worksheet_change (может, по-другому назвать надо), то периодически глючит. Вот и пытаюсь понять, какие фундаментальные знания у меня отсутствуют)
Изменено: Евгений - 08.05.2018 15:25:06
 
Добрый день,
Цитата
Евгений написал:
Вот и пытаюсь понять, какие фундаментальные знания у меня отсутствуют
Фундаментальные знания о процедурах и функциях с параметрами. Функцию с параметрами без передачи онных в VBA нельзя компилировать поэтапно (или всю целиком), пока не передадите в неё параметр.
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
ProFessor написал:
Фундаментальные знания о процедурах и функциях с параметрами. Функцию с параметрами без передачи онных в VBA нельзя компилировать поэтапно (или всю целиком), пока не передадите в неё параметр.
Круто, спасибо)) а можно пример передачи парамента (или ссылку), а то я не совсем понимаю, как этот вопрос гуглить даже...
 
простой примитивный пример:
Код
Sub start()
     x1 (1)
End Sub

Sub x1(ByRef a As Integer)
    MsgBox (a)
End Sub


Функция start в теле вызывает функцию x1 с целочисленным параметром "а".
В Вашем случае стоит событие на изменение листа(worksheet_change) которое передает активную ячейку как параметр.
Изменено: ProFessor - 08.05.2018 15:42:36
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
ProFessor написал:
простой примитивный пример
мне нужно это осознать, как применить... в любом случае спасибо.
 
есть преодопределенные процедуры, которые (для их нормальной работы) должны находиться СТРОГО в своих модулях, должны иметь СТРОГО определенное имя и СТРОГО определенные параметры

Вы еще и не понимаете что Вам пишут: (по поводу F8)
положите это в программый модуль
Код
Sub KorKvadrUr(A, B, C)
  Dim D
  D = B ^ 2 - 4 * A * C
  If D >= 0 Then MsgBox "Уравнение:  " & IIf(A <> 1, A, "") & "x^2" & IIf(B >= 0, " + ", " ") & B & "x" & IIf(C >= 0, " + ", " ") & C & " = 0" & _
  vbLf & vbLf & "Корни:" & vbLf & "X1 = " & (-B + D ^ (1 / 2)) / 2 / A & vbLf & "X2 = " & (-B - D ^ (1 / 2)) / 2 / A
End Sub

Sub Test()
  KorKvadrUr 1, 5, 3
End Sub

Private Sub Test2
  KorKvadrUr 1, 5, 3
End Sub
поставьте курсор в KorKvadrUr, жмите F8, работает?
поставьте курсор в Тест, жмите F8, работает?
поставьте курсор в Тест2, жмите F8, работает?
дело не в Приват, а дело в наличии параметров у процедуры
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Евгений написал:
мне нужно это осознать, как применить... в любом случае спасибо.
Вставьте, то что я написал в модуль (2 функции)
Кликните внутрь функции "start" и нажмите f9 (вы начнёте построчную компиляцию кода)
Далее нажимайте f9 и смотрите в  locals (окошко с переменными). Должно стать понятно.
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
Ігор Гончаренко написал:
поставьте курсор в KorKvadrUr, жмите F8, работает?поставьте курсор в Тест, жмите F8, работает?поставьте курсор в Тест2, жмите F8, работает?дело не в Приват, а дело в наличии параметров у процедуры
В korkvadrur f8 не работает. Спасибо за пример.

Применительно к моей задаче, selectionchange может быть прописан каким-то образом, чтобы позволять использование f8?
Цитата
Private Sub worksheet_selectionchange(ByVal activecell As Range)
   MsgBox activecell.Address
End Sub
 
Цитата
ProFessor написал:
Кликните внутрь функции "start" и нажмите f9 (вы начнёте построчную компиляцию кода)Далее нажимайте f9 и смотрите в  locals (окошко с переменными). Должно стать понятно.
мы же про f8 везде говорим? f9 - прерывание кода.
За locals отдельно спасибо, я и не знал о его существовании)
Правда, понятнее не стало. Locals просто показывает имеющиеся в модуле переменные, их тип и значение (посмотрел на примере Игоря).
 
ни каким
написанная другим способом процедура Private Sub worksheet_selectionchange - в лучшем случает перестанет работать как задумано (вообще перестанет срабатывать),  в худшем компилятор будет требовать от Вас написать ее как положено

а чтобы получить возможность ее тестировать в по-шаговом режиме:
1. напишите первой строкой в процедуре Stop
или
2. курсор в процедуру и F9 (редактор поставит точку останова в строке)
(собственно о F9 Вам уже писал ProFessor, читайте выше)
Изменено: Ігор Гончаренко - 08.05.2018 16:16:27
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ну тогда возвращаясь к первому вопросу (и уточняя его): private sub worksheet_selectionchange по своей сути не работает с пошаговым анализом с f8. Чем плох вынос в отдельный sub выполняемой процедуры? (поставил stop - f8 так же не работает, с прерываниями с f9 тоже не особо понятно, как именно).
 
среда разработки (редактор VBA) работает по заложенным в него правилам, Вы можете их освоить и научиться пользоваться, а можете капризничать и желать чтобы непременно работало по F8, только ничего с этого не получится! среда разаработки хоть и женского рода, но по сути своей это черствый, бездушный и бесчувственный яшик, зато работает согласно установленных правил.
а) F8 - работает в названной процедуре (см. #13, после того, как выполнение остановилось - жмите F8 и последовательно выполняйте строку за строкой)
б) но Вы не можете начать выполнять данную процедуру, нажимая F8 - как бы сильно Вам этогго не хотелось (это за пределакми логики, если у процедуры есть параметры необходимые для ее работы ее нужно вызвать с параметрами)
Изменено: Ігор Гончаренко - 08.05.2018 16:46:03
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Уважаемый Евгений! Есть замечательный сайт Дмитрия Щербакова, где подробно разъясняются вопросы, поднимаемые в этой теме.
Владимир
 
Спасибо большое за ссылку. Обязательно ознакомлюсь.

Ігор Гончаренко, спасибо за объяснения, и за пример особенно.
 
Цитата
Евгений написал:
private sub worksheet_selectionchange по своей сути не работает с пошаговым анализом с f8
Работает, только нужно сначала запустить эту процедуру, а она запускается по событию.

Цитата
Евгений написал:
поставил stop - f8 так же не работает,
Работает: поставьте Stop второй строкой, запустите процедуру и затем пошагово F8.
 
Событийную процедуру можно вызвать с параметром другой процедурой, а её уже гонять по F8 - т.е. пишите выше или ниже процедурку в 3 строки, и вперёд.
Если по какой-то причине ненавидите точки останова...
Например вот для той процедуры из https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=104466&TITLE_SEO=104466-ispolzovat-sub-v-private-sub&MID=863955#message863955 :
Код
Sub tt()
    worksheet_change [a10]
End Sub
Изменено: Hugo - 08.05.2018 18:59:20
 
И еще одно замечание (см. #4): имена стандартных модулей и макросов не должны пересекаться - это может вызвать проблемы.
Изменено: sokol92 - 08.05.2018 19:00:46
Владимир
 
Цитата
Евгений написал:
Но такой подход периодически какие-то подвисания дает,
И откуда у людей страсть к замене имени Target в штатной процедуре?
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print Target.Address
Debug.Print activecell.Address
End Sub

$F$1:$F$2
$F$1
Код
Private Sub Worksheet_Change(ByVal activecell As Range)
Debug.Print activecell.Address
Debug.Print activecell.Address
End Sub

$I$1:$I$2
$I$1:$I$2
Встроенный объект activecell мыши съели? Или только прикопали, и иногда откапывают?
 
Цитата
Юрий М написал:
Работает, только нужно сначала запустить эту процедуру, а она запускается по событию.
Что-то не понимаю... selectionchange - мышкой выбираю другую ячейку, событие запускается. Но F8 не работает... Что значит "запустить процедуру"?
 
Цитата
Евгений написал:
Что-то не понимаю... selectionchange - мышкой выбираю другую ячейку, событие запускается. Но F8 не работает... Что значит "запустить процедуру"?
Вам же написали :
Цитата
Юрий М написал:
Работает: поставьте Stop второй строкой, запустите процедуру и затем пошагово F8.
Что тут непонятного? Уже все разжевали и даже в рот положили, осталось только проглотить. :D
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Что тут непонятного?
я думал, кроме stop (или f9 в первой строчке, с этим понятно) еще есть вариант "нужно сначала запустить эту процедуру, а она запускается по событию"
в любом случае спасибо.
 
Я показал как можно запустить эту процедуру не по событию. Как Вы читаете?
 
Цитата
Евгений написал:
selectionchange - мышкой выбираю другую ячейку, событие запускается. Но F8 не работает... Что значит "запустить процедуру"?
Да, туго дело идёт... Событие наступило, процедура запустилась, и теперь можно прогнать её пошагово по F8.
Скажите, какая часть моего второго предложения теперь непонятна?
Страницы: 1
Наверх