该文章介绍了一段VBA代码,用于根据A3单元格的输入值动态复制Excel第11行数据并在A列填充顺序编号。当输入值改变时,代码能自动调整行数,如果输入为0或1,只保留一行并填充序号。此外,如果输入值小于已复制的行数,代码会清除多余的数据行。这段代码基于工作表的Change事件触发。
摘要由CSDN通过智能技术生成
实例需求:根据A3单元格(黄色)的输入值动态复制第11行数据,并且在A列填充顺序编号,如下图所示。
如果A3单元格输入的数值小于当前已复制的行数,则清除多余数据行。如果A3单元格为0时,则仅保留序号1的行内容,和A3单元格为1时的效果相同,如下图所示。
根据单元格内容变化出发代码实现效果,通常使用工作表的Change事件,示例代码如下。
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge = 1 And .Cells(1).Address = "$A$3" And .Cells(1) <> "" Then
Application.EnableEvents = False
iQty = .Value
If iQty > 1 Then
Set rngData = [a11:X11]
rngData.Copy
With [a12].resize(iQty - 1, 1)
.Select
ActiveSheet.Paste
.Formula = "=row()-10"
.Formula = .Value
End With
End If
If iQty = 0 Then iQty = 1
iLstRow = Cells(Rows.Count, 1).End(xlUp).Row
If iLstRow > iQty + 10 Then
Range(iQty + 11 & ":" & iLstRow).Clear
End If
.Select
Application.CutCopyMode = False
Application.EnableEvents = True
End If
End With
End Sub
【代码解析】
第3行代码判断发生变化的单元格(参数Target
代表的Range对象)是否满足如下条件。
判断条件 | 说明 |
---|
.CountLarge = 1 | 发生变化的为单个单元格 |
.Cells(1).Address = “$A$3” | 单元格地址为A3,注意此处需要使用绝对引用地址 |
.Cells(1) <> “” | 单元格内容不为空 |
第4行代码禁用系统事件,避免代码修改单元格内容导致再次激活Change事件,进而可能导致死循环。
第5行代码读取Target单元格内容(下文简称为输入)。
第6行代码判断输入是否大于1,如果满足条件第7~14行代码复制数据行,并且更新序号列。
第7~8行代码拷贝被复制的数据行。
第10行代码选中粘贴区域的第一列单元格区域。
第11行代码粘贴数据行。
第12行代码在序号列设置公式。
第13行代码将序号列的公式转换为数值。
第16行代码更新iQty变量的值,输入为0时的效果与为1时相同,这样可以简化后续代码。
第17~20行代码用于实现当数据行总数大于输入值时,清理多余数据行。
第17行代码获取最后数据行的行号。
第18行代码判断数据行总数是否大于输入值,如果满足条件,第19行代码清空多余的数据行。
第21行代码选中Target单元格。
第22行代码清空系统剪切板。
第23行代码恢复系统事件机制。
'复制单元格内容示例1
'注意:单元格的格式、公式、批注等也会被复制过去哟
Sheets(1).Range("A1").Copy Sheets(1).Range("B1")
End Sub
Sub CopyRange2()
'复制单元格内容示例2,打开