Board logo

標題: [發問] kill row [打印本頁]

作者: t8899    時間: 2015-1-18 09:44     標題: kill row

之前我在跑某程序時,程序有問題
導致我按ctrl-end row居然到65536
我用mark 的方式刪除,刪除75-65536
按ctrl-end還是到65536 ??[attach]20092[/attach]
作者: bobomi    時間: 2015-1-18 10:56

EXCEL 應該本來就是這樣吧

你在 [A10000] 放入值 22, 然後整列刪除它

在按 ctrl-end row 它就直接圈選到 Row 10000

我也因為此感到困擾, 因為垂直捲軸會變得很難用
作者: bobomi    時間: 2015-1-18 11:02

你在空白頁執行一下  Sheet1.[A1:A800].Clear
按 ctrl-end row 它就直接圈選到 Row 800
作者: t8899    時間: 2015-1-18 21:02

你在空白頁執行一下  Sheet1.[A1:A800].Clear
按 ctrl-end row 它就直接圈選到 Row 800
bobomi 發表於 2015-1-18 11:02

無效啊?
我用這一句 Range("i74:i65536").EntireRow.Delete 也無效 :'(
作者: bobomi    時間: 2015-1-18 21:35

無效啊?
我用這一句 Range("i74:i65536").EntireRow.Delete 也無效
t8899 發表於 2015-1-18 21:02



沒看懂我說的?

開啟1個新 EXCEL 檔案 ->  vba 執行  Sheet1.[A1:A800].Clear ->  返回 Sheet1 ->  按 shift + ctrl  + end  -> EXCEL 就直接圈選到 Row 800

可是我們根本沒填資料不是嗎? 只是執行 Clear 而已,  因為Clear 指定的範圍極限是 Row = 800

按 shift + ctrl  + end 後 Excel 它就自己反白到 Row = 800 ( 800 不正好就是剛剛 Clear 指定的列數嘛 )

所以這不是 EXCEL 自己的問題嗎
作者: t8899    時間: 2015-1-19 06:57

沒看懂我說的?

開啟1個新 EXCEL 檔案 ->  vba 執行  Sheet1.[A1:A800].Clear ->  返回 Sheet1 ->  ...
bobomi 發表於 2015-1-18 21:35

了解! 謝謝
作者: 准提部林    時間: 2015-1-19 10:15

Range("i74:i65536").EntireRow.Delete
ActiveSheet.UsedRange

執行 ctrl  + end
作者: t8899    時間: 2015-1-19 10:23

本帖最後由 t8899 於 2015-1-19 10:32 編輯
Range("i74:i65536").EntireRow.Delete
ActiveSheet.UsedRange

執行 ctrl  + end
准提部林 發表於 2015-1-19 10:15

謝謝!可以了,這沒砍掉,檔案大小多了2,500,000 /kb 左右
ActiveSheet.UsedRange 這行意思是?
作者: t8899    時間: 2015-1-19 18:50

Range("i74:i65536").EntireRow.Delete
ActiveSheet.UsedRange

執行 ctrl  + end
准提部林 發表於 2015-1-19 10:15

再請教:
同此問題,找最後一列的語法 ???
作者: 准提部林    時間: 2015-1-19 21:00

回復 9# t8899


   
Range("i74:i65536").EntireRow.Delete
Dim xE As Range
With ActiveSheet.UsedRange
   Set xE = .Item(.Count)
   MsgBox "最後一格〔位址〕:" & xE.Address
   MsgBox "最後一格〔列號〕:" & xE.Row
   MsgBox "最後一格〔欄號〕:" & xE.Column
   MsgBox "最後一格〔欄名〕:" & Split(xE.Address, "$")(1)
End With

取得〔最後一列〕方法有多種,例如:End(xlUp), End(xlDown)
不過依據實際資料來判斷較準確!
VBE內建說明檔可找到相關語法,花些時間在這找資料,可學到很多!
 
作者: t8899    時間: 2015-1-19 21:35

本帖最後由 t8899 於 2015-1-19 21:41 編輯
回復  t8899


   
Range("i74:i65536").EntireRow.Delete
Dim xE As Range
With ActiveSheet.Used ...
准提部林 發表於 2015-1-19 21:00

