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
相关推荐
百事牛科技4 小时前
Excel打开密码怎么设置?一篇讲清楚
windows·excel
玩泥巴的4 小时前
基于.NET操作Excel COM组件生成数据透视报表
c#·.net·excel·二次开发·com互操作
2301_800256114 小时前
【数据库】查找距离最近的电影院 pgSQL 存储过程片段
大数据·数据库·excel
城数派5 小时前
我国省市县三级逐日、逐月和逐年降水数据(Shp/Excel格式)1960-2024年
大数据·数据分析·excel
WKP94186 小时前
POI操作excel示例
java·开发语言·excel
用一个不重复的昵称6 小时前
excel 去除特殊字符,仅保留中英文字符和数字
excel
fensnote6 小时前
QT使用QtXlsxWriter读取excel文件
开发语言·qt·excel
高山莫衣6 小时前
读取手机通信录vCard文件(后缀vcf)文件并导出为excel表格
智能手机·excel
jogging6 小时前
mysql导出表结构信息到excel【DBeaver】
mysql·oracle·excel·导出·表结构
未来之窗软件服务7 小时前
万象EXCEL应用(二十二) Excel火锅店物资采购自动统计台账报表——东方仙盟炼气期
excel·仙盟创梦ide·东方仙盟·万象excel