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

У меня просто задачка, такая, программа высчитывает несколько вариантов ходов, а варианты выпадают рандомно, в начале цикла For. Нужно если выпавший вариант не подходит, цикл запускался снова и выдавал новый вариант.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36300778
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
If x <> y then GoTo 
?
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36300791
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такое одно из условий которое в случае если вариант хода не подходит, цикл отсюда должен запуститься вновь.
Код: plaintext
1.
2.
' проверка местоположения клетки потенциального хода
If var_x <  1  Or var_x >  8  Or var_y <  1  Or var_y >  8  Then  
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36300808
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Цикл For в VBA Excel
    #36300814
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или так надо:
Код: 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
Цикл For в VBA Excel
    #36300871
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121,

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

Выдает теперь вот такую ошибку в окончании условия
End If
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36300886
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выражению If x = 5 Then GoTo 10
End If не нужен, не путай с
Код: plaintext
1.
2.
3.
If x =  5  Then
 GoTo  10 
End If
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36300905
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну пример кода может и неудачен, он бесконечный, поэтому по Esc такое и покажет. Но ведь рабочий код не будет бесконечным, однажды x будет <> 5 :)
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36301104
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оформить цикл в процедуре (как минимум) и вызывать ее по условию без всяких там атавизмов (я о GoTo).
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36301110
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, 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
Цикл For в VBA Excel
    #36301123
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyMpОформить цикл в процедуре (как минимум) и вызывать ее по условию без всяких там атавизмов (я о GoTo).

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

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

Может есть варианты как лучше такую операцию провести ? рассмотрю все идеи.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36301132
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, без 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
Цикл For в VBA Excel
    #36301164
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже?
Код: 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
Цикл For в VBA Excel
    #36301182
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Цикл For в VBA Excel
    #36301195
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такой вызов процедуры как-то называется, а как, не помню...
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36301259
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсия это называется.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36301598
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: lopuxi
> Вот такое одно из условий которое в случае если вариант хода не подходит, цикл отсюда должен запуститься вновь.

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

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

А зачем тогда условии, если все равно запускать?
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36302170
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему просто не переинициализировать переменную цикла без всяких некошерных 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
Цикл For в VBA Excel
    #36302200
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем For, если условия нечеткие?

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

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

Код: 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
Цикл For в VBA Excel
    #36306643
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxiНо выдает в определенный момент выдает ошибку :( Не понимаю, причину.


В связи с отсутствием текста ошибки и места ее возникновения, предполагаю, что ругается на ошибку в слове "Очистеть"
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306655
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подставил в цикал 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
25 сообщений из 51, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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