powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel
51 сообщений из 51, показаны все 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
Цикл For в VBA Excel
    #36306666
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProlopuxiНо выдает в определенный момент выдает ошибку :( Не понимаю, причину.


В связи с отсутствием текста ошибки и места ее возникновения, предполагаю, что ругается на ошибку в слове "Очистеть"

Ошибка строке кода проверяющая пустая ли клетка для проведения в нее хода или нет.
строка k = k + k
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306669
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или "вертикале" :)
lopuxi, давай файл, лениво кнопки рисовать, а интересно... :)
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306678
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Или "вертикале" :)
lopuxi, давай файл, лениво кнопки рисовать, а интересно... :)

У тебя Excel 2007? Просто я в 2007 работаю, так что если не откроется скажи, я переконвертирую в 2003.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306691
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня 2000 :)
Открылся, но что-то с кнопками, лучше конвертни, пожалуйста.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306709
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы.. Прикольно. Ход конем пишем? А в кубе слабо? Я когда то быловался в институте, с записью каждого хода. Помню, на фортране и админы сильно злились. :)
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306733
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121У меня 2000 :)
Открылся, но что-то с кнопками, лучше конвертни, пожалуйста.
Ок вот в 2003. в 2000 не знаю как пересохранить :))
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306745
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyMpГы.. Прикольно. Ход конем пишем? А в кубе слабо? Я когда то быловался в институте, с записью каждого хода. Помню, на фортране и админы сильно злились. :)

ну мне до этого еще далеко)) мнеб с шахматной фигурой разобраться :))
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306760
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня 13 ходов сделал, когда к = к + 1 поставил. Похоже, что-то с краем доски конфликтует, зависает, когда близко от края.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306791
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121У меня 13 ходов сделал, когда к = к + 1 поставил. Похоже, что-то с краем доски конфликтует, зависает, когда близко от края.
И как это исправить? вроде условие стоит о том что если ход за пределы входит, то перерасчет хода идет.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306810
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Hugo121
> У меня 13 ходов сделал, когда к = к + 1 поставил. Похоже, что-то с краем доски конфликтует, зависает, когда
> близко от края.

У меня 9 ходов и все
Код: 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.
For R1 =  1  To Var1
' У тебя инициализация происходит один раз при очистке доски
' После этого весь расчет крутится в цикле Do ... Loop,
' а там только увеличение счетчика окончания цикла
' Поэтому когда проходит 9 ходов заканчивается игра :)))
    R = CInt(Rnd * Var1)
    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 +  1  ' ( А тут он выбрасывает у меня ошибку!) Ставлю  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 R1

Перестрой логику работы таким образом, что-бы по нажатию кнопки "Следующий ход" происходило вычисление и показ хода, а
не управление "MessagePump". Иногда и такой прием можно(нужно) применять, но явно не в твоем случае.

З.Ы. поставь Option Explicit

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306916
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Hugo121
> У меня 13 ходов сделал, когда к = к + 1 поставил. Похоже, что-то с краем доски конфликтует, зависает, когда
> близко от края.

У меня 9 ходов и все
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For R1 =  1  To Var1
' У тебя инициализация происходит один раз при очистке доски
' После этого весь расчет крутится в цикле Do ... Loop,
' а там только увеличение счетчика окончания цикла
' Поэтому когда проходит 9 ходов заканчивается игра :)))
    R = CInt(Rnd * Var1)
    k = R ' Вариант хода
    Do 'Цикл до строки Loop - это цикл по количеству вариантов ходов.
   .........
                DoEvents
            Wend
        End If
    Loop While k <  9  ' Завершение цикла Do (Ходов больше Нет)
Next R1

Перестрой логику работы таким образом, что-бы по нажатию кнопки "Следующий ход" происходило вычисление и показ хода, а
не управление "MessagePump". Иногда и такой прием можно(нужно) применять, но явно не в твоем случае.

З.Ы. поставь Option Explicit




Ссылочку ты интересную дал.... почитал, но не все понял, еще почитаю ее. Пока это не мой уровень знаний)) Дается все не сразу.

Подставил к цыклу For ... next R1
досчитал до 15 и все тоже самое.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306976
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: lopuxi
> Подставил к цыклу For ... next R1
> досчитал до 15 и все тоже самое.

Так и будет, потому, что в какой-то момент к становится >= 9 и все
Если поставить Loop While k < 900 то у меня на 24 ходу я просто зашел в тупик, потому, что свободных клеток для ходов не
осталось, но прогамма продолжала просчет вариантов. Потому, что к в данном случае никогда не достигнет 900.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36306994
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынеси просчет следующего хода в отдельную функцию и вызывай её. Цикл там нужен только на количество вариантов, а не
бесконечный. и при нажатии на кнопку вызывай эту функцию. Тогда избавишся от ненужных циклов и проще будет определить
когда закончились ходы и об этом нужно сказать пользователю

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308273
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас опять ругаться будете на атавизмы, но для начала так:
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
Dim flag As Integer
Dim Var1
Dim k

