Всем привет, меня зовут Андрей, это снова я. Продолжим говорить про судоку. В данной статье будет рассказано о том, каким именно имена нужно присвоить ячейкам судоку и их диапазонам, чтобы в будущем упростить процесс отгадывания судоку с помощью Эксель.
Допустим, что нужно отгадать следующее судоку:
Здесь не видны заголовки строк и столбцов Эксель (хотя есть заголовки строк и столбцов судоку), поэтому уточню: число 25, которое означает, что к моменту начала отгадывания судоку, нам известно только 25 исходных цифр, находится в ячейке B2 Эксель.
Уровень сложности этого судоку *** (три звездочки), то есть это судоку среднего уровня сложности.
Таким образом, само судоку будет в квадрате Эксель от C3 до K11 включительно.
Первый шаг, который нам поможет упростить работу по отгадыванию судоку с помощью Эксель, будет состоять в присвоении имен как отдельным ячейкам в этом диапазоне (от C3 до K11), так и их диапазонам. Кстати, диапазон от (от C3 до K11) Эксель полностью соответствует диапазону от А1 до до З9 (зэ-девять) судоку. Например, центр судоку, где у нас имеется цифра 9, это ячейка Д5 судоку, она же будет являться ячейкой G7 Эксель.
Кстати, добавим заголовки строк и столбцов Эксель:
Итак, при нумерации "по Эксель" цифры обозначают номера строк, а при нумерации "по судоку" цифры будут обозначать номера столбцов. Цифра 25 в ячейке B2 Эксель означает, что у нас пока известно именно 25 цифр судоку.
Итак, начнем. Основные заголовки для строк и столбцов судоку мы уже обозначили, и определили основные правила, как именно мы будем нумеровать клетки судоку.
А теперь настало время присвоить имена. Начнем с присвоения имен каждой клетке (ячейке) судоку. Левая верхняя клетка будет иметь имя кле_А1, ну и так далее.
Все эти имена можно присвоить достаточно быстро с помощью макроса. Вначале приведем первый вариант макроса:
Sub Имена_клетки_судоку()
t1 = Timer()
For m1 = 3 To 11
For n1 = 3 To 11
Cells(m1, n1).Select
a1 = Cells(m1, 2) & Cells(2, n1)
a2 = "кле_" & a1
ActiveWorkbook.Names.Add Name:= _
a2, RefersToR1C1:="=" & Selection.Parent.Name & "!" & Selection.Address(ReferenceStyle:=xlR1C1)
Next n1
Next m1
t1 = Timer() - t1
MsgBox (t1)
End Sub
Главный недостаток этого макроса - очень медленная скорость (время выполнения больше тысячи секунд).
Я уже несколько раз говорил про ускорение макросов.
Этот же макрос в более ускоренном варианте будет выглядеть так:
Sub Имена_клетки_судоку_ускор()
t1 = Timer()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
For m1 = 3 To 11
For n1 = 3 To 11
Cells(m1, n1).Select
a1 = Cells(m1, 2) & Cells(2, n1)
a2 = "кле_" & a1
ActiveWorkbook.Names.Add Name:= _
a2, RefersToR1C1:="=" & Selection.Parent.Name & "!" & Selection.Address(ReferenceStyle:=xlR1C1)
Next n1
Next m1
t1 = Timer() - t1
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
MsgBox (t1)
End Sub
Этот макрос выполняется во много раз быстрее:
Итак, произошло ускорение макроса почти в 100 раз! А результат тот же (присвоение имен ячейкам кле_А1, кле_А2, кле_А3 и т.д.).
Но надо иметь ввиду, что иногда можно присваивать ячейкам и другие имена.
В нашем случае ячейке с именем кле_А1 нужно также присвоить имя кле_11, ячейке с именем кле_А2 нужно также присвоить имя кле_12, и так далее.
Вот макрос, который присвоит нужные имена (приведем сразу "быструю" версию макроса):
Sub Имена_клетки_судоку_2_ускор()
t1 = Timer()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
For m1 = 3 To 11
For n1 = 3 To 11
Cells(m1, n1).Select
a1 = m1 - 2 & n1 - 2
a2 = "кле_" & a1
ActiveWorkbook.Names.Add Name:= _
a2, RefersToR1C1:="=" & Selection.Parent.Name & "!" & Selection.Address(ReferenceStyle:=xlR1C1)
Next n1
Next m1
t1 = Timer() - t1
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
MsgBox (t1)
End Sub
Этот макрос тоже выполняется около четверти минуты:
В принципе, в этих всплывающих окнах вместо заголовка "Microsoft Excel" можно ввести что-то свое, например "Время в секундах:". В этом случае строка макроса, содержащая MsgBox, должна будет выглядеть так:
s1 = MsgBox(t1, , "Время в секундах:")
А вот и результат действия этого макроса с учетом этой новой (то есть измененной) строки:
А о том, какие еще можно будет внести имена в основное судоку, расскажем позже, а поэтому
- Продолжение следует...