VBA程序:在Excel中生成奇数阶魔方

2022-06-04 10:06:25 浏览数 (1)

标签: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,很有意思的一段程序。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

vba

0 人点赞