我正在尝试创建一个按钮来自动使用B5
另一张表的单元格中的信息填充单元格A1:A10
。
当按下按钮时,我希望B5
包含来自单元格的信息A1
。然后,当再次按下按钮时,它应该包含来自的信息,A2
依此类推。
答案1
这是一个简单的方法。
您需要一个计数器,以便每次按下按钮时计数器都增加。您需要将其放在电子表格的某个位置,在本例中,它位于按钮下方。
- 首先确定计数器的位置,在这个例子中,它将位于按钮的正下方。
- 插入你的按钮。
- 将宏分配给您的按钮,确保将其保存到工作簿。
- 将以下代码粘贴到 VBA 编辑器中以供按钮单击。
代码
Sub Button1_Click()
Dim CopySheet As Worksheet, PasteSheet As Worksheet
Dim xFrom As Integer, xTo As Integer, i As Integer
Dim pasteCell As String, cCell As String
'Sheets
Set CopySheet = Worksheets("Sheet2") 'Sheet you are copying from.
Set PasteSheet = Worksheets("Sheet1") 'Sheet you are pasting into.
'Rows, range of rows start from row rStart to rEnd
rStart = 1 'Start of Row you want to copy from.
rEnd = 10 'End of Row you want to copy from.
'Cells
pasteCell = "B5" 'Cell we will paste data from CopySheet.
'Counter will increments with each button press.
cCell = "E5" 'Change "E5" to reference cell on your spreadsheet.
i = Range(cCell).Value
Application.ScreenUpdating = False 'We disable Screen Updating to prevent interruption.
'Update Counter
i = i + 1
If (i > rEnd) Then
i = rStart
End If
Range(cCell).Value = i
'Copy/Paste Functions
CopySheet.Select
Range("A" & i).Select
Selection.Copy
PasteSheet.Select
Range(pasteCell).Select
ActiveSheet.Paste
Application.ScreenUpdating = True 'Enable Screen Updating at end of operation.
End Sub
按钮将根据计数器数字加 1 进行复制,因此如果按钮按下时的数字为 0,则宏将添加获得 0 + 1,然后开始复制和粘贴功能。
答案2
无需在工作簿的单元格中存储计数器。您可以改用静态变量。
将以下代码粘贴到任何非类模块中:
'============================================================================================
' 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
答案3
我解决这个问题的方法非常不同。
我想建议工作表选择改变事件代替按钮点击因为它避免了繁琐的循环方法任务。
工作表选择更改几乎就像按钮点击,因为购买 10 个物品需要 10 次点击,并且选择改变事件也需要类似的点击,最好的部分是顺序,可以是升序/降序甚至是随机的。
A1:A10
下面编写的代码将在鼠标单击时将单元格从指定的数据范围复制到目标工作表的单元格。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
With Sheets("Sheet2")
.Select
.Range("B5").Value = Target.Value
End With
End If
End Sub
宏的工作原理:
A1:A10
单击以下位置之间的任意单元格源表复制到目标工作表的单元格B5
。
笔记,源范围A1:A10
、目标工作表的名称Sheet2
和单元格B5
均可编辑。