Страницы: 1
RSS
VBA. Callback / функция обратного вызова, Не соображу как реализовать. Подскажите.
 
Всем привет!

Подскажите как реализовать такое поведение в VBA
Код
// Запускаем функцию foo.
// Передаем ей ссылку на функцию обратного вызова,
// в которую будет передаваться текущее значение счетчика - "i"

foo( f unction( i ) {

    // тут мы получаем значение счетчика

});


// foo - функция, в кот. крутиться цикл.
// Каждую итерацию она вызывает другую функцию - "callback"
// и предает ей значение счетчика.

function foo( callback ) {
    for( var i = 0; i < 10; i +=1 ) {
        callback( i );
    }
}


Есть мысли с Application.Run, но пока додумать не могу.

Спасибо
Изменено: nerv - 23.01.2013 16:22:53
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Как-то так...
Код
Sub RunCallback()
    Call foo("DoSomething")
End Sub

Function foo(callback)
    Dim i As Integer
    For i = 1 To 10
        Application.Run Macro:=callback, Arg1:=i
    Next
End Function

Sub DoSomething(i)
    MsgBox i
End Sub
There is no knowledge that is not power
 
Johny, спасибо. По примеру: мне надо вернуть значение 10 раз не в DoSomething, а в RunCallback

Пока пришел к выводу, что это не возможно. Тут даже дело не в коллбеках, а в том, что в функции в js - это функции высшего порядка и они передаются по ссылке. Т.е. моя коллбек-функция из примера будет вызвана тамже, где объявлена и она будет видеть все переменные данной области.

Не удобно, блин...

Видимо, придется ограничится этим вариантом.

Смысл в том, что у меня будет видна x в коллбеке

Код
var x = 1;

foo( f unction( i ) {

    // тут мы получаем значение счетчика
    // x = 1

});
Изменено: nerv - 23.01.2013 16:44:28
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Надо чудок изменить RunCallback:
Код
Sub RunCallback()
    Dim v As Variant
    v = foo("DoSomething")
    MsgBox v
End Sub
There is no knowledge that is not power
 
Цитата
Johny пишет:
Надо чудок изменить RunCallback:
это ничего не даст  :)  Спасибо за участие, буду писать так, как предложил в этом посте. Я тоже ничего лучше не надумал ) Видимо, это максимум.

Очевидно, я изначально вопрос неверно сформулировал. Коллбек тут не при чем ) Он лишь одно из звеньев цепи, причем не главное.
Изменено: nerv - 23.01.2013 16:59:31
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Раз уж создал тему, то похоливарю немного  :)  Как "развернуть" вложенные циклы в функции / процедуры?
Код
Sub io()

    For x = 1 To 10
        For y = 1 To 10
            For z = 1 To 10
            
            Next
        Next
    Next

End Sub

Циклы записаны условно. Внутри каждого из них выполняется множество операций.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Код
' только так?

Sub io()
    Call x
End Sub

Sub x()
    For i = 1 To 10
        Call y
    Next
End Sub

Sub y()
    For i = 1 To 10
        Call z
    Next
End Sub

Sub z()
    For i = 1 To 10
        ' do something
    Next
End Sub


p.s.: полоса с кнопками регулярно скрывается. Т.е. я как пользователь даже код тегами оформить не могу
Изменено: nerv - 23.01.2013 17:23:51
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
так вроде получше

Код
Sub io()
    Dim data

    data = x()
    data = y(data)
    data = z(data)
End Sub

Function x()
    For i = 1 To 10
    Next
    x = data
End Function

Function y(data)
    For i = 1 To 10
    Next
    y = newData
End Function

Function z(data)
    For i = 1 To 10
    Next
    z = newData
End F unction
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх