Board logo

標題: 資料區域右下欄位獲取 [打印本頁]

作者: 巴克斯    時間: 2010-6-11 07:48     標題: 資料區域右下欄位獲取

如附檔,使用ActiveCell.SpecialCells(xlLastCell).Select 資料區域右下欄位,得到G15欄位(為原資料區域)
因原資料有修改,新區域實際右下應為F13
可是ActiveCell.SpecialCells(xlLastCell).Select 仍至G15
請問如何獲取F13,謝謝
作者: Hsieh    時間: 2010-6-11 08:08

SpecialCells(xlLastCell)
除非原範圍是被clear或delete
就是連同格式清除
否則excel仍認為該範圍已使用
用CurrentRegion屬性試試
作者: GBKEE    時間: 2010-6-11 08:17

本帖最後由 GBKEE 於 2010-6-11 13:07 編輯

回復 1# 巴克斯

SpecialCells(xlLastCell)永遠是工作表中已使用的儲存格之最後一個的儲存格
  1. Sub Ex() 'ActiveCell只要位於一連續範圍中
  2.     Dim Rng As Range
  3.     Set Rng = ActiveCell.CurrentRegion
  4.     Rng(Rng.Rows.Count, Rng.Columns.Count).Select
  5. End Sub
複製代碼

作者: 巴克斯    時間: 2010-6-11 12:43

回復  Hsieh

SpecialCells(xlLastCell)永遠是工作表中已使用的儲存格之最後一個的儲存格
GBKEE 發表於 2010-6-11 08:17


謝謝兩位板主回覆
可是是不是可以不管ActiveCell有沒有在連續區域,都可找到右下角區域
我試著把資料弄得更亂些,請問如何找到右下角橘色位置?
謝謝
作者: Hsieh    時間: 2010-6-11 13:11

For Each a In Range(Cells.SpecialCells(xlCellTypeConstants).Address)
  If a.Row > r Then r = a.Row
  If a.Column > k Then k = a.Column
Next
MsgBox Cells(r, k).Address
作者: GBKEE    時間: 2010-6-11 13:32

回復 4# 巴克斯
  1. Sub Ex()
  2.     Dim E As Range, R&, C&
  3.     For Each E In Cells.SpecialCells(xlCellTypeConstants).Areas
  4.         If E(E.Rows.Count, E.Columns.Count).Row > R Then R = E(E.Rows.Count, E.Columns.Count).Row
  5.         If E(E.Rows.Count, E.Columns.Count).Column > C Then C = E(E.Rows.Count, E.Columns.Count).Column
  6.     Next
  7.     Cells(R, C).Select
  8. End Sub
複製代碼

作者: 巴克斯    時間: 2010-6-11 20:07

回復 6# GBKEE

謝謝兩位板主提供Cells.SpecialCells(xlCellTypeConstants)的用法
又多學了一種用法,一種是由區域內各非空白欄位找出最右及最下位置
一種是由區域內各連續區塊的右下,逐一找出最右及最下位置,
於小資料測試ok,可是當我用到資料多且複雜區域時
因為需逐欄位去檢測位置,就掛在那裡
   
只好另想辦法,試著也從SpecialCells(xlLastCell),但從外部倒找回去
請版主指教,謝謝
[attach]1223[/attach]

[attach]1224[/attach]
作者: Hsieh    時間: 2010-6-11 23:24

回復 7# 巴克斯


    由後往前推
  1. Sub NN()
  2. Set Rng = Sheet1.UsedRange
  3. r = Rng.Rows.Count
  4. k = Rng.Columns.Count
  5. Do Until Application.CountA(Rng.Columns(k)) <> 0
  6. k = k - 1
  7. Loop
  8. Do Until Application.CountA(Rng.Rows(r)) <> 0
  9. r = r - 1
  10. Loop
  11. MsgBox Cells(r, k).Address
  12. End Sub
複製代碼

作者: 巴克斯    時間: 2010-6-12 05:19

回復 8# Hsieh

謝謝Hsieh版主回應,我本來也想使用counta來往前推
可是不會使用,現在又學了一種用法
這一帖獲益良多,感謝
作者: 巴克斯    時間: 2010-6-12 05:38

回復 9# 巴克斯

