ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论]如何"高效"的删除空白行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-4-27 15:34 | 显示全部楼层 |阅读模式

条件,

数据量60000行,列不限制,有可能是10列也有可能是200列

只有同一行都为空的才删除此行.要求顺序不能乱,格式要保留.

欢迎各位有兴趣的朋友都有试一下,测试的话主就用60000行10列数据进行测试.

Sub peng()
    Dim arr(1 To 60000, 1 To 10)
    For i = 1 To 60000
        For j = 1 To 10
            If Rnd() < 0.2 Then arr(i, j) = "VBA"
        Next j
    Next i
    Cells(1, 1).Resize(60000, 10) = arr
End Sub

TA的精华主题

TA的得分主题

发表于 2008-4-27 15:40 | 显示全部楼层

我就喜欢这个题目,我用的方法是SQL语句,但涉及到排序问题。

只有在作数组时,再多填一列顺序号。

[此贴子已经被作者于2008-4-27 15:43:53编辑过]

TA的精华主题

TA的得分主题

发表于 2008-4-27 16:14 | 显示全部楼层
版:我的问题是:数据量60000行,列不限制,有可能是10列也有可能是200列,从A3开始,只要有空单元的行,全部删除。要求顺序不能乱(下一行自动上移),格式要保留。代码如何写?谢谢的!
[此贴子已经被作者于2008-4-27 16:15:26编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-4-29 11:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

高手们都那里去了?此题看起来简单,但要高效实现还是有一定的难度的.

TA的精华主题

TA的得分主题

发表于 2008-4-29 11:49 | 显示全部楼层

我来抛砖引玉!

Sub Del_EntireBlankRows()
'取最大行数
iMaxRow = 6000

'取得最大列数
iMaxCol = 200

For i = iMaxRow To 1 Step -1
iCol = Range("J" & i).End(xlToLeft).Column
If iCol =1 Then Rows(i).Delete
Next
End Sub

[此贴子已经被作者于2008-4-29 13:54:56编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-4-29 12:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2008-4-29 12:19 | 显示全部楼层
个人的理解,所谓高效就是速度快,占用资源少,写法简洁。
可以想出4,5中解法,但都说不上高效。 就算是有速度相对
不错的方法,回写excel也要一定时间的。
删除无非就是两条路,drop or keep.
个人觉得没什莫太好的办法,最普通的数组循环在速度上就不是一般
的方法能beat的,但还是不能算高效,用C++写个外挂,应该速度还行
但还是要与excel本身交互。

关注,学习下!

TA的精华主题

TA的得分主题

发表于 2008-4-29 13:03 | 显示全部楼层

较常见的方法:

Sub yy()
Dim arr(1 To 60000, 1 To 10), a, i&, m&, j%, k%
a = [a1:j60000]
For i = 1 To 60000
  For j = 1 To 10
    If Len(a(i, j)) > 0 Then
      m = m + 1
      For k = 1 To 10
        arr(m, k) = a(i, k)
      Next k
      Exit For
    End If
  Next j
Next i
ActiveSheet.UsedRange = ""
[a1].Resize(m, 10) = arr
End Sub

[此贴子已经被作者于2008-4-29 13:06:26编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-4-29 14:47 | 显示全部楼层
QUOTE:
以下是引用oobird在2008-4-29 13:03:46的发言:

较常见的方法:

Sub yy()
Dim arr(1 To 60000, 1 To 10), a, i&, m&, j%, k%
a = [a1:j60000]
For i = 1 To 60000
  For j = 1 To 10
    If Len(a(i, j)) > 0 Then
      m = m + 1
      For k = 1 To 10
        arr(m, k) = a(i, k)
      Next k
      Exit For
    End If
  Next j
Next i
ActiveSheet.UsedRange = ""
[a1].Resize(m, 10) = arr
End Sub


不合要求,因为格式打乱了.

TA的精华主题

TA的得分主题

发表于 2008-4-29 15:30 | 显示全部楼层

要保得格式的话,感觉应该高级筛选到sheet2才是最快的。

Sub yy()
With Sheet2
  .UsedRange.Clear
  [1:1].Insert
  Range("A1:j1") = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  Range("K2") = "=COUNTA(RC1:RC10)>0"
  [A1:J60000].AdvancedFilter 2, [k1:k2], .[a1]
  .[1:1].Delete
  [1:1].Delete: [k1] = ""
End With
End Sub

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

本版积分规则

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

GMT+8, 2024-11-19 15:36 , Processed in 0.040610 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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