Board logo

標題: [發問] Application.InputBox [打印本頁]

作者: t8899    時間: 2014-10-31 21:30     標題: Application.InputBox

Dim rng As Range
    Set rng = Application.InputBox("請用滑鼠選", Type:=8)
RNG.COUNT 會傳回選了幾個儲存格
假如選擇3個儲存格,這三個變數各如何表示?(想分開使用)
作者: bobomi    時間: 2014-10-31 22:03

Set A1 = rng(1)
Set A2 = rng(2)
Set A3 = rng(3)
作者: t8899    時間: 2014-11-1 06:37

Set A1 = rng(1)
Set A2 = rng(2)
Set A3 = rng(3)
bobomi 發表於 2014-10-31 22:03


Sub MA3333()
    Dim rng, A1, A2, A3, A4
    Set rng = Application.InputBox("請用滑鼠選", Type:=8)
Set A1 = rng(1)
Set A2 = rng(2)
Set A3 = rng(3)
Set A4 = rng(4)
' 假如我依序選擇 $I$13,$I$17,$J$14,$J$19   4個
   MsgBox A3.Address '(傳回第三個)
end sub
回報  $I$15 不對啊 ,應該是 $J$14,我沒選 $I$15 啊 ??
作者: bobomi    時間: 2014-11-1 11:56

Sub MA3333()
    Dim rng, A1, A2, A3, A4
    Set rng = Application.InputBox("請用滑鼠選", Type ...
t8899 發表於 2014-11-1 06:37



沒注意到還有跳著選的


   Dim rng
   Set rng = Application.InputBox("請用滑鼠選", Type:=8)

ReDim A1(1 To rng.Count)
Dim k As Long
For Each r In rng
    k = k + 1
    Set A1(k) = r
    Msgbox A1(k).Address
Next
作者: luhpro    時間: 2014-11-1 22:53

Sub MA3333()
    Dim rng, A1, A2, A3, A4
    Set rng = Application.InputBox("請用滑鼠選", Type ...
t8899 發表於 2014-11-1 06:37

改這樣也可以:
Set A1 = rng.Areas(1)
Set A2 = rng.Areas(2)
Set A3 = rng.Areas(3)
Set A4 = rng.Areas(4)
作者: bobomi    時間: 2014-11-2 00:00

改這樣也可以:
Set A1 = rng.Areas(1)
Set A2 = rng.Areas(2)
Set A3 = rng.Areas(3)
Set A4 = rng.A ...
luhpro 發表於 2014-11-1 22:53


thanks
作者: t8899    時間: 2014-11-2 08:38

本帖最後由 t8899 於 2014-11-2 08:43 編輯
thanks
bobomi 發表於 2014-11-2 00:00

我試過  下面也會照你所選的順序依序處理,只是無法知道個別變數的名稱  
   Dim ZZ, rng
    Set rng = Application.InputBox("請用滑鼠選" & [A10], Type:=8)
For Each ZZ In rng
MsgBox ZZ.Address
Next
作者: bobomi    時間: 2014-11-2 09:10

我試過  下面也會照你所選的順序依序處理,只是無法知道個別變數的名稱  
   Dim ZZ, rng
    Set rng = ...
t8899 發表於 2014-11-2 08:38


你用 luhpro 寫的這個吧
Set A1 = rng.Areas(1)
Set A2 = rng.Areas(2)
Set A3 = rng.Areas(3)
比較方便
作者: luhpro    時間: 2014-11-2 10:23

我試過  下面也會照你所選的順序依序處理,只是無法知道個別變數的名稱  
   Dim ZZ, rng
    Set rng = ...
t8899 發表於 2014-11-2 08:38

我想到的有兩種方法可以實現,
不過要看你後續的需求決定要用哪種:
1. 需要抓所選取儲存格的位址字串:
  1. Sub MA3333()
  2.     Dim rng, a$(), i%
  3. On Error Resume Next
  4.     Set rng = Application.InputBox("請用滑鼠選", Type:=8)
  5.     ReDim a(0)
  6.     For i = 1 To rng.Count
  7.       ReDim Preserve a(i)
  8.       a(i) = rng.Areas(i).Address
  9.       MsgBox "你選擇的第 " & i & "個儲存格位址為 :  " & a(i)
  10.     Next
  11. On Error GoTo 0
  12. End Sub
複製代碼
2. 需要抓所選取的儲存格物件:
  1. Sub MA3333()
  2.     Dim rng, i%
  3. On Error Resume Next
  4.     Set rng = Application.InputBox("請用滑鼠選", Type:=8)
  5.     For i = 1 To rng.Count
  6.       MsgBox "你選擇的第 " & i & "個儲存格位址為 :  " & rng.Areas(i).Address
  7.     Next
  8. On Error GoTo 0
  9. End Sub
複製代碼
會加 On Error Resume Next 是因為若使用者一次選了超過一個儲存格時,
後面會發生錯誤.

因為若位址為 $A$1:$B$1 此類格式時,
count 會算兩個位址,
但 areas 則只算一個位址,
最後 i 會大於陣列最大索引值.
作者: t8899    時間: 2014-11-2 11:51

我想到的有兩種方法可以實現,
不過要看你後續的需求決定要用哪種:
1. 需要抓所選取儲存格的位址字串:2. ...
luhpro 發表於 2014-11-2 10:23

感謝兩位指導!




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