Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6216|回复: 10

求解:删除选定区域内的所有的空行空列(速度要快)

[复制链接]
发表于 2011-11-28 16:51 | 显示全部楼层 |阅读模式
5学分
本帖最后由 hunpo 于 2011-11-28 16:57 编辑

求VBA实现删除选定区域内的所有的空行空列(速度要快),数据量还是蛮大的,我的程序是这样的,效率很低,第一行或第一列是空时,也删除不掉,求更快速度的方法,或指正代码的错误:
Sub 删除空行空列()
Dim arr
Dim str As String
Set arr = ActiveSheet.UsedRange
Lastrow = ActiveSheet.UsedRange.rows.Count
LastColumn = ActiveSheet.UsedRange.Columns.Count
Application.ScreenUpdating = False
For i = Lastrow To 1 Step -1
If Application.CountA(arr.rows(i)) = 0 Then
arr.rows(i).Delete
End If
Next i
Set arr = ActiveSheet.UsedRange
For j = LastColumn To 1 Step -1
      If Application.CountA(arr.Columns(j)) = 0 Then
         arr.Columns(j).Delete
      End If
   Next j
Application.ScreenUpdating = True
End Sub

发表于 2011-11-28 17:32 | 显示全部楼层
工作表中  有多余的空行 , 还有多余的空列吗?
回复

使用道具 举报

发表于 2011-11-28 17:34 | 显示全部楼层
建议 用定位条件 空值来删除 空行 空列,  可以录制个宏, 查看下代码, 然后加入循环 就OK
回复

使用道具 举报

发表于 2011-11-29 09:19 | 显示全部楼层
简单改了一下:
  1. Sub 删除空行空列()
  2.     Dim Area_ As Range
  3.     Dim Rng1 As Range
  4.     Dim Rng2 As Range
  5.     Dim Ro As Long
  6.     Dim Col As Integer
  7.     Dim lstRo As Long
  8.     Dim lstCol As Integer
  9.     Set Area_ = ActiveSheet.UsedRange
  10.     lstRo = Area_.Rows.Count
  11.     lstCol = Area_.Columns.Count
  12.     Application.ScreenUpdating = False
  13.     For Ro = 1 To lstRo
  14.         If Application.CountA(Area_.Rows(Ro)) = 0 Then
  15.             If Rng1 Is Nothing Then
  16.                 Set Rng1 = Cells(Ro, 1)
  17.             Else
  18.                 Set Rng1 = Union(Rng1, Cells(Ro, 1))
  19.             End If
  20.         End If
  21.     Next
  22.     For Col = 1 To lstCol
  23.         If Application.CountA(Area_.Columns(Col)) = 0 Then
  24.             If Rng2 Is Nothing Then
  25.                 Set Rng2 = Cells(1, Col)
  26.             Else
  27.                 Set Rng2 = Union(Rng2, Cells(1, Col))
  28.             End If
  29.         End If
  30.     Next
  31.     Rng1.EntireRow.Delete
  32.     Rng2.EntireColumn.Delete
  33.     Set Area_ = Nothing
  34.     Set Rng1 = Nothing
  35.     Set Rng2 = Nothing
  36.     Application.ScreenUpdating = True
  37. End Sub
复制代码
回复

使用道具 举报

发表于 2011-11-29 09:25 | 显示全部楼层
以上代码的缺点是如果首行首列空行空列无法删除,可以手动删
回复

使用道具 举报

发表于 2011-11-29 09:58 | 显示全部楼层
本帖最后由 Dj_soo 于 2011-11-29 10:07 编辑

用这个吧

  1. Option Explicit
  2. Sub 删除空行空列()
  3.     Dim Area_ As Range
  4.     Dim Rng1 As Range
  5.     Dim Rng2 As Range
  6.     Dim Ro As Long
  7.     Dim Col As Integer
  8.     Dim lstRo As Long
  9.     Dim lstCol As Integer
  10.     If [A1] = "" Then
  11.         [A1] = 1
  12.         Set Area_ = ActiveSheet.UsedRange
  13.         [A1].ClearContents
  14.     Else
  15.         Set Area_ = ActiveSheet.UsedRange
  16.     End If
  17.    
  18.     lstRo = Area_.Rows.Count
  19.     lstCol = Area_.Columns.Count
  20.     Application.ScreenUpdating = False
  21.     For Ro = 1 To lstRo
  22.         If Application.CountA(Area_.Rows(Ro)) = 0 Then
  23.             If Rng1 Is Nothing Then
  24.                 Set Rng1 = Rows(Ro)
  25.             Else
  26.                 Set Rng1 = Union(Rng1, Rows(Ro))
  27.             End If
  28.         End If
  29.     Next
  30.     For Col = 1 To lstCol
  31.         If Application.CountA(Area_.Columns(Col)) = 0 Then
  32.             If Rng2 Is Nothing Then
  33.                 Set Rng2 = Columns(Col)
  34.             Else
  35.                 Set Rng2 = Union(Rng2, Columns(Col))
  36.             End If
  37.         End If
  38.     Next
  39.     Rng1.EntireRow.Delete
  40.     Rng2.EntireColumn.Delete
  41.     Set Area_ = Nothing
  42.     Set Rng1 = Nothing
  43.     Set Rng2 = Nothing
  44.     Application.ScreenUpdating = True
  45. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2011-11-29 10:32 | 显示全部楼层
Dj_iso兄,不错,是实现了,但是运行起来,感觉还是比较慢,因为我的数据有几万行,有没有不是循环的方法,解决此问题,期望能有更快更高效的方法呵
回复

使用道具 举报

发表于 2011-11-29 11:49 | 显示全部楼层
hunpo 发表于 2011-11-29 10:32
Dj_iso兄,不错,是实现了,但是运行起来,感觉还是比较慢,因为我的数据有几万行,有没有不是循环的方法,解决此问 ...

没有不用循环的办法.
如果用数组可能会快些,但是写代码太麻烦了
回复

使用道具 举报

 楼主| 发表于 2011-11-29 14:15 | 显示全部楼层
写数组,DJ_ISO兄,写数组能实现吗? 能说说你用数组的方式怎么去实现啊,不用写代码,只说说你的设计思路
回复

使用道具 举报

发表于 2011-11-30 00:34 | 显示全部楼层
本帖最后由 fjmxwrs 于 2011-11-30 00:36 编辑

这个速度应该还可以吧

Sub 删除空行空列()
    Dim arr, i&, j&
    arr = UsedRange
    Application.ScreenUpdating = False
    For i = UBound(arr) To 1 Step -1
        If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete
    Next i
    For j = UBound(arr, 2) To 1 Step -1
        If Application.CountA(Columns(j)) = 0 Then Columns(j).Delete
    Next j
    Application.ScreenUpdating = True
End Sub




回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-23 20:30 , Processed in 0.392797 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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