Страницы: 1 2 След.
RSS
Рост области числа, с ограничением препятствиями
 
Доброе утро.
Помогите решить задачу.

Макрос работает так:  по событию Worksheet_Change например для ячейки S16 (подсвечена зеленым цветом) - растет область чисел вокруг нее.
Причем если область чисел встречает препятствие (желтые ячейки), то оно воспринимает их как препятствия - и не распространяется сквозь них.

Однако почему-то когда я увеличиваю эту область, то есть некая граница после которой область перестает расти.
Когда область чисел достигает 29 она перестает увеличиваться, хотя там нет препятствия.

Почему область не растет за 29 строку и как это исправить в макросе?
 
А самому пошагово проверить что вызывает ошибку вера не позволяет?
проверку  на 0 можно добавить  
Изменено: Александр Моторин - 27.06.2019 09:51:02
 
Александр Моторин, ясно.
И как макрос поменять, чтобы заработало ?
 
Цитата
КошкаСофи написал: Однако почему-то когда я увеличиваю эту область
Вот это объясните подробнее. Как Вы эту область увеличиваете?
И в файле покажите Как есть - Как надо
Согласие есть продукт при полном непротивлении сторон
 
20 дней тому как
 
Sanja, область увеличивается следующим образом:
Цитата
КошкаСофи написал:  по событию Worksheet_Change например для ячейки S16 (подсвечена зеленым цветом) - растет область чисел вокруг нее.
Макрос срабатывает - всякий раз при событии Worksheet_Change для ячейки S16.

Цитата
Sanja написал: И в файле покажите Как есть - Как надо
Так а как я это в файле покажу ?
Сейчас область не растет за 29 строку, а нужно чтобы область росла за 29 строку.
 
О дублях темы нужно сообщать самостоятельно.
 
Цитата
КошкаСофи написал: Макрос срабатывает - всякий раз при событии Worksheet_Change для ячейки S16.
Как срабатывает процедура  Worksheet_Change я знаю.
Я спрашивал про АЛГОРИТМ, по которому растет некая область
КАК она растет (по спирали/по столбцам/по строкам/другое)?
До каких пор она должна расти и от чего это зависит?
В Вашем случае проще написать новый макрос, чем разбираться в чужом коде, но для этого нужно знать АЛГОРИТМ.
Объясните просто, по русски, обычными словами.  
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Объясните просто,
Так не интересно. Сам угадай.
"Например" №3
Код
Sub Мяу()
    Dim x0&, y0&, x1&, y1&, dx0&, dy0&, k&, i&
    Dim r As Range, rr As Range, cl As Range
    Dim AdrRC$, spl
    Dim s
    k = 30
    Set r = [o7]
    '     Set r = [s16]
    '   Set r = [b3]
    s = 2
    r.Value = s
    x0 = r.Column: y0 = r.Row: x1 = x0: y1 = y0
    Do
        dx0 = x0 > 1
        dy0 = y0 > 1

        Set r = Range(Cells(y0 + dy0, x0 + dx0), Cells(y1 + 1, x1 + 1))
        For Each cl In r
            If cl = "" Then
                k = k - 1
                If k < 0 Then Exit For
                If Not rr Is Nothing Then
                    Set rr = Union(rr, cl)
                Else
                    Set rr = cl
                End If
            End If
        Next
        If rr Is Nothing Then Exit Do
        AdrRC = rr.Address(ReferenceStyle:=xlR1C1)
        spl = Split(AdrRC, "C")
        x0 = Val(spl(1))
        For i = 1 To UBound(spl)
            If x0 > Val(spl(i)) Then x0 = Val(spl(i))
            If x1 < Val(spl(i)) Then x1 = Val(spl(i))
        Next
        spl = Split(AdrRC, "R")
        y0 = Val(spl(1))
        For i = 1 To UBound(spl)
            If y0 > Val(spl(i)) Then y0 = Val(spl(i))
            If y1 < Val(spl(i)) Then y1 = Val(spl(i))
        Next
        rr.Value = s
        Set rr = Nothing
        DoEvents
        '        Stop
    Loop
End Sub
 
RAN, спасибо.

Этот код вообще не работает. Расставляет числа одинократно, а не постоянно.
Можно сделать только один, максимум два щелчка по кнопке. Дальше макрос перестает действовать.
 
Кошка озадачивает макрос нарисовать 4 цЫфирьки вокруг ячейки S16.
Макрос честно выполняет заказанное.
После Кошка заявляет
Цитата
КошкаСофи написал:
Этот код вообще не работает.
Стесняюсь спросить, какого ... еще Кошке надо?
PS последний вопрос риторический, ответа не требует.
Изменено: RAN - 30.06.2019 21:28:01
 
