- ベストアンサー
エクセルVBA ひとつ下の行を選択したい
オートフィルタがかかっている状態で、 ひとつ下の行のセルを選択したいです。 具体的には、エクセルシートで選択したセルの情報をフォームで編集するのですが、 そのフォームの中のスピンボタンで選択しているセルを上下に移動させたいのです。 以下のコードだと、当然ですがフィルタで抽出されたセル以外も選択されてしまいます。エクセルシート上での矢印キーや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
- banananan3
- お礼率100% (4/4)
- オフィス系ソフト
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 シンプルに 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
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 以下は、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ボタンの使い方の発想がおもしろいと思います。 非常に参考になりました。 まだまだ始めたばかりですが、参考にさせていただきます。
- cafe_au_lait
- ベストアンサー率51% (143/276)
SendKeysステートメントを使用してはいかがでしょうか?
お礼
どうもありがとうございました。 今回の件ではうまく動作しませんでした。 SendKeyは知らなかったので今後の参考にします。
- taka_s777
- ベストアンサー率57% (8/14)
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
- セルの選択について
<Sheet2のコード> Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not UserForm3.Visible Then UserForm3.Show 0 UserForm3.TextBox1.Text = Selection.Count End Sub *********************************************** <UserForm3のコード> Private Sub CommandButton1_Click() With Selection .MergeCells = True .WrapText = True .Value = TextBox2.Text & ComboBox1.Text End With UserForm3.Hide End Sub ---------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, lastrw2 As Integer, i As Integer lastrw = Sheet3.Range("A1").End(xlDown).Row lastrw2 = Sheet3.Range("B1").End(xlDown).Row If Sheet2.Range(Cells(5, 4), Cells(5, 100)).Select Then ・・・(1) For i = 1 To lastrw - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 1).Value Next i End If If Sheet2.Range(Cells(6, 4), Cells(6, 100)).Select Then ・・・(2) For i = 1 To lastrw2 - 1 ComboBox1.AddItem Sheet3.Cells(i + 1, 2).Value Next i End If End Sub ************************************************* ワークシート上でマウスで選択されたセルの行ごとにUserForm3のComboBox1で表示させる文字を変えたいのですが、どのようにすればよいのでしょうか。 上の(1)(2)だととマウスで選択されたセルではなく(1)(2)の範囲のセルが結合されてしまいます。。。 また、今はワークシート上でマウスを左クリックする度にUserForm3が表示されてしまいます。 これをワークシート上でマウスでセルを選択して右クリックするとUserForm3が表示される ようにしたりすることは可能なのでしょうか。
- ベストアンサー
- Visual Basic
- VBAで最終行の取得について
UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A B 1 ○○ ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A B 1 ○○ ×× 2 あいう アイウ 3 : : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize() Dim lasClm As Integer, i As Integer lasClm = Sheet1.Range("A1").End(xlToRight).Column For i = 1 To lasClm ComboBox1.AddItem Sheet1.Cells(1, i).Value Next i End Sub ********************************************* Private Sub CommandButton1_Click() Select Case ComboBox1.Text Case Sheet1.Cells(1, 1).Value '「○○」が選択 Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1) Case Sheet1.Cells(1, 2).Value '「××」が選択 Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2) End Select UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例) A B 1 ○○ ×× 2 あいう アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。
- ベストアンサー
- Visual Basic
- エクセルVBA「スピンボタン」について
エクセルVBA「スピンボタン」について スピンボタンとテキストボックスを組み合わせて Private Sub SpinButton1_Change() Me.TextBox1.Value = Me.SpinButton1.Value End Sub Private Sub UserForm_Initialize() With Me.SpinButton1 .Min = 1 .Value = .Min End With Me.TextBox1.Value = Me.SpinButton1.Min End Sub というコードを書きました。 「1、2、3、・・・10、11、・・・」という数の増加を「01、02、03・・・10、11・・・」という風にしたいのですがどのようにコーディングすればよいのでしょうか?お願いします。.
- ベストアンサー
- オフィス系ソフト
- Excel VBAについて
Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click() If ActiveCell.Row = 5 Then UserForm1.Show x = 1 ElseIf ActiveCell.Row = 6 Then UserForm2.Show x = 2 End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range) Controls("UserForm" & x).Label1.Caption = ・・・
- ベストアンサー
- Visual Basic
- アクティブセルの右側にユーザーフォームから入力したい。
アクティブセルの右側にユーザーフォームから入力したい。 すいません初心者で困ってます。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column = 7 Then '色付けをColumn=??に限定 Select Case .Value '反応させる文字列の入力と(.Row ?)~(.Row?)で色塗り範囲指定 Case "完了" Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 0 UserForm2.Show Case "提出中" Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 6 Case Else Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 0 End Select End If End With End Sub 台帳を作ってるんですが、リストから選択して”完了”と入力されるとUserForm2が開いて完了日を入力したいと思っております。 UserForm2はスピンボタンでそこそこ完成したんですが、”完了”に切り替えたセルの隣のセルに入力の方法が分からなくて困っております。 どなたか御教授ください。
- ベストアンサー
- Visual Basic
- エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい
エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい。 今、3列目に入力された値によって15列から17列の値を自動入力するように次の マクロを作りました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 3 Then Exit Sub For Each r1 In Selection If r1.Cells(1, 1) <> "部品表" Then Cells(r1.Row, 15) = "-" Cells(r1.Row, 16) = "-" Cells(r1.Row, 17) = "-" End If Next End Sub 3列目のみのセルをペーストすると正しく動作しますが、1列目から3列目のセルにペーストすると何も動きません。 正しく動くようにするには、どう修正すればいいでしょうか?
- ベストアンサー
- その他MS Office製品
- セルを選択するマクロ(エクセル)
Sub test() x = ActiveCell.Row y = ActiveCell.End(xlToLeft).Column z = ActiveCell.End(xlToRight).Column Range(Cells(x, y), Cells(x, z)).Select End Sub アクティブセルが含まれている行のみで、データが入力されている連続したセルを選択状態にするマクロとして、上記を考えました。 上記を違った形でもっと簡潔に表すことは可能でしょうか?
- ベストアンサー
- オフィス系ソフト
- VBA、このようなケースはどうしたらよいでしょうか?
すみません。VBA初心者なので質問がちぐはぐになるかと思いますが、よろしく お願いいたします。 Sub セル番地() Worksheets("Sheet1").Select Cells(2, 2).Select Range(Selection, Selection.End(xlDown)).Select rnum = Selection.Rows.Count - 1 MsgBox rnum End sub 上のVBAでシート1に数字入力されているセルの数を判断します。 Sub sheetcopy() For X = 3 To 100 If Cells(X, 2) <> "" Then Cells(X, 2).Copy Destination:=Worksheets("Sheet1").Cells(X + rnum, 2) ElseIf Cells(X, 2) = "" Then Exit For End If Next End sub このVBAは、選択しているシートに入っている数字をシート1へコピーするものです。 ”セル番地”で判定した変数rnumを、”sheetcopy”に記載されている変数rnum へ渡すためにはどのようにしたらよいでしょうか? 引数付きプロシージャの説明を読んでみたのですが、いまいちわかりませんでした。最終的には、各シートに入力されている数値をシート1のあいているセルへどんどんコピーさせたいのです。ひとつのプロシージャに書けば、問題なく動くのですが、見た目をすっきりさせたいと思います。 イメージとしてはこんな感じです。 sub sheetcomplete () call セル番地 Worksheets("Sheet2").Select call sheetcopy call セル番地 Worksheets("Sheet3").Select call sheetcopy ~ ~ End sub そもそも、よくわかっていないので滑稽に見えると思いますが、よろしくご指導ください。
- ベストアンサー
- Visual Basic
- ExcelのVBAで法人格を取りたい
エクセルのシート1の1行に1企業の情報があります。 セルを一つ選択し、クリックボタンを押すと、UserForm4がたちあがるコードを入れています。 ------------------------------------ gyo = ActiveCell.Row retu = ActiveCell.Column Cells(gyo, retu).Select UserForm4.TextBox4.Text = Cells(gyo, "w") '法人名 UserForm4.TextBox5.Text = Replace(Cells(gyo, "r").Value, "-", "") '郵便番号 UserForm4.TextBox6.Text = Cells(gyo, "s") '企業住所 UserForm4.TextBox7.Text = Replace(Cells(gyo, "aa").Value, "-", "") '電話番号 UserForm4.TextBox8.Text = Replace(Cells(gyo, "z").Value, " ", "") '氏名 UserForm4.TextBox9.Text = Replace(Cells(gyo, "y").Value, " ", "") '氏名カナ UserForm4.Show End Sub ------------------------------------ UserForm4.TextBox4に法人名を表示し、法人名は「株式会社」や「有限会社」のように法人格がついていますので、 法人格を取りたいと思い下記コードを作ってみました。 ------------------------------------ With Selection Selection.Replase what:="株式会社", Replasement:="" Selection.Replase what:="有限会社", Replasement:="" Selection.Replase what:="合資会社", Replasement:="" Selection.Replase what:="合名会社", Replasement:="" Selection.Replase what:="社団法人", Replasement:="" Selection.Replase what:="財団法人", Replasement:="" End With ------------------------------------ これをどのように上のコードに入れたらいいのでしょうか・・・・ どなたか教えていただけますでしょうか。 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
- エクセルVBAのユーザーフォームでのチェックボックス
PCでエクセル2003です シートのC列に0か1を表示したいのです。 いまのままではTUREかFALSEになってしまいます。 また、コマンドボタンで行を上下させるとチェックボックスのレ点も反映させたいのです。 あと、ボタンを押すたびにシート上も行がアクティブ(選択状態→A列を選択)になるにはどうすればいいのでしょうか? 上下移動のコマンドボタンに 下の関数をつけたらエラーが出て出来ませんでした Cells(1, myRowN).Select あとTEXTBOX3にはA列の行番号付けてるのを取得してますが、アクセスのレコードの様に数字を入力するとその行に飛ぶことって可能でしょうか? 具体的な関数は Private Sub UserForm_Initialize() myRowN = Worksheets("元").Range("a65536").End(xlUp).Row Call ChangeMe(myRowN) End Sub Private Sub CommandButton4_Click() '下に移動 If myRowN <= 65535 Then myRowN = myRowN + 1 Call ChangeMe(myRowN) End If 'Cells(1, myRowN).Select TEXTBOX1.SetFocus End Sub Private Sub CommandButton3_Click() '上に移動 If myRowN >= 3 Then myRowN = myRowN - 1 Call ChangeMe(myRowN) End If 'Cells(1, myRowN).Select TEXTBOX1.SetFocus End Sub Private Sub ChangeMe(lngRowNum As Long) TEXTBOX1.ControlSource = "B" & myRowN TEXTBOX2.ControlSource = "C" & myRowN CHECKBOX1.ControlSource = "D" & myRowN TEXTBOX3.ControlSource = "A" & myRowN End Sub 非常に長々と申し訳ありません、フォーム等に詳しい方がいらっしゃればお教え願えないでしょうか?
- ベストアンサー
- オフィス系ソフト
お礼
ありがとうございました。 大変参考になりました。 非常にシンプルで的を得た手段です。 いろいろ試した結果、簡単に Do Cells(Selection.Row - 1, Selection.Column).Select Loop While Selection.EntireRow.Hidden = True で非表示行を探す方法を取りました。 KenKen_SP さんのOffsetを使用した方法のほうが 軽快で負担が少ないかと思います。 今後の参考とさせていただきます。 すばらしい回答をありがとうございます。