返回列表 上一主題 發帖

[發問] VBA刪除空白ROW COLUMN

回復 1# missbb
以下是土法煉鋼的結果:
  1. Sub test()
  2.     For n = 1 To 2
  3.         er = 0
  4.         ec = 0
  5.         With ActiveSheet
  6.             For j = 1 To .UsedRange.Columns.Count
  7.                 For i = 1 To .UsedRange.Rows.Count
  8.                     If .Cells(i, j).Value <> "" Then
  9.                         If i > er Then er = i
  10.                         If j > ec Then ec = j
  11.                     End If
  12.                 Next i
  13.             Next j
  14.             .Rows(er + 1 & ":" & Cells.Rows.Count).Delete
  15.             .Range(Columns(ec + 1), Columns(Cells.Columns.Count)).Delete
  16.         End With
  17.     Next n
  18. End Sub
複製代碼
別問我為何要迴圏兩次?這是多方測試結果(還是有前輩知道原因並告知),若不用迴圈的話,則最後一列要加上程式碼來關閉檔案:
ActiveWorkbook.Close 1

關檔案的用意是經過再開啟本檔案的程序才會生效。

TOP

回復 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範圍。

以上是個人觀察結果供參。

TOP

回復 5# GBKEE
執行GBKEE版主的最後一行 Debug.Print ActiveSheet.UsedRange.Address 後
顯示的是 $A$1:$AK$150

若能執行到最後一行 Debug.Print ActiveSheet.UsedRange.Address 後
顯示的是 $A$1:$E$150

可能就是樓主所要的結果

TOP

終於了解到原來 Delete 若沒有加上參數 Shift,VBA 會自動判斷刪除之後的儲存格位移方向,
所以若加上參數 Shift 後,就會與 EntireRow.Delete、EntireColumn.Delete 產生相同效果。
[b]Kubi[/b]

TOP

        靜思自在 : 能付出愛心就是福,能消除煩惱就是慧。
返回列表 上一主題