如何编写螺旋式的代码?

时间:2018-09-04 07:43:28

标签: excel vba excel-vba spiral

我刚刚开始学习在Excel VBA中进行编程,但遇到了问题。 我想用程序绘制螺旋线,但是不能很好地解决它。 我只想使用fordo untildo while个周期。

这是我的代码:

 Sub spiral()
    For i = 1 To 16
        xmm = xmm - 1
        ymm = ymm - 1

        Do Until xp = i
            xp = xp + 1
            Cells(5 + xp, 5) = i
        Loop

        Do Until yp = i
            yp = yp + 1
            Cells(5 + xp, 5 + yp) = i + 1
        Loop

        Do Until xm > xp
            xm = xm + 1
            Cells(5 + xp + i * xmm, 5 + yp) = i + 2
        Loop

        Do Until ym > yp
            ym = ym + 1
            Cells(5 + xp + xmm, 5 + yp + i * ymm) = i + 3
        Loop
    Next i
End Sub

谢谢!

2 个答案:

答案 0 :(得分:3)

我想不出你需要这个的任何实际原因,但是那就是说,我经常在浪费时间去处理一些奇怪的任务,“只是看我是否可以。”


访问VBA圈子

最近,螺旋形是我在 SQL 中玩过的一项自我分配的挑战,尽管它起源于 Access中的圆圈 VBA 来自我的另一个无用项目:

这教会了我许多概念,包括如何在网格上绘制圆

绘制圆圈几乎与在该时钟上绘制指针相同。如果不是只画时钟的整条线,而是只画了它的 tip (即半径),一直到360°,那我就有一个圆。


SQL Circle

十倍快!

有一天,我想知道利用Stack Exchange Data Explorer(SEDE)的图形功能将圆形代码转换为 SQL Server 有多困难。图是在网格上绘制的,所以它是相同的概念。

以下是几种结果之一(再次都是无效的):

单击运行查询,然后在完成计算后,单击 Graph 标签。 (您还需要使用您的Stack Exchange ID登录或进行验证码。)在用户提示下(SQL下方)可以使用各种常量。


SQL螺旋

然后在某个时候我想知道螺旋
(...但可能应该是我该死的时候了?Naaaa,哈哈)

螺旋线只是一个修改过的圆,只是半径随着您沿圆周的前进而减小(或增大)-并且您不会在360°处停下来-而是继续前进,并以稳定的速度不断改变半径。

再次,单击运行查询,然后在完成计算后,单击 Graph 标签。 (您还需要使用您的Stack Exchange ID登录或进行验证码。)在用户提示下(SQL下方)可以使用各种常量。


Excel中的螺旋

我今天不会在螺旋上浪费更多的时间,但是如果我要在Excel工作表单元格中绘制一个,我会将工作表上的所有单元格调整为一个很小的正方形网格(也许width = 1,height = 10),然后我将从SQL示例中借用代码,将其改编为Excel(这不会花费很多工作)。

Access VBA示例可能更难以适应,因为正在进行许多控件的编程操作(无法在运行时完成)。

或者,可以在Excel中使用控件(即线条)代替您迄今为止尝试的网格方法来复制Access示例。


更多信息:

答案 1 :(得分:2)

基于此线程(Looping in a spiral)的一些答案,我设法提供了该解决方案

Sub spiral()
x = 0
y = 0
d = 1
m = 1
i = 1
j = 1
Do While i < 6
    Do While 2 * x * d < m
        Cells(x + 5, y + 5).Value = j
        x = x + d
        j = j + 1
    Loop
    Do While 2 * y * d < m
        Cells(x + 5, y + 5).Value = j
        y = y + d
        j = j + 1
    Loop
    d = -1 * d
    m = m + 1
    i = i + 1
Loop
End Sub

不确定您是否正在寻找它,因为您没有指定要实现的确切输出。