ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: mumu2659

大神来帮忙!优化数据处理过程,提升执行时间。

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-30 08:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
测试的时候输入15即可,demo数据整理后会有八十多行二十几列的数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-30 08:43 | 显示全部楼层
ykcbf1100 发表于 2024-1-30 08:14
你最好做个效果图,帮助别人理解
看你的代码,不知道cycleTime1值是从哪来的

新的回复附件里面增加了代码,cycleTime1值是跳对话框输入的,这个demo数据需要输入15。十分感谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-30 09:11 | 显示全部楼层
为了方便理解,我把之前写的效率低的代码也贴进去了,Sub DataCollectionD()可以直接运行,上面的Sub OptimizedDataCollectionD()就是改数组方式的,但是有错误运行不了,我的excell版本是2013,供参考!

demodata.zip

54.3 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2024-1-30 15:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-30 16:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub OptimizedDataCollectionD()
    ' 声明变量
    Dim DataQty As Long
    Dim cycleTimeDelta As Single
    Dim i As Long, j As Long, k, n As Long, x As Long, y As Long
    Dim StartTime As Single
    Dim EndTime As Single
    Dim dataArray() As Variant
    Dim resultArray() As Variant
    Dim StartPaseColumn As Integer
    Dim MaxDataLen As Integer
    Dim numRows As Long
    Dim numCols As Long
    Dim tempArray() As Variant ' 临时数组用于暂存结果
    Dim dic As Object, d As Object
    Set dic = CreateObject("Scripting.Dictionary")
    Set d = CreateObject("Scripting.Dictionary")
   
    '数据帧间隔时间长度设置
    cycleTime1 = 15
   
    If cycleTime1 = False Then Exit Sub
    ' 检查数据格式
    If Not Cells(1, 1).Value Like "*Time*" Then
        MsgBox "Data format incorrect!"
        Exit Sub
    End If
   
    ' 开始计时
    StartTime = Timer
   

    ' 获取数据范围并将数据读入数组
    DataQty = Cells(Rows.Count, 2).End(xlUp).Row
    dataArray = Range("A1:B" & DataQty).Value

    ' 初始化变量
    n = 1
    i = 1
    StartPaseColumn = 7  ' 从第一行的第7列开始粘贴数据

    ' 处理数据
    ' 初始化数组大小
    numRows = 1 ' 初始行数
    numCols = 1 ' 初始列数
   
    ReDim tempArray(1 To 1) ' 初始化结果数组
        
    For j = 2 To UBound(dataArray) - 1
        ' 计算时间差
        cycleTimeDelta = Abs(Abs(dataArray(j + 1, 1)) - Abs(dataArray(j, 1)))
        
        If cycleTimeDelta * 1000 > cycleTime1 Then
            ReDim Preserve tempArray(1 To UBound(tempArray) + 1)
            tempArray(UBound(tempArray)) = dataArray(j, 2)
            dic(dic.Count) = tempArray
            ReDim tempArray(1 To 1)
            d("A" & j + 1) = True
        Else
            ReDim Preserve tempArray(1 To UBound(tempArray) + 1)
            tempArray(UBound(tempArray)) = dataArray(j, 2)
        End If
    Next j
    ReDim Preserve tempArray(1 To UBound(tempArray) + 1)
    tempArray(UBound(tempArray)) = dataArray(j, 2)
    dic(dic.Count) = tempArray
    ReDim resultArray(1 To dic.Count + 1, 1 To 1)
    j = 1
    For Each k In dic.Keys
        j = j + 1
        tempArray = dic(k)
        If UBound(tempArray) - 1 > UBound(resultArray, 2) Then ReDim Preserve resultArray(1 To UBound(resultArray), 1 To UBound(tempArray) - 1)
        For i = 2 To UBound(tempArray)
            resultArray(j, i - 1) = tempArray(i)
        Next
    Next
    For j = 1 To UBound(resultArray, 2)
        resultArray(1, j) = "#" & j
    Next
    Cells(1, "G").Resize(UBound(resultArray, 1), UBound(resultArray, 2)).Value = resultArray
    Dim rng As Range
    Set rng = Cells(2, 1)
    Set rng = Union(rng, Range(Join(d.Keys, ",")))
    rng.Interior.Color = 65535
   
   
   
    ' 结束计时
    EndTime = Timer

    ' 显示处理行数和执行时间
    MsgBox " 让您久等了!" & vbCrLf & vbCrLf & "本次处理了 " & DataQty & " 行数据," & vbCrLf & vbCrLf & "总共花费了: " & Format(EndTime - StartTime, "0.00") & " 秒。", vbInformation
   
    ' 自动调整列宽
    ActiveSheet.Columns.AutoFit
   

End Sub

TA的精华主题

TA的得分主题

发表于 2024-1-30 18:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-30 18:59 | 显示全部楼层
不良气息 发表于 2024-1-30 16:17
Sub OptimizedDataCollectionD()
    ' 声明变量
    Dim DataQty As Long

相当好用,快到不可思议,太牛了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 23:26 , Processed in 0.032479 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表