標題:
[發問]
VBA刪除空白ROW COLUMN
[打印本頁]
作者:
missbb
時間:
2018-5-30 19:14
標題:
VBA刪除空白ROW COLUMN
按CTRL 下箭咀, 遊標去到AK170, 但其有資料的行/列只去到E150. 如何可用VBA快除除去151至170的空白ROW及F至AK的空白欄? 因會令檔案容量很大.
有勞各位, 因在網貢看予很多文章悖做不到.:'(
[attach]28782[/attach]
作者:
Kubi
時間:
2018-5-31 15:26
回復
1#
missbb
以下是土法煉鋼的結果:
Sub test()
For n = 1 To 2
er = 0
ec = 0
With ActiveSheet
For j = 1 To .UsedRange.Columns.Count
For i = 1 To .UsedRange.Rows.Count
If .Cells(i, j).Value <> "" Then
If i > er Then er = i
If j > ec Then ec = j
End If
Next i
Next j
.Rows(er + 1 & ":" & Cells.Rows.Count).Delete
.Range(Columns(ec + 1), Columns(Cells.Columns.Count)).Delete
End With
Next n
End Sub
複製代碼
別問我為何要迴圏兩次?這是多方測試結果(還是有前輩知道原因並告知),若不用迴圈的話,則最後一列要加上程式碼來關閉檔案:
ActiveWorkbook.Close 1
關檔案的用意是經過再開啟本檔案的程序才會生效。
作者:
GBKEE
時間:
2018-6-1 06:18
回復
1#
missbb
是這樣嗎?
****最後有資料的列位,其實不是最後有使用過的列位***(UsedRange)
Option Explicit
Sub Ex()
If Cells.SpecialCells(xlCellTypeLastCell).Row <> [E1].End(xlDown).Row Then
Rows([E1].End(xlDown).Row + 1 & ":" & Cells.SpecialCells(xlCellTypeLastCell).Row).Delete
End If
End Sub
複製代碼
作者:
Kubi
時間:
2018-6-1 21:48
回復
3#
GBKEE
樓主的用意是說按 {END} 鍵後再按 {HOME} 鍵,會將油標移至
Cells.SpecialCells(xlCellTypeLastCell).Select 位置,也就是AK170儲存格。
不僅僅該儲存格是空值之外,於AK170儲存格往左(F:AK欄)或往上(151:170列)的範圍內儲存格都是空值。
樓主是想說利用程式將虛擬的空儲存格去除,以後再按 {END} 鍵再按 {HOME} 鍵,游標會移至真正有資料的右下角儲存格E150,而不是AK170。
而且若不將這些空的儲存格清除或刪除,將會佔用記憶體也會讓檔案肥大。
會造成xlCellTypeLastCell誤判,可能原因是複製含有格式的資料(如Copy網頁內的資料)貼入工作表,
之後若該貼入的資料用不上時再用Delelet鍵刪除,就會產生如上面的誤判現象。
另外用Range的UsedRange屬性也會涵蓋A1:AK170範圍。
以上是個人觀察結果供參。
作者:
GBKEE
時間:
2018-6-2 15:36
本帖最後由 GBKEE 於 2018-6-2 17:57 編輯
回復
4#
Kubi
補上完整程式後
UsedRange會是在最後儲存格有資料的範圍內
Option Explicit
Sub Ex()
Dim R(1 To 2), C(1 To 2) As Long, Rng As Range
Debug.Print ActiveSheet.UsedRange.Address
If Application.CountA(Cells) = 0 Then Exit Sub
Set Rng = Cells.SpecialCells(xlCellTypeConstants)
Set Rng = Rng.Areas(Rng.Areas.Count)
Set Rng = Rng.Cells(Rng.Cells.Count)
With Rng
R(1) = .Row
C(1) = .Column
End With
With Cells.SpecialCells(xlCellTypeLastCell)
R(2) = .Row
C(2) = .Column
End With
If R(1) <> R(2) Then Rows(R(1) + 1 & ":" & R(2)).Delete
If C(1) <> C(2) And C(1) + 1 = C(2) Then Range(Columns(C(1) + 1), Columns(C(2))).Delete
ActiveSheet.Parent.Save
Debug.Print ActiveSheet.UsedRange.Address
End Sub
複製代碼
作者:
Kubi
時間:
2018-6-2 21:20
回復
5#
GBKEE
執行GBKEE版主的最後一行 Debug.Print ActiveSheet.UsedRange.Address 後
顯示的是 $A$1:$AK$150
若能執行到最後一行 Debug.Print ActiveSheet.UsedRange.Address 後
顯示的是 $A$1:$E$150
可能就是樓主所要的結果
作者:
准提部林
時間:
2018-6-3 17:53
Sub TEST()
Dim UR As Range, xF As Range
Set UR = Range([A1], ActiveSheet.UsedRange)
Set UR = UR(UR.Count)
Set xF = Cells.Find("*", UR(2), xlValues, xlPart, xlByRows, xlPrevious)
If UR.Row > xF.Row Then Set UR = UR(2): Range(xF(2), UR(0)).EntireRow.Delete
Set xF = Cells.Find("*", UR(1, 2), xlValues, xlPart, xlByColumns, xlPrevious)
If UR.Column > xF.Column Then Range(xF(1, 2), UR).EntireColumn.Delete
ActiveSheet.UsedRange
End Sub
作者:
Kubi
時間:
2018-6-4 11:30
終於了解到原來 Delete 若沒有加上參數 Shift,VBA 會自動判斷刪除之後的儲存格位移方向,
所以若加上參數 Shift 後,就會與 EntireRow.Delete、EntireColumn.Delete 產生相同效果。
作者:
missbb
時間:
2018-6-5 22:17
回復
8#
Kubi
非常感謝:)
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)