2020年4月25日 星期六

VBA內指定range(格位)的方法--Range和Cells互換的概念




VBA內指定range的方法
(以前好像寫過一次,但是現在找不到了。這應該列為FAQ的。)

    (1) 單一格位,絕對座標,數字參數

        cells(i, j)

        其中 i 為列(Y軸),j 為欄(X軸),從 1 開始。
        例如 cells(1, 1) 會參考到 A1 , cells(5, 3) 參考到 C5 。

    (2) 選取區域,絕對座標,數字參數

        range(cells(i1, j1), cells(i2, j2))

        cells(i1, j1) 是選取區域的左上角,cells(i2, j2) 是右下角,
        或者倒過來也可以-總之就是長方形對角線的兩頂點。
        例如 range(cells(2, 2), cells(6, 3)) 選取 B2:C6
             range(cells(3, 8), cells(3, 1)) 選取 A3:H3

    (3) 單一格位,絕對座標,字串參數

        range("<col><row>")

        用你在worksheet畫面上看到的座標來選取格位,
        例如 range("A5") range("CA10")

        注意他的參數是一個字串,所以才會用到 & 來連接,
        比如說 y=5, 那麼 range("A" & y) 可以得到 A5。
        但是這非常難用:如果改變的不是列數你要怎麼辦?
        再弄一個變數 x 從 "A" 跑到 "Z" ? 老實說這還算簡單,可是那 Z 以後呢?
        所以請老實用cells(i, j)。

    (4) 選取區域,絕對座標,字串參數

        RANGE("<col1><row1>:<col2><row2>")

        也是用跟worksheet內一樣的格式來選取區域,
        例如 range("B5:G8"), range("R2:D2")

        他跟以上(3)有一樣的問題,字串組合非常難弄
        對新手而言拼一節字串就已經夠慘了,
        拼啥 x1 & y1 & ":J13" 這種的簡直會死人。
        而且不但很難弄,他也沒有比以上(1)(2)的寫法多出什麼功能-
        這才是致命傷。
        既然這兩種寫法是等效的,就不要白費工夫在字串操作上面
        尤其新手更不應該浪費這種時間。

    (*) R<i>C<j>
        R<i1>C<i1>:R<i2>C<j2>

        R1C1這種寫法只會出現在錄下來的巨集中的公式內
        不能在range()內使用,比如說RANGE("R3C7")只會得到錯誤
        可以學著看,比如說R1C7和G1等效,但是不要用。

    (!) R[<di>]C[<dj>]
        R[<di1>]C[<dj1>]:R[<di2>]C[<dj2>]

        這個更整人,di, dj是相對位置,也是只出現在錄下來的巨集中的公式內。
        比如說R[-2]C[-1]表示相對於目前selection上面兩格,左邊一格的地方。
        或者像這個 ActiveCell.FormulaR1C1 = "=SUM(R[-8]C[-5]:R[-1]C[-4])"
        計算以目前選取格的(-8, -5)格和(-1, -4)格構成的選取區的總和。
        這幾乎不可能自己操作,                                               
        實用上寧願用 .offset(di, dj)函數來取得,或者根本不用。

對新手而言,記得(3)(4)和(1)(2)可以互換,這樣就好了。
用到相對座標的巨集,十之八九可以用絕對座標來達成,
可能不一定一步到位,但是至少每一步還在你的控制之下。
 
------------------------------
https://www.ptt.cc/bbs/Visual_Basic/M.1376638539.A.412.html                             

沒有留言:

張貼留言