Здравствуйте, уважаемые специалисты по экселю. Помогите решить непростую проблему.
На листе представлены начальная ячейка G13 и конечная ячейка W6. Схема алгоритма выглядит так:
1.Начинается цикл. Адрес начальной ячейки (Сейчас это ячейка W6) проверяется - в нем 0 или цифра отличная от 0 (если 0 то exit sub). Если цифра отличается от 0 - то она записывается в переменную. 2.Проверяются 8 рядом стоящих ячеек (Как я понимаю при помощи команды Offset). Проверяется например левая верхняя ячейка Offset(-1,-1). Ее значение и ее адрес вносятся в массив. Затем проверяется верхняя ячейка Offset(0,-1), затем верхняя правая Offset(1,-1) - и так далее все 8 ячеек. В итоге данной работы цикла будет массив 2х8 где в одном ряду будут адреса ячеек, а в другом ряду будут числа. (Это все пока для одной ячейки W6) 3.Затем макрос проверяет - где в этом массиве число, отличающееся от переменной на единицу (в меньшую сторону) и записывает его адрес (соответствующий числу в массиве 2х8) во вторую переменную. (А если таких чисел в массиве несколько - то выхватывает самое первое по списку). 4.Макрос записывает этот полученный из массива адрес ячейки - в строку 18. 5.Затем макрос повторяет цикл, но уже с другим адресом ячейки (взятым из второй переменной).
Подскажите - как этот алгоритм реализовать в ВБА ?
Здравствуйте, уважаемые специалисты по экселю. Помогите решить непростую проблему.
На листе представлены начальная ячейка G13 и конечная ячейка W6. Схема алгоритма выглядит так:
1.Начинается цикл. Адрес начальной ячейки (Сейчас это ячейка W6) проверяется - в нем 0 или цифра отличная от 0 (если 0 то exit sub). Если цифра отличается от 0 - то она записывается в переменную. 2.Проверяются 8 рядом стоящих ячеек (Как я понимаю при помощи команды Offset). Проверяется например левая верхняя ячейка Offset(-1,-1). Ее значение и ее адрес вносятся в массив. Затем проверяется верхняя ячейка Offset(0,-1), затем верхняя правая Offset(1,-1) - и так далее все 8 ячеек. В итоге данной работы цикла будет массив 2х8 где в одном ряду будут адреса ячеек, а в другом ряду будут числа. (Это все пока для одной ячейки W6) 3.Затем макрос проверяет - где в этом массиве число, отличающееся от переменной на единицу (в меньшую сторону) и записывает его адрес (соответствующий числу в массиве 2х8) во вторую переменную. (А если таких чисел в массиве несколько - то выхватывает самое первое по списку). 4.Макрос записывает этот полученный из массива адрес ячейки - в строку 18. 5.Затем макрос повторяет цикл, но уже с другим адресом ячейки (взятым из второй переменной).
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 2 To 8 Step 2 If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If Next If flag = False Then Exit Do DoEvents Loop End Sub
[/vba]
[vba]
Код
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 2 To 8 Step 2 If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If Next If flag = False Then Exit Do DoEvents Loop End Sub
Только почему-то в самом конце пути - выводится ячейка F12, хотя там вообще чисел нет. Хотя по идее - должен выводится адрес ячейки G13, поскольку именно в ней находится 0.
Посоветуйте, как это исправить ?
Спасибо. Все нормально.
Только почему-то в самом конце пути - выводится ячейка F12, хотя там вообще чисел нет. Хотя по идее - должен выводится адрес ячейки G13, поскольку именно в ней находится 0.
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 2 To 8 Step 2 If Len(r(i)) Then If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If End If Next If flag = False Then Exit Do DoEvents Loop End Sub
[/vba]
[vba]
Код
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 2 To 8 Step 2 If Len(r(i)) Then If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If End If Next If flag = False Then Exit Do DoEvents Loop End Sub
RAN, подскажите по работе макроса. Попыталась изменить ваш макрос, чтобы он учитывал соседние ячейки по диагонали тоже. [vba]
Код
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 1 To 8 Step 1 If Len(r(i)) Then If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If End If Next If flag = False Then Exit Do DoEvents Loop End Sub
[/vba]
Когда достигает ячейки F8 с числом 33 - то внезапно останавливается. Хотя рядом находится ячейка G9, с числом 32
Как это исправить ?
RAN, подскажите по работе макроса. Попыталась изменить ваш макрос, чтобы он учитывал соседние ячейки по диагонали тоже. [vba]
Код
Sub Мяу() Dim r_0 As Range, r As Range, i&, flag As Boolean Set r_0 = [W6] [f20] = r_0.Address(0, 0) Do Set r = r_0.Offset(-1, -1).Resize(3, 3) flag = False For i = 1 To 8 Step 1 If Len(r(i)) Then If r_0.Value - r(i).Value = 1 Then Set r_0 = r(i) Cells(20, Columns.Count).End(xlToLeft).Offset(, 1) = r_0.Address(0, 0) flag = True Exit For End If End If Next If flag = False Then Exit Do DoEvents Loop End Sub
[/vba]
Когда достигает ячейки F8 с числом 33 - то внезапно останавливается. Хотя рядом находится ячейка G9, с числом 32