- ベストアンサー
Excel 条件に従いセル移動するには
よろしくお願いいたします。 A列には入力したくない行に"a"が入力してあるとします。 B列に上の行から数値を入力していくのですが、数値を入力してEnterを押すと次のA列に"a"が入力されていない行のB列セルに移動するVBAを教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
シート名タブを右クリックしてコードの表示を選び,現れたシートに下記をコピー貼り付けます private sub Worksheet_Change(byval Target as excel.range) if activecell.column <> 2 then exit sub do until cells(activecell.row, "A") <> "a" activecell.offset(1).select loop end sub 入力して,B列にとどまった場合に作動します。(例えばTab入力でC列に移動するとかでは作動しない) #既出回答で寄せられているマクロも同様にして登録しますが,1枚のシートに複数のこれらのマクロを同時に書いて作動させることは(原則として)出来ません。皆さんの回答を試すときは,イチイチブックを(シートを)複写してそれぞれ独自に動作を確認してください。 #selectionchangeイベントを使うのも良い方法に思いましたが,aの行に用事があってデータを記入したい場合にも素直に出来なくなってしまうので注意が必要です。 #changeイベントは,ご相談で想定している「セルに記入してEnterした」ばかりでなく,たとえば「オッと書き間違えたDeleteで消しました」とか「コピー貼り付けやオートフィルドラッグ等で複数のセルにデータを記入した」「セルをまとめて選んで消去した・行挿入・行削除した」などでも起動します。そういった「想定外」操作において,用意したマクロが意図しない動作をしないかキチンとチェックしておく事が完成度を高めますので,一体どういう具合に動作したら(=どんなマクロにしとけば)一番使い勝手がイイのか良く検討してみてください。
その他の回答 (5)
- keithin
- ベストアンサー率66% (5278/7941)
ん? >B列だけでなくD列やG列でも 変更前: if activecell.column <> 2 then exit sub 変更後: if application.intersect(activecell, range("B:B,D:D,G:G")) is nothing then exit sub 他にも,変更前のサンプルマクロを応用して「AND条件で,2でなく,4でもなく,6でもなければ即終了」のようにしてもOKです。 2とか4とは,もちろん2列目(B列)や4列目(D列)の事です。
お礼
できました!!大変参考になりました。ありがとうございました。今後もお世話になるかもしれません。よろしくお願いいたします。
- nattocurry
- ベストアンサー率31% (587/1853)
自分では作れないVBAマクロなんて厄介なものを使わずに、 オートフィルタで、A列が"a"じゃないものだけ表示させてから、普通にB列に入力していけば良いと思いますけど、それだと何か不都合でもありますか?
- imogasi
- ベストアンサー率27% (4737/17069)
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then 'MsgBox Target.Address i = Target.Row + 1 p1: If Cells(i, "A") = "a" Then i = i + 1 GoTo p1 Else Cells(i, "B").Select End If End If End Sub 既出回答に同じものがあれば、すみません無視してください。 例データ A列は入力全に設定有り(a以外の行を空白にしているが、何かa以外の文字が入っていても同じ。 下記は入力後の状態。 A列 B列 3 a 12 1 5 a a 7 a 3 a 6
お礼
ご返答ありがとうございました。試してみたところ、既出のものと同様ほぼうまくいきました。参考にさせていただきます。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 参考程度で・・・ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 2 And Selection.Count = 1 Then If Target.Offset(, -1) = "a" Then Target.Offset(1).Select End If End If End Sub こんな感じではどうでしょうか?m(__)m
お礼
ご返答ありがとうございました。試してみたところSelectionChangeではなくChangeのほうが都合がよかったので、そちらを採用することにしました。すごくシンプルでわかりやすかったです。
- kmetu
- ベストアンサー率41% (562/1346)
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then For i = Target.Row + 1 To Rows.Count If Range("A" & i) <> "a" Then Exit For End If Next Range("B" & i).Select End If End Sub とかいかがですか。
お礼
お早いご返答ありがとうございました。試してみたところほぼうまくいきました。シンプルな内容で参考になりました。またよろしくお願いいたします。
補足
ご返答ありがとうございました。試してみたところほぼうまくいったのですが、B列だけでなくD列やG列でも同様の動きをさせたいときは、どう追加すればいいですか?