不過剛剛又想到,先前測試也有用過類似從外往內找的方法
但如果也是資料異動多的時候(ex:從30000筆變1000筆)
這時候用counta找到非空白row還是必須找29000次
所以覺得若要適合多資料狀況
可能還是從cells(65536,1).end(3).row到cells(cells(65536,ActiveCell.SpecialCells(xlLastCell).column).row,找到最大row
頂多不會超過256次
作者: 巴克斯    時間: 2010-6-12 05:56

本帖最後由 巴克斯 於 2010-6-13 05:46 編輯

回復 10# 巴克斯

sorry,打錯
cells(65536,1).end(3).row到cells(cells(65536,ActiveCell.SpecialCells(xlLastCell).column).end(3).row


瞭解了,以前舊版好像不能重編輯,所以我也沒注意到,順便測試一下~
作者: GBKEE    時間: 2010-6-12 07:14

回復 10# 巴克斯
試試如 Hsieh 板主 所說的由後往前推
  1. Sub Ex()
  2. Dim Rng As Range, i&, R&, C&
  3. Set Rng = ActiveSheet.UsedRange
  4. For i = Rng.Columns.Count To 1 Step -1
  5.     If Application.CountA(Rng.Columns(i)) <> 0 Then
  6.         C = Rng.Columns(i).Column
  7.         Exit For
  8.     End If
  9. Next
  10. For i = Rng.Rows.Count To 1 Step -1
  11.     If Application.CountA(Rng.Rows(i)) <> 0 Then
  12.         R = Rng.Rows(i).Row
  13.         Exit For
  14.     End If
  15. Next
  16. If R <> 0 And C <> 0 Then Cells(R, C).Select
  17. End Sub
複製代碼

作者: Hsieh    時間: 2010-6-12 07:42

回復 10# 巴克斯
  1.    Sub nn()
  2. Set a = Cells.SpecialCells(xlCellTypeConstants).Areas
  3. r = a(a.Count)(a(a.Count).Count).Row
  4. k = UsedRange.SpecialCells(xlCellTypeLastCell).Column
  5. Do Until Application.CountA(Columns(k)) > 0
  6.    k = k - 1
  7. Loop
  8. MsgBox Cells(r, k).Address
  9. End Sub
複製代碼

作者: GBKEE    時間: 2010-6-12 08:00

工作表沒有修改任一儲存格的格式 前提下可使用
Sub Ex()
    With ActiveSheet.UsedRange
        .Cells(.Rows.Count, .Columns.Count).Select
    End With
End Sub
作者: 巴克斯    時間: 2010-6-13 05:39

回復 14# GBKEE

謝謝兩位板主回覆
版主寫的程式真是精簡
雖知道a(a.Count)(a(a.Count).Count).Row是為了求最下方row
可是看不懂結構用法,是否請版主解釋一下
且若row可以直接求出,那column是否可比照找到
我試著修改如下,可是column會往前多找一格,只好先用k+1,不知為什麼??
  1. Sub aa()
  2. Set a = Cells.SpecialCells(xlCellTypeConstants).Areas
  3. r = a(a.Count)(a(a.Count).Count).Row
  4. k = a(a.Count)(a(a.Count).Count).Column

  5. Cells(r, k + 1).Select
  6. End Sub
複製代碼
另測版主k = UsedRange.SpecialCells(xlCellTypeLastCell).Column用法時
會有錯誤發生,請問正確用法?
我先改用k = ActiveCell.SpecialCells(xlLastCell).Column可用
謝謝
作者: GBKEE    時間: 2010-6-13 07:45

本帖最後由 GBKEE 於 2010-6-13 08:03 編輯

回復 15# 巴克斯
Areas 屬性 傳回集合,此集合代表多重範圍中的所有範圍
在 Set a = Cells.SpecialCells(xlCellTypeConstants).Areas
a=集合多重範圍中的所有範圍
a.Count=計算a所有範圍中多重範圍的數量
a(a的第幾個範圍)-->a(a.Count)=a(a中最後一個範圍)
a(a中最後一個範圍).Count=計算a(a中最後一個範圍)範圍中Cells數量
a(a中最後一個範圍)(a(a中最後一個範圍).Count)->a(a中最後一個範圍)(最後一個Cell)
所以 r = a(a.Count)(a(a.Count).Count).Row 是你要的
且若row可以直接求出,那column是否可比照找到    找不到的

a(a.Count) 不一定是工作表最右邊的 範圍
a(a.Count) 一定是工作表最下面的範圍
另測版主k = UsedRange.SpecialCells(xlCellTypeLastCell).Column用法時

UsedRange 如沒有指明是那一工作表的已用範圍 程序必須是置於作用中Sheet 的物件模組中  例: 作用中的工作表是 Sheet1 程序碼須置於 Sheet1的物件模組中 可行
你可能將 程序 置於一般模組中(Module) 或 ThisWorkbook物件模組中
必須指明是那一工作表ActiveSheet.UsedRange 或Sheet1.UsedRange
作者: GBKEE    時間: 2010-6-13 10:30

回復 15# 巴克斯


   
若row可以直接求出,那column是否可比照找到
  1. Sub Ex()
  2.     Dim Rng As Object, E, R, C
  3.     Set Rng = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants).Areas
  4.     R = Rng(Rng.Count)(Rng(Rng.Count).Count).Row
  5.     For Each E In Rng
  6.         If E(E.Count).Column > C Then C = E(E.Count).Column
  7.     Next
  8.     MsgBox Cells(R, C).Address
  9. End Sub
複製代碼

作者: 巴克斯    時間: 2010-6-13 21:12

謝謝GBKEE 版主
解說得很清楚,我想最終這是最符合我的需求了
作者: oobird    時間: 2010-7-29 23:41

一句搞定。
MsgBox Cells(Cells.Find("*", , , , 1, 2).Row, Cells.Find("*", , , , 2, 2).Column).Address(0, 0)




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