dポイントプレゼントキャンペーン実施中!

VBAで、セルに入力後Enterキーで横に移動させる事は何とかなったのですが、入力が無い時はEnterキーで斜め下のセルに移動したいんです。

例えば、E2に入力として、入力しないでEnterキーを押すとD3に移動したいんです。
範囲はE2:E40ぐらいなんですが・・・
どなたかご教授下さい。宜しくお願いします。

A 回答 (4件)

横レス失礼します。



>「Enterを押すは書けない」のような内容しか出てこなかったんです。

内容によっては、書けないことはないのですが、コーディングが難しいです。一応、ご希望どおり動くと思いますのでアップしますね。ちょっと長いですが、とりあえず、コピー&ペーストして動かして見てください。

【手順】
1. EXCELシート選択タブで対象シートを選択し、右クリック
2. [コードの表示]クリック
3. Visual Basic Editor起動(以下VBE)
4. 開いたウインドウに下記VBAコードをコピー&ペースト
5. VBEを閉じる

【ロジック】
1. Worksheet_SelectionChange イベントで Target が E4:E44 の範囲にある場合、ScrollArea プロパティを操作し、Enter後にB列にカーソルが移動するようにする。
2. 1.でカーソルがB列に移動すると、もう一度 Worksheet_SelectionChange イベントが発生するので、今度は ScrollArea を解除
3. Worksheet_Change イベントで変更のあったセルが E4:E44の範囲にあり、かつ値が空でなければ、Target.Offset で D列にジャンプ

【カスタマイズ】
Targetが指定のセル範囲にあるか、いちいち判定式を書くのが面倒でしたので、関数化してあります。シートの作りが変更された場合、この関数に渡すセル範囲とOFFSETで移動する量を調整して下さい。

【VBAコード:場所=シートモジュール】(次行から終わりまで)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  
  'カーソルの移動方向を制御している場合はこんな感じ
  If InArea(Target, Range("B4:E44")) Then
    Application.MoveAfterReturnDirection = xlToRight
  End If
  'メイン部分
  If InArea(Target, Range("E4:E44")) Then
    Me.ScrollArea = "B:E"
  Else
    Me.ScrollArea = ""
  End If
  
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

  On Error GoTo ErrorHandler
  If InArea(Target, Range("E4:E44")) And Target.Value <> "" Then
    Target.Offset(1, -1).Select
  End If

ErrorHandler:
  Exit Sub
  
End Sub

'【関数】セルが指定範囲に含まれるか
Private Function InArea(TargetCell As Range, rArea As Range) As Boolean
  InArea = False
  On Error GoTo ErrorHandler
  If TargetCell.Count > 1 Then Exit Function
  Set s = Intersect(TargetCell, rArea)
  If Not s Is Nothing Then InArea = True
ExitHandler:
  Set s = Nothing
  Exit Function
ErrorHandler:
  InArea = False
  Resume ExitHandler
End Function
    • good
    • 0
この回答へのお礼

KenKen_SPさん

手順から丁寧に教えて頂きありがとうございます。
思い通りの動きになりますぅ!。
VBAは最近始めたもので、こんなに難しくなるとは思いませんでした。自分では絶対無理でした。入力時の手間が省けて助かります。

入力後の横移動ですが、こんな感じで入れておりました。
(こっちは検索すると複数 出るんですよね)

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect _
(Target, Range("B4:D44")) Is Nothing Then

Target.Offset(0, 1).Activate
End If

End Sub

お礼日時:2005/03/08 15:09

matsu_junです。


私がやろうとしていた以上のことをKenKen_SPさんがお書きになりましたので、正直脱帽です。今更拙作を披露することができなくなってしまいました。(実はまだ構想だけで作っていなかったのですが)
私も「SelectionChange」で処理しようとしていたのですが、「ScrollArea」は思いつかなかったです。

というわけでKenKen_SPさまの回答に乗っかっちゃいまして、蛇足となりますがご利用のブックのプロジェクト「ThisWorkbook」に、以下のコードを挿入しておくと、開いている別のブックを編集したい時や、一度このブックを閉じた時に、Enterを押した時のカーソルの移動が下方向に戻ります。
Microsoft Visual Basic の左側、プロジェクトウィンドウから「ThisWorkbook」をダブルクリックして後、右側のエディタ部に書き込んでいただければ幸いです。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.MoveAfterReturnDirection = xlDown
End Sub

