Нет необходимости хранить счетчик в ячейке рабочей книги. Вместо этого вы можете использовать статическую переменную.
Вставьте следующий код в любой не классовый модуль:
'============================================================================================
' Module : <any non-class module>
' Version : 0.1.1
' Part : 1 of 1
' References : N/A
' Source : https://superuser.com/a/1331173/763880
'============================================================================================
Option Explicit
Public Sub Next_Click()
Const s_DestSheet As String = "Sheet1"
Const s_DestRange As String = "B5"
Const s_SrcSheet As String = "Sheet2"
Const s_SrcCell As String = "A1:A10"
Static sidxCurrentCell As Variant: If IsEmpty(sidxCurrentCell) Then sidxCurrentCell = -1
With Worksheets(s_SrcSheet).Range(s_SrcCell)
sidxCurrentCell = (sidxCurrentCell + 1) Mod .Cells.Count
.Cells(sidxCurrentCell + 1).Copy Destination:=Worksheets(s_DestSheet).Range(s_DestRange)
End With
End Sub
Затем назначьте его на свою кнопку.
Единственная проблема с этим кодом заключается в том, что он не запоминает, в какой ячейке он находился при повторном открытии книги, и перезапускается с первой ячейки. Это можно обойти при желании.
Приложение:
Если вы также хотите иметь кнопку "Назад" для циклического перемещения назад, она становится немного хитрее - вам нужна обобщенная подпрограмма «Предыдущий / следующий» с параметром для определения направления. Затем каждая кнопка должна быть назначена отдельным подпрограммам, которые вызывают основную подпрограмму с соответствующим аргументом:
'============================================================================================
' Module : <any non-class module>
' Version : 0.2.0
' Part : 1 of 1
' References : N/A
' Source : https://superuser.com/a/1331173/763880
'============================================================================================
Option Explicit
Private Sub Next_or_Previous( _
ByRef direction As Long _
)
Dim plngDirection As Long: plngDirection = direction
Const s_DestSheet As String = "Sheet1"
Const s_DestRange As String = "B5"
Const s_SrcSheet As String = "Sheet2"
Const s_SrcCell As String = "A1:A10"
Static sidxCurrentCell As Variant: If IsEmpty(sidxCurrentCell) Then sidxCurrentCell = -plngDirection
With Worksheets(s_SrcSheet).Range(s_SrcCell)
sidxCurrentCell = (sidxCurrentCell + plngDirection + .Cells.Count) Mod .Cells.Count
.Cells(sidxCurrentCell + 1).Copy Destination:=Worksheets(s_DestSheet).Range(s_DestRange)
End With
End Sub
Public Sub Previous_Click()
Next_or_Previous -1
End Sub
Public Sub Next_Click()
Next_or_Previous 1
End Sub