tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル範囲選択したセル情報が欲しい。
記事No15001
投稿日: 2010/10/28(Thu) 13:53
投稿者ミヤ
エクセル上で範囲選択したセルの最初の行と列、最後の行と列を取得したいのですが、
うまくいきません。
http://hp.vector.co.jp/authors/VA016119/excel/vbafaq01.html
↑の「選択範囲の最初と最後の行番号と列番号を知りたいのですが」を参考に
xlApp.ActiveCell.Rows.CountとxlApp.ActiveCell.Columns.Countと
書いてみたのですが、駄目でした。
何か方法があるのでしょうか?

[ツリー表示へ]
タイトルRe: 範囲選択したセル情報が欲しい。
記事No15002
投稿日: 2010/10/28(Thu) 15:04
投稿者魔界の仮面弁士
> エクセル上で範囲選択したセルの最初の行と列、最後の行と列を取得したいのですが、

Ctrl を押しながらドラッグすると、非連続の範囲を選択できますが、
その場合はどのように取得したいのでしょうか?


Private WithEvents objSheet1 As Excel.Worksheet

Private Sub objSheet1_SelectionChange(ByVal Target As Excel.Range)
    Debug.Print "全体=[" & Target.Address(False, False, xlA1) & "]"
'    Debug.Print "左端の列:"; Target.Columns(1).Column
'    Debug.Print "右端の列:"; Target.Columns(Target.Columns.Count).Column
'    Debug.Print "上端の行:"; Target.Rows(1).Row
'    Debug.Print "下端の行:"; Target.Rows(Target.Rows.Count).Row

    Debug.Print "個別取得:"
    Dim r As Excel.Range
    For Each r In Target.Areas
        Debug.Print "  [" & r.Address(False, False, xlA1) & "]"
        Debug.Print "    左端の列:"; r.Columns(1).Column
        Debug.Print "    右端の列:"; r.Columns(Target.Columns.Count).Column
        Debug.Print "    上端の行:"; r.Rows(1).Row
        Debug.Print "    下端の行:"; r.Rows(Target.Rows.Count).Row
    Next
    Debug.Print
End Sub

[ツリー表示へ]
タイトルRe^2: 範囲選択したセル情報が欲しい。
記事No15006
投稿日: 2010/10/28(Thu) 18:00
投稿者ミヤ
とりあえず連続した選択範囲のみ実現できれば、良いです。

現在は以下のようにアクティブなセルの行と列を取得しています。
Private WithEvents xlApp As Excel.Application
Private WithEvents xlWb As Excel.Workbook
Private WithEvents xlWs As Excel.Worksheet
Private Sub Command1_Click()
    MsgBox("セルを選択して下さい。", vbYesNo)
    Set xlApp = GetObject(, "Excel.Application")
    Set xlWb = xlApp.ActiveWorkbook
    Set xlWs = xlWb.ActiveSheet
  gyo= xlApp.ActiveCell.Row
    retu = xlApp.ActiveCell.Column
End Sub
コマンドボタンを押すとメッセージを表示して「はい」が押された時に
アクティブになっているセルの行と列を取得できるようになっています。

これを複数のセルを選択した時に最初のセルと最後のセルの行と列を知りたいと思いますが、
Private Sub objSheet1_SelectionChange(ByVal Target As Excel.Range)
    Debug.Print "全体=[" & Target.Address(False, False, xlA1) & "]
をどうやって組み込めばよいのか分かりません。

[ツリー表示へ]
タイトルRe^3: 範囲選択したセル情報が欲しい。
記事No15007
投稿日: 2010/10/28(Thu) 18:14
投稿者魔界の仮面弁士
> Private WithEvents xlWs As Excel.Worksheet
>     Set xlWs = xlWb.ActiveSheet
そのように記述しているのであれば、xlWs 変数のイベントとして
 Private Sub xlWs_SelectionChange(ByVal Target As Excel.Range)
が生成されるかと思います。セル範囲の選択時に、自動的にこのイベントが実行されます。

> コマンドボタンを押すとメッセージを表示して「はい」が押された時に
> アクティブになっているセルの行と列を取得できるようになっています。
現在選択中の Range オブジェクトは、Selection から得られますよね。
なので後は、先のサンプルの Target As Range に対して行ったのと同じことを、
その Range に対して行えば OK です。

[ツリー表示へ]
タイトルRe^4: 範囲選択したセル情報が欲しい。
記事No15015
投稿日: 2010/11/01(Mon) 15:06
投稿者ミヤ
Private Sub xlWs_SelectionChange(ByVal Target As Excel.Range)
↑を使えば、選択したセル範囲($G$11:$I$11みたいに)が変数Targetに代入されるのは
分かりました。
選択される範囲は1行n列なので、nを求めたいです。

Split関数を使って、「G」と「I」を取り出すことが出来ました。
「G」と「I」を整数に変換してI-G+1でnを求めたいです。
G⇒7、I⇒9、AA⇒27のように変換できる関数はありますでしょうか?

よろしくお願いします。

[ツリー表示へ]
タイトルRe^5: 範囲選択したセル情報が欲しい。
記事No15016
投稿日: 2010/11/01(Mon) 15:35
投稿者魔界の仮面弁士
> 選択される範囲は1行n列なので、nを求めたいです。

Range オブジェクトの Column プロパティで取得できますよ。

先に提示したサンプルにも書いてありますので、
VBA のヘルプと併せて、先の回答をもう一度確認してみてください。

[ツリー表示へ]
タイトルRe^6: 範囲選択したセル情報が欲しい。
記事No15017
投稿日: 2010/11/01(Mon) 16:54
投稿者ミヤ
ありがとうございます。
たしかにTarget.Columns(1).Column等を使ったら、
選択した範囲の先頭と終わりのセルの行と列を数字で取得できました。

ところで、Private Sub xlWs_SelectionChange(ByVal Target As Excel.Range)が発動する
タイミングが自分の意図しているのと違って困っています。
具体的な流れは、
@ユーザーがフォーム上のボタンを押す
A「セルを選択して欲しい」旨のメッセージを表示する
Bユーザーがセルを範囲選択してOKを押す
C範囲選択した先頭のセルから値のあるところまで下る。

上が発動して欲しいのはBとCの間なのですが、
実際はCの後に発動してしまいます。
なので、上から得られる値は値のある最下限のセルの行と列になってしまいます。

発動するタイミングをコントロールできないのでしょうか?

[ツリー表示へ]
タイトルRe^7: 範囲選択したセル情報が欲しい。
記事No15018
投稿日: 2010/11/01(Mon) 18:31
投稿者魔界の仮面弁士
> 発動するタイミングをコントロールできないのでしょうか?
イベントで処理するのではなく、Selection プロパティ経由で Range を得てみるとか。

> @ユーザーがフォーム上のボタンを押す
Excel の UserForm でしょうか。
VB6 の Form でしょうか。

> A「セルを選択して欲しい」旨のメッセージを表示する
これは MsgBox のことでしょうか。
フォーム上のラベルに表示したメッセージでしょうか。

> Bユーザーがセルを範囲選択してOKを押す
シート上に貼ったボタンでしょうか。
MsgBox の OK ボタンでしょうか。
フォーム上のボタンでしょうか。

> C範囲選択した先頭のセルから値のあるところまで下る。
…下(くだ)る、というのが何を意味しているのか分かりませんでした。

[ツリー表示へ]