ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如果C列不为空则整行数据复制(有关速度问题)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-12 15:44 | 显示全部楼层 |阅读模式
各位老师好,我想请教一个问题,附件中如果C列不为空的话,则整行数据向下复制,且L列的时间一分为二,由于未系统的学过VBA ,多数都是看到网上的程序然后自己研究的,自已也编了一个程序,个人感觉程序应该没有错,但是对于有上万条数据的话,好像根本运行不起来。故向各位老师请教修改!

如果C列不为空则整行数据复制.zip

72.88 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:09 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-8-12 16:11 编辑

向楼主确认一下:C列只复制有数据的行吗?L列时间如何一半为二?40/2=20?
                         或者,C列为空的行,数据直接用上一行数据?如果空多行呢?

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:14 | 显示全部楼层
按这种插入行的执行方式,肯定会卡,上万行数据的话,搞不好内在溢出就崩溃了。

如果只是这两步操作的话,为何不直接筛选出来,再复制C列没有内容的数据,L列时间选择性粘贴——除2

单纯完成你这个结果,比写代码自动运行效率多了。

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:39 | 显示全部楼层
使用了数组,没有一个单元格一个行这样去复制,这个肯定很慢啦,供你参考。。。
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:40 | 显示全部楼层
代码如下。。。
Sub cmdInsertRow0811()
    Application.ScreenUpdating = False '//关闭屏幕刷新
    Application.DisplayAlerts = False '//关闭系统提示
    Dim SH As Worksheet
    Dim t
    t = Timer   '//开始时间
    Set SH = Sheets("台账")
    If SH.FilterMode Then SH.ShowAllData
    maxrow = SH.Range("C" & Rows.Count).End(xlUp).Row
    maxcolumn = SH.Cells(1, Columns.Count).End(1).Column
    arr = SH.Range("a1", Cells(maxrow, maxcolumn))
    ReDim brr(1 To 100000, 1 To maxcolumn)
    For i = 2 To maxrow
        If Len(arr(i, 3)) > 0 Then '如果C列不为空
            arr(i, 12) = arr(i, 12) / 2 '所用的时间姓名A与B平均
            For k = 1 To 2
                n = n + 1
                For j = 1 To UBound(arr, 2)
                    brr(n, j) = arr(i, j)
                Next
            Next
            brr(n, 2) = brr(n - 1, 3)
            brr(n, 12) = brr(n - 1, 12)
            brr(n, 3) = Empty: brr(n - 1, 3) = Empty
        Else
            n = n + 1
            For j = 1 To UBound(arr, 2)
                brr(n, j) = arr(i, j)
            Next
        End If
    Next
    SH.[a2].Resize(n, maxcolumn) = brr
    Application.ScreenUpdating = True '//恢复屏幕刷新
    Application.DisplayAlerts = True '//恢复系统提示
   
    MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒," & "请查看结果!", , "系统提示!!" '//提示所用时间
End Sub

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-12 16:45 | 显示全部楼层
ykcbf1100 发表于 2024-8-12 16:09
向楼主确认一下:C列只复制有数据的行吗?L列时间如何一半为二?40/2=20?
                         或者 ...

时间一分为二,例:40/2对的。C列为空的行就不动。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-12 16:45 | 显示全部楼层
本帖最后由 神秘风暴 于 2024-8-12 16:47 编辑
quqiyuan 发表于 2024-8-12 16:39
使用了数组,没有一个单元格一个行这样去复制,这个肯定很慢啦,供你参考。。。

谈到数组就头疼,这个我得需要好好研究一下,谢谢大师指点!

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:53 | 显示全部楼层
神秘风暴 发表于 2024-8-12 16:45
时间一分为二,例:40/2对的。C列为空的行就不动。

WPS里的JSA练习一下,大量的操作单元格(复制粘贴),效率很低的,改用数组操作——


微信截图_20240812165037.png

微信截图_20240812165112.png

240812_如果C列不为空则整行数据复制.rar

141.95 KB, 下载次数: 7

用WPS打开并启用宏

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-12 16:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
读了好几遍需求,原来楼主是要只要是C不为空就插入一行啊,并复制不为空这一行的数据,并把时间除以2,对不
插入的行是要求挨着放在原数据行的下面,还是放在表的最后呢


TA的精华主题

TA的得分主题

发表于 2024-8-12 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
于箱长 发表于 2024-8-12 16:54
读了好几遍需求,原来楼主是要只要是C不为空就插入一行啊,并复制不为空这一行的数据,并把时间除以2,对不 ...

图片.jpg

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 12:35 , Processed in 0.040129 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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