我寫一個巨集,刪掉最後一列(已使用)後面"沒用的列"都可套用
Sub a133323()
Dim a
Set a = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not a Is Nothing Then
e = a.Offset(1).Address
b = ActiveSheet.UsedRange.Rows.Count
c = "d" & b   'd任何欄名皆可
Range(e, c).EntireRow.Delete
End If
ActiveSheet.UsedRange
End Sub
作者: bobomi    時間: 2015-1-19 22:35

我寫一個巨集,刪掉最後一列(已使用)後面"沒用的列"都可套用
Sub a133323()
Dim a
Set a = Cells.Find ...
t8899 發表於 2015-1-19 21:35


有 bug 歐 (  你可以在 Row 5 ~ 10 填入資料, 其餘空白, 去測試就知道有 bug )

幫你改成這樣

Sub a133323()
刪除最後n列 = 1  ' <--- 你的目的
Dim a
Set a = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not a Is Nothing Then
   a.Offset(1 - 刪除最後n列).EntireRow.Delete
End If
ActiveSheet.UsedRange
End Sub
作者: t8899    時間: 2015-1-20 07:08

本帖最後由 t8899 於 2015-1-20 07:20 編輯
有 bug 歐 (  你可以在 Row 5 ~ 10 填入資料, 其餘空白, 去測試就知道有 bug )
幫你改成這樣
Sub ...
bobomi 發表於 2015-1-19 22:35


測試沒有錯
可能沒表達清楚
我的目的=====>以您的例子 Row 5 ~ 10 填入資料
則ROW10為最後一列(有資料或有公式),ROW5 之前不砍 , ROW 11-65536 全刪除
作者: bobomi    時間: 2015-1-20 08:32

本帖最後由 bobomi 於 2015-1-20 08:33 編輯
測試沒有錯
可能沒表達清楚
我的目的=====>以您的例子 Row 5 ~ 10 填入資料
則ROW10為最後一列(有資 ...
t8899 發表於 2015-1-20 07:08


這我就不懂了
我測的時候
開啟空白檔 -> R5 - R10 填入資料
它會從  ROW 6 - 65536 全刪除
而不是從 Row 10 開始
作者: t8899    時間: 2015-1-20 08:42

這我就不懂了
我測的時候
開啟空白檔 -> R5 - R10 填入資料
它會從  ROW 6 - 65536 全刪除
而不是從 ...
bobomi 發表於 2015-1-20 08:32

請測試[attach]20100[/attach]
作者: bobomi    時間: 2015-1-20 08:57

本帖最後由 bobomi 於 2015-1-20 09:00 編輯
請測試
t8899 發表於 2015-1-20 08:42


已經知道原因了
你的 Book1.xls 剛好 R1 ~ R4 有內容 ( 看起來好像沒有資料, 其實它是有格式資料或者其他什麼的, 祇是看不見而已 )
所以程式執行後不會出錯

請你另開一各全新檔案 -> R5 - R10 填入資料 -> 執行你的 Sub a133323( ) -> 它就出錯了 !!
因為這各新檔案的 R1 ~ R4 是各 100% 無任何格式資料的區域
作者: t8899    時間: 2015-1-20 10:10

已經知道原因了
你的 Book1.xls 剛好 R1 ~ R4 有內容 ( 看起來好像沒有資料, 其實它是有格式資料或者其 ...
bobomi 發表於 2015-1-20 08:57


了解, 謝謝
作者: diolin    時間: 2015-1-20 17:56

End(xlUp), End(xlDown) 會有一些限制,  特殊資料, 有時會有意外的狀況

UsedRange 很好用, 但有時後面一堆空白行一樣會算進去
作者: Scott090    時間: 2015-1-25 08:49

回復 18# diolin

說的是,有沒比較周全的作法?
另外總是看到 End(xlup) 要從工作表的 最後一個ROW往上找,感覺好像浪費時間
作者: diolin    時間: 2015-1-27 15:40

回復 19# Scott090

其實如果資料是自己產生的, 上面兩個方法一般就很足夠了

如果資料不如預期, 就要加點前置處理

如果你想省事一點, 也可以參考以下的作法

LastRow = ActiveSheet.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)