标签:VBA
大家都知道魔方,因为经常会遇到它。魔方是正方形网格,它的最小尺寸为3×3。魔方中的整数只出现一次,所有单元格都填充数字。水平行、垂直列以及主对角线和次对角线的数字加起之和都相同。这个数字和就叫做魔法常数。
下面是构造奇数阶魔方的VBA代码,即可以创建大小为3×3、5×5、7×7、9×9、……的魔方。
创建奇数阶魔方的逻辑可以百度,并已体现在VBA编码中。程序将询问所需魔方的大小,并将从单元格B2开始创建魔方,并在创建的魔方周围设置粗边框。代码中将B2作为变量,这样,如果想更改起始单元格,就可以直接修改。
代码如下:
代码语言:javascript复制Sub MakeOddMagicSquare()
Application.ScreenUpdating = False
On Error GoTo Exit Sub
Dim Size As Long, InputNumber As Long, r AsLong, c As Long, GridSize As Long
Dim FirstRow As Long, FirstCol As Long,LastRow As Long, LastCol As Long
Dim OriginalRow As Long, OriginalCol As Long
Cells.Clear
Size = Application.InputBox("魔方大小, 数字必须是大于2的奇数", Type:=1)
If Size = 0 Then GoTo ExitSub
'测试大小 -数字必须是奇数且应该 >=3
If WorksheetFunction.IsEven(Size) Or Size< 3 Then
MsgBox ("数字必须是奇数且不小于3")
GoTo ExitSub
End If
'让魔方开始于单元格B2...当然,可以只是改变FirstRow和SecondRow
FirstRow = 2
FirstCol = 2
LastRow = FirstRow Size - 1
LastCol = FirstCol Size - 1
'清除魔方区域
Range(Cells(FirstRow - 1, FirstCol - 1),Cells(LastRow 1, LastCol 1)).Clear
'根据尺寸参数确定中间列,行将保持不变
'这将是放置值1的单元格
r = FirstRow
c = FirstCol - 1 WorksheetFunction.RoundUp(Size / 2, 0)
'确定元素个数
GridSize = Size ^ 2
'在这里放置值1
InputNumber = 1
Cells(r, c) = InputNumber
'规则是上移和右移.如果在向上和向右移动的过程中,到了中心外面,那么需要绕过去
'如果已经填写了数字,向下继续
Do Until GridSize = 1
GridSize = GridSize - 1
OriginalRow = r
OriginalCol = c
r = r - 1
If r < FirstRow Then r = LastRow
c = c 1
If c > LastCol Then c = FirstCol
If Cells(r, c) <> ""Then
r = OriginalRow 1
c = OriginalCol
End If
InputNumber = InputNumber 1
Cells(r, c) = InputNumber
Loop
'在魔方周围应用粗边框
Range(Cells(FirstRow, FirstCol),Cells(LastRow, LastCol)).BorderAround Weight:=xlMedium
'自动调整魔方
Cells.EntireColumn.AutoFit
Cells.EntireRow.AutoFit
ExitSub:
Application.ScreenUpdating = True
End Sub
运行代码后,获取的5阶魔方如下图1所示。
图1
注:代码整理自eforexcel.com,很有意思的一段程序。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。