Private Sub Workbook_Deactivate()
  Application.MoveAfterReturnDirection = xlDown
End Sub


また、KenKen_SPさんのコードを汚して申し訳ないですが、

  'カーソルの移動方向を制御している場合はこんな感じ
  If InArea(Target, Range("B4:E44")) Then
    Application.MoveAfterReturnDirection = xlToRight
  End If

上の部分を

  If InArea(Target, Range("B4:E44")) Then
    Application.MoveAfterReturnDirection = xlToRight
  Else
    Application.MoveAfterReturnDirection = xlDown
  End If

このように追記するくらいですか。これでB4:E44からカーソルが外れたら、Enterを押した時のカーソルの移動が下方向に戻ります。
    • good
    • 0
この回答へのお礼

matsu_junさん

ありがとうございます。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.MoveAfterReturnDirection = xlDown
End Sub
は書いていたのですが「複数のブックを開くとちょっと困るかな?」と思ってはいました。
まだ始めたばかりで、そんな発想すら浮かばなかったし、もう少し簡単な処理で済むものと漠然したイメージだけだったんです。こんなになるとは予想外でした。
matsu_junさん、KenKen_SPさん、ありがとうございました。

お礼日時:2005/03/09 09:17

kkmさん初めまして。

おはようございます。matsu_junです。
確か前回の質問の際は、ツール(T)-オプション(O)から「編集タブ」内の「入力方向」を変更することで解決されたと記憶しております。
その際私は見ていただけでアドバイスできませんでしたが(というより知りませんでしたが)、今回の場合はマクロを使って実現はできます。ただしそれなりの制限と追加説明が必要になります。

制限事項)
1) これまで、これからの物を含む全てのブックで実現するのは難しそうです。
  ある特定のブック(1つとは限らなくても)について、ということであれば容易です。
2) 質問のような動作を行うセル群は、「セルの結合」されていてはいけません。
  (不可能ではないのですが、少々マクロの作成が面倒になりますので・・・)

上の2つの制限事項に問題が無ければマクロを作れますので、以下の補足要求にご回答ください。

補足要求)
1) 前回セルを横に移動させるとしましたが、右移動ですか? 左移動ですか?
  簡単な例で示してくれるとうれしいです。(例:D列でEnterを押すとE列へ移動する)
2) 斜め下移動させたいセル範囲は固定されていますか?それともしょっちゅう変わるのですか?
  ハッキリしているのならそのセル範囲を教えてください。「E列全部」とかでもOKです
3) そもそもカーソルの横移動はシート全体に摘要したいのですか?
  それともこれも斜め移動したい範囲と同じで、他は下移動でよいのですか?
4) ある特定のシートだけで実装したいのですか?それともあるブックについて全てのシートで
  実装したいのですか?特定のシートの場合はシート名を教えてください。

以上、ご回答いただければ作成いたします。

この回答への補足

matsu_junさん、初めまして。
宜しくお願いします。

制限事項は単独シートで使用し、セルの結合はありません。

1)右移動です。

2)B列から入力してD列の入力後E列に移動します。
E列が空白のままEnterなら1行下のB列へ、入力後Enterなら1行下のD列に移動したい。
E4が空白ならB5、入力があれがD5です。
質問と少し変わりますが大丈夫でしょうか?

3)横移動はB4:D44を範囲指定してます。

4)シート名「入力」のシートのみです。

色々と検索したのですが、「Enterを押すは書けない」のような内容しか出てこなかったんです。
申し訳ありません、宜しくお願いします。

補足日時:2005/03/08 10:28
    • good
    • 0

入力後に右横に移動するのは、


Worksheet_Change(ByVal Target As Excel.Range)

で行っているのかと思いますが、
入力しないで、[ENTER]キーのみの時は、関知してくれないので無理ではないかと思います。

右横移動も含めて、Application.OnKey で、
ENTERキーイベントを拾って、セルの入力チェック後、カーソル移動となるのではないでしょうか。
    • good
    • 0
この回答へのお礼

いろいろ検索して無理のような気はしていたのですが、検索の仕方が足りないのかと・・・・。
ありがとうございました。

お礼日時:2005/03/07 20:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!