当前位置: 首页 > article >正文

【VBA】【EXCEL】将某列内容横向粘贴到指定行

Sub CopyRowToColumn()
    On Error GoTo ErrorHandler  '添加错误处理
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False  '禁用事件处理
    
    Dim lastCol As Long
    Dim lastRow As Long
    Dim i As Long, colCount As Long
    Dim ws As Worksheet
    Dim formulaStr As String
    Dim dataArr() As Variant  '使用数组来处理数据
    
    Set ws = ThisWorkbook.Worksheets("03.Obj Geom - Point Coordinates")
    
    '获取F列的最后一行
    lastRow = ws.Range("F" & ws.Rows.Count).End(xlUp).Row
    
    With ws
        '计算需要生成的列数
        colCount = lastRow - 3
        lastCol = 6 + colCount
        
        '将F列数据读入数组
        dataArr = .Range(.Cells(4, 6), .Cells(lastRow, 6)).Value
        
        '设置第3行的值
        For i = 1 To colCount
            .Cells(3, i + 6).Value = dataArr(i, 1)
        Next i
        
        '每次处理50列,分批设置公式
        Dim batchSize As Long
        Dim currentCol As Long
        batchSize = 50
        
        For currentCol = 7 To lastCol Step batchSize
            Dim endCol As Long
            endCol = Application.Min(currentCol + batchSize - 1, lastCol)
            
            '为这一批列设置公式
            For i = currentCol To endCol
                Dim colAddr As String
                colAddr = .Cells(3, i).Value
                
                formulaStr = "=IFERROR(ROUND(SQRT(((VLOOKUP(""" & colAddr & """,$A$1:$D$" & lastRow & ",2,FALSE)-" & _
                            "VLOOKUP($F{row},$A$1:$D$" & lastRow & ",2,FALSE))^2+" & _
                            "(VLOOKUP(""" & colAddr & """,$A$1:$D$" & lastRow & ",3,FALSE)-" & _
                            "VLOOKUP($F{row},$A$1:$D$" & lastRow & ",3,FALSE))^2))*1000,0),"""")"
                
                .Cells(4, i).Formula = Replace(formulaStr, "{row}", "4")
                
                If lastRow > 4 Then
                    .Cells(4, i).AutoFill _
                        Destination:=.Range(.Cells(4, i), .Cells(lastRow, i)), _
                        Type:=xlFillDefault
                End If
                
                '每10列清理一次剪贴板和内存
                If i Mod 10 = 0 Then
                    Application.CutCopyMode = False
                    DoEvents
                End If
            Next i
        Next currentCol
    End With
    
CleanExit:
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.CutCopyMode = False
    MsgBox "操作完成!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "发生错误: " & Err.Description, vbCritical
    Resume CleanExit
End Sub

在这里插入图片描述

流程图

错误
开始
禁用Excel自动更新
获取工作表引用
获取F列最后一行
计算需要生成的列数
读取F列数据到数组
横向复制F列数据到第3行
分批处理列公式
是否还有未处理的列?
设置当前批次的列范围
构建距离计算公式
填充公式到整列
清理内存
恢复Excel设置
结束
错误处理

核心算法说明

1. 距离计算公式

距离计算采用欧几里得距离公式:

Distance = √[(x₂-x₁)² + (y₂-y₁)²] * 1000

2. 主要步骤

  1. 数据预处理:

    • 获取数据范围
    • 将F列数据读入数组
    • 横向复制到第3行
  2. 公式生成:

    • 分批处理以优化性能
    • 使用VLOOKUP查找坐标
    • 应用距离公式计算
  3. 性能优化:

    • 批量处理数据
    • 定期清理内存
    • 使用数组减少单元格访问

代码结构

Sub CopyRowToColumn()
    '初始化设置
    '数据处理
    '公式填充
    '清理工作
End Sub

注意事项

  1. 内存管理:

    • 分批处理数据
    • 定期清理剪贴板
    • 使用数组代替直接单元格操作
  2. 错误处理:

    • 完整的错误处理机制
    • Excel设置的正确还原
    • 用户友好的错误提示
  3. 性能考虑:

    • 禁用屏幕更新
    • 禁用自动计算
    • 批量处理数据

http://www.kler.cn/a/473016.html

相关文章:

  • Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
  • MacBook Linux 树莓派raspberrypi安装Golang环境
  • GoChina备案管家
  • [Linux]redis5.0.x升级至7.x完整操作流程
  • 23.行号没有了怎么办 滚动条没有了怎么办 C#例子
  • 【JAVA】java中将一个list进行拆解重新组装
  • 点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)
  • P1909 [NOIP2016 普及组] 买铅笔 题解
  • python初体验: 处理excel数据
  • redis的学习(四)
  • UART串口数据分析
  • 一个海外产品经理的 AI 日常
  • Linux下常用命令
  • Lua协同程序(线程)
  • 【Linux】进程铺垫——冯诺依曼体系与操作系统概念
  • 代码随想录-训练营-day1
  • SQL 数据类型
  • 个人博客搭建(二)—Typora+PicGo+OSS
  • 哈密顿原理
  • 基于华为ENSP的OSPF数据报文保姆级别详解(3)
  • Python requests库过指纹检测
  • 《HeadFirst设计模式》笔记(上)
  • 深入理解 Java 接口的回调机制
  • 认识+安装ElasticSearch
  • MySQL的三大日志
  • 【机器视觉】OpenCV 滤波器(卷积、方盒/均值滤波、高斯滤波、中值/双边滤波、sobel/scharr/拉普拉斯算子、边缘检测Canny)