powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel
25 сообщений из 51, страница 2 из 3
Цикл 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
25 сообщений из 51, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Цикл For в VBA Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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