Цитата
RAN написал:
озадачивает макрос нарисовать 4 цЫфирьки вокруг ячейки S16.
Нет озадачивает то, что непонятно - как этот макрос связан с моим вопросом заданным в первом сообщении (то есть в начале темы).
Вопрос звучал так:

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

Однако почему-то когда я увеличиваю эту область, то есть некая граница после которой область перестает расти.
Когда область чисел достигает 29 она перестает увеличиваться, хотя там нет препятствия.

Вопрос - как это исправить в макросе? "
 
Цитата
КошкаСофи написал:
Вопрос - как это исправить в макросе? "
На этот вопрос я вам ответил 20 дней тому назад на том форуме, и в той теме, где я вам писал этот макрос.
 
Нет, насчет решения - по моему вопросу так и не ответили.
 
Цитата
КошкаСофи написал: Нет, насчет решения - по моему вопросу так и не ответили.
ИМХО, Вам СЮДА, но и там потребуется ГРАМОТНОЕ ТЗ
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
КАК она растет (по спирали/по столбцам/по строкам/другое)?
Растет по спирали.
Цитата
Sanja написал:
До каких пор она должна расти и от чего это зависит?
Расти должно до бесконечности.
А вот почему сейчас не растет до бесконечности - я не знаю, поэтому и спрашиваю.
 
В функции которую я вам сделал "FCh_Area" установите проверку, что бы не проверялись ячейки cX и cY меньше или равные нулю
 
Цитата
Fidgy написал:
В функции которую я вам сделал "FCh_Area" установите проверку
Не поможет.
 
Ну, строку №29 оно всё-таки пройдет
А 31 нет :) Там проблемы расширения области
 
Fidgy, а как пройти 31 строку ?
 
Переработать концепцию вашей программы. У вас область расширяется бесконечно, во все стороны. Но область не может быть с координатами меньше 1 (не может быть ячейки(0, 0) )

Я бы рекомендовал вам сначала избавиться от On Error GoTo End_ - это очень порочная практика и она мешает вам определить причину ошибки.
Затем определить рабочую область где у вас будет обрабатываться ячейки, добавив проверку, чтобы не выходить за пределы этой области.
Далее, при расширении области чисел, "область проверки" расширять не квадратом, а постепенно во все 4 стороны (опять-таки не заходя за рабочую область)

И ещё рекомендую попытаться 4 последовательных цикла, впихнуть в три цикла вложенных в друга-друга (первый определяет стороны - соответственно нижнюю и верхнею границу для последующих циклов, второй ось X, третий ось Y)
 
Цитата
Fidgy написал:
это очень порочная практика
Вы уверены? А ваша фамилия не Остер?
 
Fidgy, ясно.
А как это в макросе реализовать ?
 
Цитата
RAN написал: А ваша фамилия не Остер?
Не знаю кто это
И это моё мнение, можете переубедить меня
Я считаю что "On Error GoTo" можно использовать только в особых случаях, когда мы именно ожидаем ошибку. Или симулируем Try Catch
Во всех остальных случаях лучше избегать этого

Цитата
КошкаСофи написал:
А как это в макросе реализовать ?
Это вам нужно самостоятельно разобраться. Если какой-то конкретный момент не получается или не ясен, то подскажем
Можете посмотреть пример во вложении - там просто расширяется область, от точки "P"
 
Цитата
Fidgy написал: Не знаю кто это
Поищите Григорий Остер, Вредные советы
Никогда не читали? :)
 
Fidgy, а в вашем макросе - как реакция на препятствия реализуется ?
 
в моем никак, я просто показал как можно работать в ограниченной области и как распространять область по четырём направлениям в трех циклах (второй цикл просто ищет край области)
 
Fidgy, а по какой схеме у вас расставляются N - вокруг целевой ячейки ?
Там же при первом срабатывании - заполняются 8 ячеек, при втором срабатывании - уже 16 ячеек.

А в имеющемся макросе - всегда строго фиксированное число ячеек заполняется.  
 
Распространяется просто во все стороны с одним шагом
Это пример написанный за 15 минут, а не решение
 
Fidgy, что вы имеете ввиду - во все стороны ?
В имеющемся макросе - распространение шло строго на определенное количество ячеек.
Например - ровно на 4 ячейки.
В общем - на одинаковое количество ячеек увеличивалась область при каждом нажатии.

У вас получилось - что-то совсем другое.
Область увеличивается - всегда на разное количество ячеек. Сперва на 8 ячеек, потом на 16 ячеек и так при каждом нажатии - все большее количество ячеек.
Страницы: 1 2 След.
Наверх