ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: ctp_119

[原创] vba自动生成旋转数字序列

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-10 10:16 | 显示全部楼层
Sub main()
Cells.ClearContents
w = InputBox("请输入奇数维数!!!")

b = (w + 1) / 2
Cells(b, b) = 1

For i = 1 To w Step 2
    a = (i - 1) / 2
    For j = 0 To i - 2
        Cells(b + a, b - a).Offset(0, j) = i * (i - 0) + 0 - j
        Cells(b + a, b + a).Offset(-j, 0) = i * (i - 1) + 1 - j
        Cells(b - a, b + a).Offset(0, -j) = i * (i - 2) + 2 - j
        Cells(b - a, b - a).Offset(j, 0) = i * (i - 3) + 3 - j
    Next
Next

End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-10 10:42 | 显示全部楼层
zopey 发表于 2018-9-10 10:16
Sub main()
Cells.ClearContents
w = InputBox("请输入奇数维数!!!")

这方法奇特!!!好!!!好好学习

TA的精华主题

TA的得分主题

发表于 2018-9-10 11:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

发表于 2018-9-10 11:44 | 显示全部楼层
香川群子 发表于 2018-9-10 11:16
以前讨论过了。
http://club.excelhome.net/thread-1109068-1-1.html

四角同时推进算法,这名字比较形象。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-10 12:11 | 显示全部楼层
香川群子 发表于 2018-9-10 11:16
以前讨论过了。
http://club.excelhome.net/thread-1109068-1-1.html

哦,以前就有了!!!呵呵,,,不好意思,,,不过还是有学习的价值!!!

TA的精华主题

TA的得分主题

发表于 2018-9-10 12:19 | 显示全部楼层
'参与一下
Option Explicit

Const NUM As Long = 21

Sub test()
  Dim i As Long, j As Long, k As Long
  Dim a As Long, b As Long, m As Long, cnt As Long
  If NUM Mod 2 = 0 Then MsgBox "!": Exit Sub
  ReDim arr(1 To NUM, 1 To NUM) As Long
  a = NUM: b = 1: m = NUM ^ 2: cnt = NUM
  For i = NUM ^ 2 To 2 Step -1
      For j = 1 To 4
        For k = 1 To cnt - 1
          arr(a, b) = m: m = m - 1
          Select Case j
          Case 1: b = b + 1
          Case 2: a = a - 1
          Case 3: b = b - 1
          Case 4: a = a + 1
          End Select
      Next k, j
      b = b + 1: a = a - 1: cnt = cnt - 2: i = m + 1
  Next
  arr(a, b) = m
  ActiveSheet.UsedRange.ClearContents
  [a1].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub

TA的精华主题

TA的得分主题

发表于 2018-9-10 14:09 | 显示全部楼层
zopey 发表于 2018-9-10 11:44
四角同时推进算法,这名字比较形象。

多数人叫  四方图  或  四方跑马灯

TA的精华主题

TA的得分主题