Private Sub Bgn_Click() ' Кнопка начать игру
Dim D_x As Variant
Dim D_y As Variant
    
    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)

    Cells(y, x).Value = Nomer 'В ячейку листа записывается номер хода
    
Bgn.Enabled = False
Nxt.Enabled = True
Var1 = UBound(D_x)

 10 :
hod = hod +  1 : If hod =  10  Then Nxt.Enabled = False: MsgBox "No More Moves!!!":  flag =  0 : Exit Sub
rrand
hod2 =  0 

 20 :
hod2 = hod2 +  1 : If hod2 =  10  Then Nxt.Enabled = False: MsgBox "No More Moves!!!":  flag =  0 : Exit Sub
    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 +  1 : If k >  8  Then k = k -  8   'Если клетка вне доски, то переход к следующему варианту.
        GoTo  20 
    ElseIf Cells(var_y, var_x) <> "" Then ' если поле занято, то поиск нового хода.
        k = k +  1 : If k >  8  Then k = k -  8 
        GoTo  20 
    Else
        x = var_x
        y = var_y
        Nomer = Nomer +  1 
        Cells(y, x).Value = Nomer
        hod =  0 
        MsgBox "Координаты > " & D_x(k) & "|" & D_y(k) & " Вариант " & k

        flag =  0 
        While flag =  0 
            DoEvents
        Wend
        GoTo  10 
    End If

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

Sub rrand()
    Randomize
    k = CInt(Rnd * Var1)  ' Вариант хода
End Sub

For убрал, Do убрал, одни GoTo оставил :) Но зато переделывал минимально (разве что грамматику :) ). Зря наверное Randomize отдельно вынес, думал чаще с разных мест вызывать придётся, ну да ладно.
Интересно для обучения, может на выходных попробую без GoTo собрать...
Есть косячок - сразу делает первый ход, легко и и просто не убралось (или я не заметил решения?).
P.S. Вот в оригинальном коде k = k + k - это что? Что-то я не понял смысла...
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308471
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Hugo121
> Есть косячок - сразу делает первый ход, легко и и просто не убралось (или я не заметил решения?).

Не заметил
"Message Pump" нужно перенести ДО того как расчитывается и делается ход, а сейчас он ПОСЛЕ

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308600
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я с "Message Pump" (я не путаю, это обработка flag подразумевается?) здесь первый раз столкнулся, интересное решение. Хотя иногда подглючивает.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308616
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
Не заметил
"Message Pump" нужно перенести ДО того как расчитывается и делается ход, а сейчас он ПОСЛЕ

Вот что-то в моём варианте не получается легко и просто перед ходом воткнуть...
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308884
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Hugo121
> Вот что-то в моём варианте не получается легко и просто перед ходом воткнуть...

Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
Option Explicit

Private Type Point
    x As Long
    y As Long
End Type

Dim D_x() As Variant
Dim D_y() As Variant
Dim ptWorkPoint As Point
'Dim flag As Integer
Dim Nomer As Long

Private Sub Bgn_Click() ' Кнопка начать игру
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  ' Эта переменная представляет счетчик ходов.

' Считывание начального положения шахматной фигуры
With ptWorkPoint
    .x = CLng(Val(T_x.Text))
    .y = CLng(Val(T_y.Text))
End With
Randomize CDbl(Time) *  1000 

Cells(ptWorkPoint.y, ptWorkPoint.x).Value = Nomer 'В ячейку листа записывается номер хода

Bgn.Enabled = False
Nxt.Enabled = True
' Если нужен сразу первый ход, раскомментировать
'Call Nxt_Click
End Sub

Private Function CalcNextStep(ByRef pt As Point) As Point
' Функция просчитывает координаты следующего хода
Dim ptTmp As Point, i As Long, bFlag As Boolean
bFlag = False
' Получаем новую координату случайным образом
ptTmp = GetNewCoord()
With ptTmp
    .x = .x + pt.x
    .y = .y + pt.y
End With
If Not CheckNewCoord(ptTmp) Then
' проверка. есть ли выход за пределы доски или поле занято то поиск нового хода.
' Но уже не случайным образом, а систематически
    For i = LBound(D_x) To UBound(D_x)
    ' Получаем новую координату
        ptTmp = GetNewCoord(i)
        With ptTmp
            .x = .x + pt.x
            .y = .y + pt.y
        End With
        ' проверяем на валидность
        If CheckNewCoord(ptTmp) Then
            ' Если нашли, завершаем цикл и функцию вообще
            CalcNextStep = ptTmp
            bFlag = True
            Exit For
        End If
    Next i
    If Not bFlag Then
    ' если не нашли координат, а прошли весь массив коэфициентов
    ' значит попали в тупик и ходить дальше некуда, о чем и скажем :)
        With CalcNextStep
            .x = - 100 
            .y = - 100 
        End With
    End If
Else
    CalcNextStep = ptTmp
End If
End Function

Private Sub ShowStep(ByRef pt As Point, nNomerStep As Long)
' Процедура выводит следующий ход
Cells(pt.y, pt.x).Value = nNomerStep
End Sub

