Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel / 25 сообщений из 51, страница 1 из 3
10.11.2009, 12:05
    #36300763
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
У меня такой простой вопрос.
Как запустить цикл For с самого начала, если он не сработал в одном из нескольких условий?

У меня просто задачка, такая, программа высчитывает несколько вариантов ходов, а варианты выпадают рандомно, в начале цикла For. Нужно если выпавший вариант не подходит, цикл запускался снова и выдавал новый вариант.
...
Рейтинг: 0 / 0
10.11.2009, 12:10
    #36300778
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Код: plaintext
1.
If x <> y then GoTo 
?
...
Рейтинг: 0 / 0
10.11.2009, 12:13
    #36300791
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Вот такое одно из условий которое в случае если вариант хода не подходит, цикл отсюда должен запуститься вновь.
Код: plaintext
1.
2.
' проверка местоположения клетки потенциального хода
If var_x <  1  Or var_x >  8  Or var_y <  1  Or var_y >  8  Then  
...
Рейтинг: 0 / 0
10.11.2009, 12:17
    #36300808
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Код: plaintext
1.
2.
3.
4.
5.
 10 :
Randomize(z)
for...
next
If var_x <  1  Or var_x >  8  Or var_y <  1  Or var_y >  8  Then GoTo  10 
?
...
Рейтинг: 0 / 0
10.11.2009, 12:20
    #36300814
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Или так надо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub nn()

 10 :
For x =  1  To  10 
If x =  5  Then GoTo  10 
Next

End Sub

?
...
Рейтинг: 0 / 0
10.11.2009, 12:36
    #36300871
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Hugo121,

Выдает вот такую вот ошибку, на окончании условия
End If
...
Рейтинг: 0 / 0
10.11.2009, 12:38
    #36300876
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Hugo121,

Выдает теперь вот такую ошибку в окончании условия
End If
...
Рейтинг: 0 / 0
10.11.2009, 12:40
    #36300886
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Выражению If x = 5 Then GoTo 10
End If не нужен, не путай с
Код: plaintext
1.
2.
3.
If x =  5  Then
 GoTo  10 
End If
...
Рейтинг: 0 / 0
10.11.2009, 12:44
    #36300905
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Ну пример кода может и неудачен, он бесконечный, поэтому по Esc такое и покажет. Но ведь рабочий код не будет бесконечным, однажды x будет <> 5 :)
...
Рейтинг: 0 / 0
10.11.2009, 14:02
    #36301104
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Оформить цикл в процедуре (как минимум) и вызывать ее по условию без всяких там атавизмов (я о GoTo).
...
Рейтинг: 0 / 0
10.11.2009, 14:04
    #36301110
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Например, x будет 35?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub nn()

 10 :

For y =  1  To  10 
    x = x +  1 
    If x =  35  Then Exit For
    If y =  5  Then GoTo  10 
Next

MsgBox x

End Sub
...
Рейтинг: 0 / 0
10.11.2009, 14:11
    #36301123
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
AndreyMpОформить цикл в процедуре (как минимум) и вызывать ее по условию без всяких там атавизмов (я о GoTo).

Так так так )) по подробнее )))
У меня задействовано два цыкла
Цыкал Do
и
цыкал For

Цыкал Do отвечает за счетчик ходов. А For за рендомный вариант хода.
Все находится в нутри цыкла For.
В цыкле Do есть несколько условий отвечающих за возможность проведения данного хода, если ход не возможен, цыкл For должен просчитать еще один вариант хода. Другой. И все должно пройти по кругу еще раз.
Если все удачно, цыклы завершают работу когда поле заполнено и ходов больше делать некуда.

Может есть варианты как лучше такую операцию провести ? рассмотрю все идеи.
...
Рейтинг: 0 / 0
10.11.2009, 14:17
    #36301132
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Хорошо, без GoTo:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim x

Sub test()
x =  0 
For y =  1  To  10 
If x <  10  Then cikl
Next
End Sub

