オートフィルタがかかっている状態で、
ひとつ下の行のセルを選択したいです。
具体的には、エクセルシートで選択したセルの情報をフォームで編集するのですが、
そのフォームの中のスピンボタンで選択しているセルを上下に移動させたいのです。
以下のコードだと、当然ですがフィルタで抽出されたセル以外も選択されてしまいます。エクセルシート上での矢印キーやENTERキー(入力後にセルを移動する方向が下のとき)と同じ動きがしたいです。
どうかお助けください。。。
Private Sub SpinButton1_SpinUp()
Cells(Selection.Row - 1, Selection.Column).Select
Call UserForm_Initialize
End Sub
Private Sub SpinButton1_SpinDown()
Cells(Selection.Row + 1, Selection.Column).Select
Call UserForm_Initialize
End Sub
No.3ベストアンサー
- 回答日時:
こんにちは。
シンプルに ActiveCell から非表示の行までループで調べれば良いのでは?
例えば、こんな感じで。
Private Sub SpinButton1_SpinDown()
Call MoveCursor(1)
End Sub
Private Sub SpinButton1_SpinUp()
Call MoveCursor(-1)
End Sub
Private Sub MoveCursor(ByVal lMoveCount As Long)
If Not TypeOf Selection Is Range Then Exit Sub
Dim i As Long
i = lMoveCount
With ActiveCell
On Error GoTo Err_
While .Offset(i).EntireRow.Hidden
i = i + lMoveCount
Wend
.Offset(i).Select
On Error GoTo 0
End With
Exit Sub
Err_:
End Sub
ありがとうございました。
大変参考になりました。
非常にシンプルで的を得た手段です。
いろいろ試した結果、簡単に
Do
Cells(Selection.Row - 1, Selection.Column).Select
Loop While Selection.EntireRow.Hidden = True
で非表示行を探す方法を取りました。
KenKen_SP さんのOffsetを使用した方法のほうが
軽快で負担が少ないかと思います。
今後の参考とさせていただきます。
すばらしい回答をありがとうございます。
No.4
- 回答日時:
こんにちは。
以下は、UserForm のモジュールに貼り付けてください。
ただ、ひとつだけ、現在のコードには欠点があります。
UserForm を立ち上げた後に、オートフィルターの設定を替えた時に、その内容を見失ってしまいます。本来、オートフィルター側に、インスタンスの設定を加えなくてはなりません。そのためには、今のコードだけでは足りなくなります。
とりあえず試してみてください。
なお、そのままにしましたが、
Call UserForm_Initialize
というのは、ちょっとヘンです。Initialize は、UserForm を立ち上げたときに設定させるものですから、SpinButton をクリックするたびに、起動するというのは、意味が分かりません。こういうのは、サブルーチンを持ってきたほうがよいです。
'----------------------------------
Dim Rcol As New Collection
Dim i As Long
Dim j As Long
Private Sub SpinButton1_SpinUp()
'上へ
If Rcol.Count = 0 Then Call MakeCollection
j = ActiveCell.Column
With ActiveSheet
If .AutoFilterMode Then
i = -SpinButton1.Value
.Cells(Rcol(i).Row, j).Select
Else
If ActiveCell.Row > 1 Then
.Cells(ActiveCell.Row - 1, j).Select
End If
End If
'Call UserForm_Initialize
End With
End Sub
Private Sub SpinButton1_SpinDown()
'上へ
If Rcol.Count = 0 Then Call MakeCollection
j = ActiveCell.Column
With ActiveSheet
If .AutoFilterMode Then
i = -SpinButton1.Value
.Cells(Rcol(i).Row, j).Select
Else
If ActiveCell.Row < Rows.Count Then
.Cells(ActiveCell.Row + 1, j).Select
End If
End If
End With
'Call UserForm_Initialize
End Sub
Sub MakeCollection()
'オートフィルタの内容を取得する
Dim c As Range
Dim k As Long
Dim n As Long
Dim m As Long
With ActiveSheet
k = -1
If .AutoFilterMode Then
If Rcol.Count > 0 Then Exit Sub
For Each c In .AutoFilter.Range.Columns(1). _
SpecialCells(xlCellTypeVisible).Cells
Rcol.Add c
If ActiveCell.Row = c.Row Then
n = k
End If
k = k - 1
Next c
With Me
.SpinButton1.Max = -1
.SpinButton1.Min = -Rcol.Count
If n = 0 Then n = -1
.SpinButton1.Value = n
End With
Else
For m = 1 To Rcol.Count
Rcol.Remove m
Next m
End If
End With
End Sub
ありがとうございました。
UserForm_Initialize の中で表示項目の初期化などをしているため
そのままCallしましたが、おっしゃるようにプログラムとしては
良くないです。サブルーチン化することにしました。
また、私にはむずかしかったのですが、
spinボタンの使い方の発想がおもしろいと思います。
非常に参考になりました。
まだまだ始めたばかりですが、参考にさせていただきます。
No.2
- 回答日時:
No.1
- 回答日時:
End()を使用してみてはどうでしょうか。
Selection.End(xlDown).Select
Selection.End(xlUp).Select
というかんじで。
ただしこれだとオートフィルタの範囲の最下行の場合に、行の最終行(65536行目等)までとんでしまう為、以下のようにしてみました。
Private Sub SpinButton1_SpinUp()
If Selection.End(xlDown).Row = Rows.Count Then
Cells(ActiveSheet.AutoFilter.Range(ActiveSheet.AutoFilter.Range.Count).Row + 1, Selection.Column).Select
Else
Selection.End(xlDown).Select
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
昔のあなたへのアドバイス
過去のあなたへ一度だけアドバイスを送れる電話があったとします。 もしあなたがその電話を手にしたら、いつの自分にどのようなアドバイスを送りますか?
-
Offsetで可視セルだけを移動したい。
Excel(エクセル)
-
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
VBA オートフィルター状態から見えるセルの選択について
Excel(エクセル)
-
-
4
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
5
EXCELのVBA-フィルタ抽出後のセル選択方法
Visual Basic(VBA)
-
6
ExcelVBA:オートフィルタをかけたシート上でのセル内の値参照について
Visual Basic(VBA)
-
7
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい!関数SUBTOTALとC...
-
エクセルで、桁数の異なるデー...
-
色フィルターをかけた状態で、...
-
エクセルオートフィルタで余計...
-
エクセル:色の付いたデータを...
-
行番号の文字の色が青色の理由?
-
Excel関数、何がいけないのかわ...
-
オートフィルタで抽出したデー...
-
エクセルでのオートフィルタオ...
-
グーグルスプレッドシート 連番...
-
エクセルで作成 混合名簿から...
-
エクセルの計算表の下向き三角...
-
オートフィルタをかけた表に一...
-
色のついたセルにフラグを立た...
-
【Excel】 可視セルへの貼り付...
-
excelで奇数の行のみ削除したい
-
Excel2010 フィルタで抽出できない
-
Excelのオートフィルタをショー...
-
UsedRangeを使ってソートするこ...
-
エクセルの並べ替えでタイトル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルオートフィルタで余計...
-
エクセルで、桁数の異なるデー...
-
色フィルターをかけた状態で、...
-
エクセルのフィルタをかけると...
-
Excel関数、何がいけないのかわ...
-
教えて下さい!関数SUBTOTALとC...
-
オートフィルタで抽出したデー...
-
エクセルの計算表の下向き三角...
-
行番号の文字の色が青色の理由?
-
5の倍数の日付だけを抽出したい
-
excelで奇数の行のみ削除したい
-
色のついたセルにフラグを立た...
-
Excelでオートフィルタ時に交互...
-
関数で可視セルのデータ個数カ...
-
エクセルを使用してデジタルフ...
-
【Excel】 可視セルへの貼り付...
-
エクセルについて。 ソートで絞...
-
Excel2010 フィルタで抽出できない
-
エクセル:色の付いたデータを...
-
=SUBTOTAL に =COUNTIF の機能...
おすすめ情報