vbnet
Sub 从第X行复制数据插入到第Y行到Z行(表对象 As Worksheet, 数据来自X行, 插入开始于Y行 As Long, 插入结束于Z行 As Long, Optional 模式_插入加复制 As Integer = 3)
'从X行复制数据插入到Y_Z行
插入数据并复制 表对象, 插入开始于Y行, 数据来自X行, 插入结束于Z行 - 插入开始于Y行 + 1, 模式_插入加复制
End Sub
Sub 插入数据并复制(SheetA As Worksheet, 插入到X行 As Long, ByVal 数据来源行Y As Long _
, Optional ByVal N行 As Long = 1, Optional 模式_插入加复制 As Integer = 3) '
'功能说明:在第X行位置插入N行,用Y行的内容克隆填充(复制粘入N次,不占用剪贴板)
'模式 = 1 '只插入,模式=2,只复制,模式=3同时执行
'难点:主要就是有公式,所以头大,代码还能优化吗,如何取函数名称更直观易懂
'不用中文,英文当词是真没法写。
' 禁用屏幕更新和计算以提升性能
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
If 模式_插入加复制 = 2 Then ' 只复制
'不插入
Else
'在第X行位置插入N行
SheetA.Rows(插入到X行 & ":" & 插入到X行 + N行 - 1).Insert Shift:=xlDown
If 数据来源行Y > 插入到X行 Then
数据来源行Y = 数据来源行Y + N行 - 1
End If
End If
If 模式_插入加复制 = 1 Then GoTo DoEND
'复制第10行内容到第1-5行
'直接传输第10行数据到第1-5行(不经过剪贴板)或X+5-1行
'不自个封装一下,代码是守全看不懂
With SheetA
.Rows(数据来源行Y).Copy Destination:=.Rows(插入到X行 & ":" & (插入到X行 + N行 - 1))
' 清除复制后保留的虚线边框
Application.CutCopyMode = False
End With
DoEND:
' 恢复设置
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
优化说明
-
命名规范:
- 使用英文命名,遵循VBA惯例
- 函数名采用动词+名词结构(如CopyDataFromRowToRange)
- 参数名明确表达用途(如ws表示工作表对象)
-
枚举类型:
- 定义OperationMode枚举,包含三种操作模式
- 使代码更易读且类型安全
-
公式处理:
- 添加了ws.Calculate强制重算公式
- 确保复制的公式能正确计算
-
性能优化:
- 保持原有的屏幕更新和计算设置
- 添加了错误处理
-
代码结构:
- 层次分明,逻辑清晰
- 添加了详细的参数说明注释
此优化版本在保持原有功能的基础上,显著提高了代码的可读性和维护性,特别适合处理包含公式的Excel数据操作。

vbnet
Private Enum OperationMode ' 操作模式枚举
InsertOnly = 1
CopyOnly = 2
InsertAndCopy = 3
End Enum
' 主函数:从指定行复制数据插入到目标行范围
Sub CopyDataFromRowToRange(ws As Worksheet, sourceRow As Long, _
startRow As Long, endRow As Long, _
Optional mode As OperationMode = InsertAndCopy)
' 参数说明:
' ws - 工作表对象
' sourceRow - 数据来源行号
' startRow - 插入开始行号
' endRow - 插入结束行号
' mode - 操作模式(枚举值)
' 调用核心处理函数
InsertAndCopyData ws, startRow, sourceRow, endRow - startRow + 1, mode
End Sub
vbnet
' 核心处理函数:插入行并复制数据
Sub InsertAndCopyData(ws As Worksheet, insertRow As Long, _
sourceRow As Long, rowCount As Long, _
Optional mode As OperationMode = InsertAndCopy)
' 参数说明:
' insertRow - 插入开始行号
' sourceRow - 数据来源行号
' rowCount - 要插入的行数
' mode - 操作模式(枚举值)
On Error GoTo CleanUp
' 性能优化
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
' 处理插入操作
If mode <> CopyOnly Then
' 插入行
ws.Rows(insertRow & ":" & insertRow + rowCount - 1).Insert Shift:=xlDown
' 调整源行号(如果插入行在源行上方)
If sourceRow >= insertRow Then
sourceRow = sourceRow + rowCount
End If
End If
' 处理复制操作
If mode <> InsertOnly Then
' 直接复制数据(不经过剪贴板)
ws.Rows(sourceRow).Copy Destination:=ws.Rows(insertRow & ":" & insertRow + rowCount - 1)
Application.CutCopyMode = False
' 强制重算公式
ws.Calculate
End If
CleanUp:
' 恢复设置
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
On Error Resume Next
End Sub