发表于 2018-9-10 15:00 | 显示全部楼层
也湊个热闹,支持顺时、逆时,支持任意步长,支持任意方向……
  1. '顺时针起始方向
  2. Enum Clockwise_Start
  3.     Top = 0
  4.     Right = 1
  5.     Bottom = 2
  6.     Left = 3
  7. End Enum
  8. '逆时针起始方向
  9. Enum AntiClockwise_Start
  10.     Top = 0
  11.     Right = 3
  12.     Bottom = 2
  13.     Left = 1
  14. End Enum

  15. Const Clockwise  As String = "T,R,B,L,T,R,B,L" '顺时针方向
  16. Const AntiClockwise  As String = "T,L,B,R,T,L,B,R" '逆时针方向

  17. Dim lngStartNum As Long '数字初始值
  18. Dim lngStep As Long '步长值
  19. Dim lngRowID As Long, lngColID As Long '行列标号
  20. Dim lngCount As Long '计数
  21. Dim arrDirection()  As String   '运动方向数组
  22. Dim curDirection As Integer '当前方向索引
  23. Dim lngMax As Long '最大维度
  24. Dim arrResult As Variant '结果集
  25. Dim blIsOk As Boolean
  26. Dim lngStepCount As Long

  27. '主入口,测试
  28. Sub Main()
  29.     '从9开始的11*11矩阵
  30.     lngMax = 11 '最大维度
  31.     'arrDirection = SetDirection(AntiClockwise, AntiClockwise_Start.Top) '逆时针,先向上
  32.     arrDirection = SetDirection(AntiClockwise, AntiClockwise_Start.Bottom) '逆时针,先向下
  33.     curDirection = 0: lngStepCount = 1
  34.     lngStartNum = 9: lngStep = 2 '初始为9,步长为2
  35.     lngRowID = (lngMax + 1) / 2: lngColID = (lngMax + 1) / 2
  36.     ReDim arrResult(1 To lngMax, 1 To lngMax) As Long
  37.    
  38.     arrResult(lngRowID, lngColID) = lngStartNum '中间填入初始值
  39.     blIsOk = False
  40.     Do Until blIsOk = True
  41.         SetResult
  42.     Loop
  43.    
  44.     Sheet1.Range("A1").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
  45.     MsgBox "OK"
  46. End Sub

  47. '运算过程
  48. Function SetResult()
  49.     Dim lngR As Long, lngC As Long

  50.     For lngR = 1 To 2
  51.         For lngC = 1 To lngStepCount
  52.             lngCount = lngCount + 1
  53.             If lngCount >= (lngMax ^ 2) Then
  54.                 blIsOk = True
  55.                 Exit Function
  56.             End If
  57.             lngStartNum = lngStartNum + lngStep
  58.             Select Case arrDirection(curDirection)
  59.                 Case "T"
  60.                     lngRowID = lngRowID - 1
  61.                 Case "B"
  62.                     lngRowID = lngRowID + 1
  63.                 Case "L"
  64.                     lngColID = lngColID - 1
  65.                 Case "R"
  66.                     lngColID = lngColID + 1
  67.             End Select
  68.             arrResult(lngRowID, lngColID) = lngStartNum
  69.         Next
  70.         curDirection = (curDirection + 1) Mod 4
  71.     Next
  72.    
  73.     lngStepCount = lngStepCount + 1
  74. End Function

  75. '返回运动方向
  76. Function SetDirection(strDirection As String, intStartDir As Integer) As Variant
  77.     Dim strT() As String, intI As Integer
  78.     Dim arrTemp(0 To 3) As String
  79.     strT = Split(strDirection, ",")
  80.     For intI = 0 To 3
  81.         arrTemp(intI) = strT(intStartDir + intI)
  82.     Next
  83.     SetDirection = arrTemp
  84. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-10 17:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2018-9-10 10:16
Sub main()
Cells.ClearContents
w = InputBox("请输入奇数维数!!!")

Sub main1()
    Cells.ClearContents
   
    n = InputBox("请输入方阵边长数n=(必须为奇数)", "生成内螺旋方阵", 11)
    r = (n + 1) / 2
   
    For i = n - 1 To 0 Step -2
        t = i / 2: m = (i + 1) * (i + 1)
        For j = 0 To i - 1
            Cells(r + t, r - t).Offset(0, j) = m - j
            Cells(r + t, r + t).Offset(-j, 0) = m - j - i
            Cells(r - t, r + t).Offset(0, -j) = m - j - 2 * i
            Cells(r - t, r - t).Offset(j, 0) = m - j - 3 * i
        Next
    Next
    Cells(r, r) = 1

End Sub
Sub main2()
    Cells.ClearContents
   
    n = InputBox("请输入方阵边长数n=(必须为奇数)", "生成外螺旋方阵", 11)
    r = (n + 1) / 2
   
    For i = n - 1 To 0 Step -2
        t = i / 2: m = (n + i + 1) * (n - i - 1) + 1
        For j = 0 To i - 1
            Cells(r + t, r - t).Offset(0, j) = m + j
            Cells(r + t, r + t).Offset(-j, 0) = m + j + i
            Cells(r - t, r + t).Offset(0, -j) = m + j + 2 * i
            Cells(r - t, r - t).Offset(j, 0) = m + j + 3 * i
        Next
    Next
    Cells(r, r) = n * n
   
End Sub

借用你的代码,修改一下,分别生成内螺旋方阵,和外螺旋方阵。

如果一步一步走,更清晰地看到数字的递增、递减变化。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-29 07:44 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 04:55 , Processed in 0.047366 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表