Sub cikl()
For y =  1  To  3 
    x = x +  1 
Next
End Sub

Заметь, х должна быть доступной в обоих процедурах.
...
Рейтинг: 0 / 0
10.11.2009, 14:27
    #36301164
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Похоже?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim x

Sub test()
Dim y
x =  0 

Do

y = y +  1  'счётчик ходов
If x <  10  Then cikl 'если ход не возможен

Loop While y <  10 

End Sub

Sub cikl()
Dim y
For y =  1  To  3 
    x = x +  1  'просчитать еще один вариант
Next
End Sub

...
Рейтинг: 0 / 0
10.11.2009, 14:33
    #36301182
.Михаил.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
lopuxi, привет
lopuxi
У меня такой простой вопрос.
Как запустить цикл For с самого начала, если он не сработал в одном из нескольких условий?
У меня просто задачка, такая, программа высчитывает несколько вариантов ходов, а варианты выпадают рандомно, в начале цикла For. Нужно если выпавший вариант не подходит, цикл запускался снова и выдавал новый вариант.

не стал разбираться что именно делает твоя прога, но вот, может идея этого пригодиться?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub MySub()
Dim i As Integer, mass( 1  To  10 ) As Integer
For i =  1  To  10 
    mass(i) = i ' инициализация массива
Next
For i =  1  To  10 
    If mass(i) =  1  Then ' некоторое условие
        MyFor mass,  1  ' запуск нового цикла
        Exit For ' исключение существующего цикла
    End If
Next
End Sub
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub MyFor(ByRef mass() As Integer, ByVal val As Integer)
Dim i As Integer
For i =  1  To  10 
    If mass(i) = val Then ' некоторое условие
        MsgBox val
        MyFor mass, val +  1   запуск нового цикла
        Exit For ' исключение существующего цикла
    End If
Next
End Sub
суть в чем?
при "прохождении" массива циклом и выполнении некоторого условия "запускается" цикл заново, предыдущий цикл "исключается". При невыполнении некоторого условия при "прохождении" всего цикла, новый цикл не "запускается".
...
Рейтинг: 0 / 0
10.11.2009, 14:36
    #36301195
.Михаил.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
такой вызов процедуры как-то называется, а как, не помню...
...
Рейтинг: 0 / 0
10.11.2009, 14:54
    #36301259
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Рекурсия это называется.
...
Рейтинг: 0 / 0
10.11.2009, 16:23
    #36301598
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
> Автор: lopuxi
> Вот такое одно из условий которое в случае если вариант хода не подходит, цикл отсюда должен запуститься вновь.

Сделай ещё один цикл в отдельной функции, в котором будут генерироватся начальные условия и выполнятся проверка
валидности начальных условий. А из основных циклов вызывай эту функцию и заведи константу(Enum, Const) ошибки и проверяй
результат функции на равенство этой константе, что-бы понять что функция не нашла валидных исходных данных.
Мне кажется что рекурсия здесь не очень хороший вариант решения, потому что, глубина рекурсии ограничена ресурсами
компьютера, а линейный цикл неограничен ничем. И если у тебя есть варианты в которых могут генерироватся невалидные
начальные данные, то в принципе возможна ситуация, когда любые сгенерённые исходные данные будут невалидны и при
неконтролируемой рекурсии получишь Stack Overflow. Да и сопровождать рекурсивные алгоритмы сложнее

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.11.2009, 18:33
    #36302103
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
lopuxi,

А зачем тогда условии, если все равно запускать?
...
Рейтинг: 0 / 0
10.11.2009, 19:05
    #36302170
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
А почему просто не переинициализировать переменную цикла без всяких некошерных GoTo?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub nn()

For x =  1  To  10 
If x =  5  Then x =  1 
Next

End Sub
...
Рейтинг: 0 / 0
10.11.2009, 19:14
    #36302200
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
А зачем For, если условия нечеткие?

Jah loves you.
...
Рейтинг: 0 / 0
10.11.2009, 19:20
    #36302216
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Antonariy,

