【问题标题】:How do I create an Excel Macro that will auto scroll and loop back to the beginning?如何创建一个自动滚动并循环回到开头的 Excel 宏?
【发布时间】:2018-06-08 15:15:10
【问题描述】:

所以我是 Excel 中 VBA/宏的初学者,所以请多多包涵。

最终,我们在商店的电视上显示电子表格,我希望实现一个自动滚动功能,该功能将缓慢滚动到数据的末尾,并在到达末尾时循环回来,连续执行此操作。

到目前为止我有这个:

Sub Macro12()
    Range("A1").Select
Do Until IsEmpty(ActiveCell)
    ActiveWindow.SmallScroll Down:=2
Loop
End Sub

它滚动,但它一直在继续。我怎样才能让它循环回到开头并在一个连续的循环中重新开始?

谢谢!

【问题讨论】:

  • 看看这个SO question,它可能会有所帮助。您还可以在 Google 上搜索“滚动行”。

标签: excel autoscroll vba


【解决方案1】:

这对我有用:

Sub Macro12()
Dim lastRow As Long, i As Long
lastRow = Range("A" & Rows.Count).End(xlUp).Row

For i = 1 To lastRow Step 2
    Cells(i, 1).Select
    ActiveWindow.SmallScroll down:=2
    Application.Wait (Now + TimeValue("0:00:05")) 'Wait five seconds before continuing.
    If i = lastRow - 2 Or i = lastRow - 1 Then
        i = 0
        Cells(1, 1).Select
    End If
Next i
Debug.Print (i)

End Sub

但请注意,这是一个无限循环。这可能(可能)最终导致 Excel 崩溃。

【讨论】:

  • 您可以将循环包装在计时器中以停止其无限性(我编造了这个词!)
  • 这太棒了!一个小问题:假设最后一行包含信息的是第 35 行,但我不希望它一直向下滚动到 35,我希望它在 23 处停止并循环回来(因为滚动到 35 只会在 35 和一堆空白行中显示信息),我是否可以在这里声明: For i = 1 To lastRow Step 2
  • @user1036131 - 是的,如果您知道具体的行,只需执行For i = 1 to 23 Step 2
  • @user1036131 - 您将在For Each ... Next 循环周围包裹Do ... Loop Until 语句。 Do ... Loop Until Now > TimeValue("15:00:00") 之类的东西在下午 3 点后停止。或者,如果您事先将其定义为变量,则可以在指定的时间段后停止它。有很多选择,但如果你遇到困难,我会单独写一个问题。
【解决方案2】:

这是一次滚动大约五分之一页面直到到达页面底部的页面。如果您觉得它移动得太快/太慢,您可以调整计时器

Sub ScrollToBottom()

    Dim lastrow As Integer
    lastrow = Range("A" & Rows.count).End(xlUp).row

    While Intersect(Rows(lastrow), ActiveWindow.VisibleRange) Is Nothing
        Application.Wait (Now + TimeValue("0:00:01"))
        ActiveWindow.SmallScroll down:=Round(ActiveWindow.VisibleRange.Rows.count / 5, 0)
    Wend

    Application.Wait (Now + TimeValue("0:00:03"))
    ActiveWindow.ScrollRow = 1

End Sub

【讨论】:

  • 如果您只想滚动到第 23 行,与我的调整相同 - 只需设置 lastrow = 23
  • 要让它滚动更慢你可以添加到计时器,让它滚动less你可以增加ActiveWindow.VisibleRange.Rows.count / 3中的数字3
【解决方案3】:

这是我的看法:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub LoopBackAndForth()
    Dim i As Long, j As Long
    Dim rng As Range

    i = 1
    With ActiveSheet ' change sheet if required
        Set rng = .Range("A" & i)
        rng.Select
        Do Until rng.Value = vbNullString
            i = i + 1
            Set rng = .Range("A" & i)
            Sleep 75 ' the optimal value may vary from pc to pc
            ActiveWindow.SmallScroll down:=1 ' changed from 2 in the original post
        Loop

        For i = i To 1 Step -1
            Set rng = .Range("A" & i)
            Sleep 75 ' the optimal value may vary from pc to pc
            ActiveWindow.SmallScroll up:=1 ' changed from 2 in the original post
        Next i

    End With
End Sub

【讨论】:

    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多