
オートフィルタがかかっている状態で、
ひとつ下の行のセルを選択したいです。
具体的には、エクセルシートで選択したセルの情報をフォームで編集するのですが、
そのフォームの中のスピンボタンで選択しているセルを上下に移動させたいのです。
以下のコードだと、当然ですがフィルタで抽出されたセル以外も選択されてしまいます。エクセルシート上での矢印キーや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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) エクセル365のVBAで困っています。どう修正したらよいか添削をお願いします 2 2023/05/03 17:35
- Excel(エクセル) エクセルVBAで次の二つを行いたいのですが思うように動きません。どう修正したらよいのでしょうか? 2 2023/04/22 14:55
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 複数セルに〇印をつけるマクロ 4 2022/09/07 05:33
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
このQ&Aを見た人はこんなQ&Aも見ています
-
Offsetで可視セルだけを移動したい。
Excel(エクセル)
-
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
VBA オートフィルター状態から見えるセルの選択について
Excel(エクセル)
-
-
4
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
7
エクセルで可視セルにのみ値貼り付けをする方法があったら教えて下さい やりたいこととしては フィルター
Excel(エクセル)
-
8
Excelのフィルター後の一番上のセルをコピーする(マクロ教えて。) Excelで5行目にフィルター
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel関数、何がいけないのかわ...
-
エクセルの計算表の下向き三角...
-
グーグルスプレッドシート 連番...
-
=SUBTOTAL に =COUNTIF の機能...
-
EXCELのフィルタオプションで
-
任意の順位があり、列範囲内か...
-
色フィルターをかけた状態で、...
-
VBA 表の1つ下のセルを選択する
-
オートフィルタで抽出したデー...
-
行番号の文字の色が青色の理由?
-
[Aviutl] ノイズ除去に関して
-
Excelで特定も文字を含む行全て...
-
Photoshopで画像を網点みたいに...
-
Excel2010 フィルタで抽出できない
-
エクセルのフィルタをかけると...
-
CでIIRフィルタを作りたいので...
-
エクセルで、桁数の異なるデー...
-
photoshopでフィルタを部分的に...
-
教えて下さい!関数SUBTOTALとC...
-
VLOOKUPで抽出したアドレスデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルオートフィルタで余計...
-
Excel関数、何がいけないのかわ...
-
行番号の文字の色が青色の理由?
-
教えて下さい!関数SUBTOTALとC...
-
オートフィルタで抽出したデー...
-
色フィルターをかけた状態で、...
-
=SUBTOTAL に =COUNTIF の機能...
-
エクセルのフィルタをかけると...
-
エクセルの計算表の下向き三角...
-
エクセルで、桁数の異なるデー...
-
Excel VBAでオートフィルタで抽...
-
オートフィルタをかけた表に一...
-
エクセルでのオートフィルタオ...
-
5の倍数の日付だけを抽出したい
-
Excel2010 フィルタで抽出できない
-
エクセル:色の付いたデータを...
-
excelで奇数の行のみ削除したい
-
Excel VBAでフィルタしたものに...
-
色のついたセルにフラグを立た...
-
Excelのセルのデータ:年...
おすすめ情報