А потому что For - это тот же While, просто на две команды меньше
...
Рейтинг: 0 / 0
12.11.2009, 13:16
    #36306604
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
)) В общем ребят, я тока учусь, задачка эта была самостоятельная работа из учебника :))
В целом я ее решил, вариант хода, шахматной фигуры, выбирается рандомно. Она идет туда куда можно где клетка не занята и туда когда захочет.
Вот что получилось
Но выдает в определенный момент выдает ошибку :( Не понимаю, причину.

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
Dim flag As Integer

Private Sub Bgn_Click() ' Кнопка начать игру
Dim D_x As Variant
Dim D_y As Variant
Randomize
    D_x = Array( 0 ,  1 ,  2 ,  2 ,  1 , - 1 , - 2 , - 2 , - 1 )
    D_y = Array( 0 , - 2 , - 1 ,  1 ,  2 ,  2 ,  1 , - 1 , - 2 )
     
    Nomer =  1  ' Эта переменная представляет счетчик ходов.

' Считывание начального положения шахматной фигуры
    x = Val(T_x.Text)
    y = Val(T_y.Text)
    Randomize
    Cells(y, x).Value = Nomer 'В ячейку листа записывается номер хода
    
Bgn.Enabled = False
Nxt.Enabled = True
    For R1 =  1  To  8 
    R = CInt(Rnd *  8 )
    k = R ' Вариант хода
Do 'Цикл до строки Loop - это цикл по количеству вариантов ходов.
    var_x = x + D_x(k) ' Горизонтальная координата потенциального хода.
    var_y = y + D_y(k) ' Вертикальная координата потенциального хода.
'/////// проверка местоположения клетки потенциального хода
If var_x <  1  Or var_x >  8  Or var_y <  1  Or var_y >  8  Then ' проверка. есть ли выход за пределы доски, если да то переход к следующему варианту
        k = k + k 'Если клетка вне доски, то переход к следующему варианту.
    ElseIf Cells(var_y, var_x) <> "" Then ' если поле занято, то поиск нового хода.
        k = k + k ' ( А тут он выбрасывает у меня ошибку!) Ставлю  k = k + 1, то ничего не виснет, но посик ходов прекращается, хотя варианты еще есть.
    Else
        x = var_x
        y = var_y
        Nomer = Nomer +  1 
        Cells(y, x).Value = Nomer
        
MsgBox "Координаты > " & D_x(k) & "|" & D_y(k) & " Вариант " & k

        k = k + k ' Для следующего хода начинаем просмотр вариантов с первого.
        flag =  0 
            While flag =  0 
                DoEvents
            Wend
    End If
Loop While k <  9  ' Завершение цикла Do (Ходов больше Нет)
 Next

End Sub

Private Sub Clr_Click() ' Кнопка Очистеть поле
Range("A1:H8").Value = ""
Bgn.Enabled = True
Nxt.Enabled = False
End Sub

Private Sub Nxt_Click() ' Кнопка след. хода
flag =  1 
End Sub
...
Рейтинг: 0 / 0
12.11.2009, 13:30
    #36306643
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
lopuxiНо выдает в определенный момент выдает ошибку :( Не понимаю, причину.


В связи с отсутствием текста ошибки и места ее возникновения, предполагаю, что ругается на ошибку в слове "Очистеть"
...
Рейтинг: 0 / 0
12.11.2009, 13:33
    #36306655
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл For в VBA Excel
Подставил в цикал For
подсчет длинны массива

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Var1 = UBound(D_x)
    For R1 =  1  To Var1
    R = CInt(Rnd * Var1)
    k = R ' Вариант хода 
'..... 
'(Продолжение кода)... 
'... 
    ElseIf Cells(var_y, var_x) <> "" Then 
        k = k +  1   ' изменил (k+ k) на (k+1)

При такой вариации код не виснет. но останавливается, ходы дальше не продолжаются.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel / 25 сообщений из 51, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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