Private Function CheckNewCoord(ByRef ptCheck As Point) As Boolean
' Проверяем "свободность" точки предполагаемого хода
On Error Resume Next
' Ошибка может происходить на проверке "занятости" клетки, при индексах меньше 1
If ptCheck.x <  1  Or ptCheck.x >  8  Or ptCheck.y <  1  Or ptCheck.y >  8  Then
    CheckNewCoord = False
ElseIf Cells(ptCheck.y, ptCheck.x).Value <> " " Then
    CheckNewCoord = False
Else
    CheckNewCoord = True
End If
End Function

Private Function GetNewCoord(Optional ByVal lRandom As Long =  0 ) As Point
' Функция возвращает новую комбинацию коэфициетнов для хода
Dim R As Long
If lRandom =  0  Then
    R = CLng(Rnd(CDbl(Time) *  1000 ) * UBound(D_x))
Else
    R = lRandom
End If
If R > UBound(D_x) And R < LBound(D_x) Then
    R =  0 
End If
With GetNewCoord
    .x = D_x(R)
    .y = D_y(R)
End With
End Function

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

Private Sub Nxt_Click() ' Кнопка след. хода
Dim pt As Point
pt = CalcNextStep(ptWorkPoint)
If pt.x <> - 100  Then
    Nomer = Nomer +  1 
    Call ShowStep(pt, Nomer)
    ptWorkPoint = pt
Else
    MsgBox "Дальше ходить некуда"
End If
End Sub
результат 46 ходов

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308923
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Hugo121
> Я с "Message Pump" (я не путаю, это обработка flag подразумевается?) здесь первый раз столкнулся, интересное
> решение. Хотя иногда подглючивает.

Да, не путаешь, я именно это и подразумевал. В основном используется при ресурсоемких расчетах(действиях) в цикле для
отмены дальнейшего выполнения действий, только там считается, считается иногда проверяется флаг и если он установлен
расчеты прерываются, а здесь наоборот ничего не делаем, ничего не делаем и бац! сделали и снова бездельничаем
Насчет подглючивания, ничего такого не замечал( в своих решениях ) :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308950
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер, поизучаю...
Вот только надо бы MsgBox "Дальше ходить некуда": Nxt.Enabled = False дополнить :)
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36308977
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчёт подглючивает - вроде иногда нажатие кнопки не обрабатывается, но это наверное другой вопрос.
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36309166
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
результат 46 ходов

Мой рекорд на этом коде - 51!
Вообще-то легко подвинул "Message Pump" - убрал вообще, от старого кода только грамматическую ошибку (извините), D_x, D_y и названия кнопок оставил :)
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36309402
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Hugo121
> Мой рекорд на этом коде - 51!

Из скольки попыток

> Вообще-то легко подвинул "Message Pump" - убрал вообще, от старого кода только грамматическую ошибку (извините),
> D_x, D_y и названия кнопок оставил :)


Теперь хотелось-бы услышать Начальника транспортного цеха

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36312213
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Hugo121
> Мой рекорд на этом коде - 51!

Из скольки попыток

> Вообще-то легко подвинул "Message Pump" - убрал вообще, от старого кода только грамматическую ошибку (извините),
> D_x, D_y и названия кнопок оставил :)


Теперь хотелось-бы услышать Начальника транспортного цеха




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



> Я думал эта маленькая и простенькая задачка и решение будет таким же, но чето я ошибался :))

Любая маленькая задача имеет тенденцию стать большой и сложной. Поэтому по возможности писать нужно стараясь
подразумевая такую позицию.
К тому-же "ключевые" моменты алгоритма разделены друг, от друга что позволяет более простое изменение и доработку в
последующем. Например нужно будет переделать алгоритм определения координат следующего хода это затронет только
CalcNextStep и ничего больше. Или изменятся размеры доски, это означает изменение CheckNewCoord и т.п.
Вот ради того что учишся и сделал пример что-бы показать что я подразумевал советуя:
Игорь ГорбоносПерестрой логику работы таким образом, что-бы по нажатию кнопки "Следующий ход" происходило
вычисление и показ хода, а не управление "MessagePump".


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Цикл For в VBA Excel
    #36312356
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: lopuxi
> Ну что я могу сказать ))) Ну я всего лишь учусь)))
> В обще вот последний вариант кода, удивил меня. Не только потому что он большой :) но и потому что еще и работает



> Я думал эта маленькая и простенькая задачка и решение будет таким же, но чето я ошибался :))

Любая маленькая задача имеет тенденцию стать большой и сложной. Поэтому по возможности писать нужно стараясь
подразумевая такую позицию.
К тому-же "ключевые" моменты алгоритма разделены друг, от друга что позволяет более простое изменение и доработку в
последующем. Например нужно будет переделать алгоритм определения координат следующего хода это затронет только
CalcNextStep и ничего больше. Или изменятся размеры доски, это означает изменение CheckNewCoord и т.п.
Вот ради того что учишся и сделал пример что-бы показать что я подразумевал советуя:
Игорь ГорбоносПерестрой логику работы таким образом, что-бы по нажатию кнопки "Следующий ход" происходило
вычисление и показ хода, а не управление "MessagePump".





СПАСИБО!!! :))

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


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