EXCEL VBA-从X行复制数据插入到Y_Z行

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

优化说明

  1. 命名规范‌:

    • 使用英文命名,遵循VBA惯例
    • 函数名采用动词+名词结构(如CopyDataFromRowToRange)
    • 参数名明确表达用途(如ws表示工作表对象)
  2. 枚举类型‌:

    • 定义OperationMode枚举,包含三种操作模式
    • 使代码更易读且类型安全
  3. 公式处理‌:

    • 添加了ws.Calculate强制重算公式
    • 确保复制的公式能正确计算
  4. 性能优化‌:

    • 保持原有的屏幕更新和计算设置
    • 添加了错误处理
  5. 代码结构‌:

    • 层次分明,逻辑清晰
    • 添加了详细的参数说明注释

此优化版本在保持原有功能的基础上,显著提高了代码的可读性和维护性,特别适合处理包含公式的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
相关推荐
小Tomkk5 小时前
一个学校随机点名系统(代excel 自定义导入名字,+随机点名)
excel
未来之窗软件服务14 小时前
万象EXCEL开发(十二)excel 结构化查询 ——东方仙盟金丹期
excel·仙盟创梦ide·东方仙盟·万象excel
专注VB编程开发20年3 天前
VB6.0找不到该引用word,excel“Microsoft Excel 16.0 Object Library”解决方法
word·excel·vba·vsto
林月明3 天前
【VBA】点击按钮,实现将Excel表A数据按格式填入表B
excel·vba
Bella_chene4 天前
Excel转PDF不分页
pdf·excel
goto_w4 天前
前端实现复杂的Excel导出
前端·excel
@小红花5 天前
数据分析-Excel-常用函数
数据挖掘·数据分析·excel
瀚高PG实验室5 天前
Navicat导入Excel至瀚高数据库
数据库·excel·瀚高数据库
专注VB编程开发20年5 天前
专业VBA代码优化服务邀约‌,OFFICE excel计算优化,wrod报表生成
vba·vba优化