• ベストアンサー

指定のシート、指定範囲だけエンタキーをTabキーに

いつもお世話になっております。 少し変なお願いかと思うのですが、 決まったシート(Sheet1)の指定した範囲(C5:Z50)のみエンターキーでTabキーの動き(横)にしたいのですが。 エクセルの設定変更をVBA化してみたのですが、設定を変えてしまうと当然ながら他のシートにも影響することが分かり、これは許容できないのでお知恵拝借したく。

質問者が選んだベストアンサー

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.5

No.2です >エラーとなり、アプリケーションの定義・・・と出て こちらでも確認しました。 まだLastCellがemptyの時に、ifで比較もしくはoffsetしているのが原因のようです。 修正した以下のコードなら、件のエラーが出ない事を確認しました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  Static LastCell As Range  If LastCell Is Nothing Then   Set LastCell = ActiveCell  End If  If Not Application.Intersect(Target, Range("C6:Z50")) Is Nothing Then   If LastCell.Address = Target.Offset(-1, 0).Address Then    Target.Offset(-1, 1).Activate   End If   Set LastCell = ActiveCell  End If End Sub

akira0723
質問者

お礼

何度もご回答いただきありがとうございました。 昨夜考えてこれ以上ご回答者様のお手数を煩わせるのは申し訳なく。 入力シートに「Tabキー使用」を大きく表示して対応としたいと思います。 また、保護で許可セル以外にはカーソルが行かないようにし、かつ入力漏れは空白セルの数でセル色が変わるように設定できましたのでこれをもって一旦Closeとさせていただきます。 本当にお手数をおかけし申し訳ありませんでした。

akira0723
質問者

補足

何度もすみません。 やっぱり動かずで、今度は If LastCell.Address = Target.Offset(-1, 0).Address Then でエラーとなりました。 範囲の最後のセルに適当に文字を入れると Target.Offset(-1, 1).Activate でエラーになりました。 色々試してみたら、シートにロックがかかっていない場合は希望通りに動くようです。 しかし、指定範囲を(B1:J36)に等に変えると同じエラーになりました。 範囲はシートで変えることがありますし、保護がかかった状態で横に動く必要があるのですが。 シートの保護(一部解除状態)でコードが影響受けるのでしょうか? 元々、保護セル以外への動きを想定しているのでもしシートの保護が影響するなら出直さないとだめですよね。 既に何が要因か正確にはわからなくなってきました。 何か当方のシート設定に抜けがあると思うのですが、申し訳ありません。

その他の回答 (6)

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.7

No.2です。 >大きなシートに散らばっている入力セルにエンターキーで順番に移動させたい 項目が決まっているなら、必要項目を入力フォームで入力、シートに転記、という方法が、ENTERによる移動方向の変更よりもスマートかな、と思います。 入力するセルが隣り合っていなくても、連続して入力できますし。 >シートにロックがかかっていない場合は~ >シートの保護(一部解除状態)でコードが影響受けるのでしょうか? 申し訳ありません。自分もシートの保護には詳しくないので、何とも言えません。 保護された範囲を変更しようとしないか限り、影響はないとは思うのですが。 LastCellではなく、No.4の方のApplication.MoveAfterReturnDirectionを使用したコードを組んでみました。また、複数シートで範囲が異なる場合にも対応してみました。これでどうでしょうか? 全てのシートにWorksheet_SelectionChangeを入れて、標準モジュールにSelectionChangeEventを入れて下さい。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  Call SelectionChangeEvent(Target) End Sub Public Sub SelectionChangeEvent(ByVal Target As Range)  Dim i As Long  Dim myFlg As Boolean '方向変更範囲か否か  Dim TabRange() As Range '方向変更範囲の配列  ReDim TabRange(1 To 2)  Set TabRange(1) = Worksheets("Sheet1").Range("C5:Z50")  Set TabRange(2) = Worksheets("Sheet2").Range("C5:E10")  myFlg = False  For i = 1 To UBound(TabRange)   If Target.Parent.Name = TabRange(i).Parent.Name Then    If Intersect(Target, TabRange(i)) Is Nothing Then     Application.MoveAfterReturnDirection = xlDown    Else     Application.MoveAfterReturnDirection = xlToRight     myFlg = True    End If   End If  Next i  If Not myFlg Then   Application.MoveAfterReturnDirection = xlDown  End If End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

なんぼ、初心者に入力させるため、ということらしいが、やりすぎ、考えすぎだろう。 ここへ質問しなくても、自力でできるなら、勝手にやったらよいが。 質問者は、VBA初心者ではないようでもあるが、キーイン情報は何より先に(基礎で)設定されるもので、ここを質問どおり細工するのは、考えすぎ、思い付きにすぎず、やりすぎと思う。 ーー 小生は下記はどうかなと思った。これも思い付きだが。 本来のTABを入れさせるのが一番素直で、よいはず。 説明してやってもらうのがよいと思う。 ーーーー Sheet1(入力シート限定)のイベントに、 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Dim d As Variant If Application.Intersect(Target, Range("D1:F10")) Is Nothing Then Exit Sub Else d = Split(Target, ",") r = Target.Row Range("D" & r & ":F" & r) = d End If Application.EnableEvents = True End Sub を入れて、d1セルに各列データをカンマ区切りで入れて、Enter。 本例のように、3列分なら、aa,123,567+Enter これで、Dx,Ex,Fxには aa,123,567が入る。 (Dx,Ex,Fxとは、xは入力した行番号を指す。) Delimiter文字は他でも(Splitの部分を変えれば)可能。 これは操作者に覚えてもらわないと、いけないが。 == セル範囲や列の数は、質問の例と違うか、修正は簡単だろう。 できるだけ回答者のテストの便利のために、A列の近くでのテスト例に、列数も3-5行で説明してほしいから、あえてこうした。この辺考慮する質問者は少ないが。

akira0723
質問者

お礼

ご回答ありがとうございました。 おっしゃる通りだと思います。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.4

> 、残念ながら全く変化なし(入力可能セルを上から順に下に移動)します。 Application.EnableEvents = True がSheet1以外を選択したときの動作で必要なのに抜けていました。 現状では必要ないかもしれませんが、以後何かコードを追加したときに必要かもしれないので入れておきます。 以下のような感じでいかがですか。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False If Sh.Name <> "Sheet1" Then Application.MoveAfterReturn = True Application.MoveAfterReturnDirection = xlDown Application.EnableEvents = True Exit Sub End If Application.MoveAfterReturn = True Application.MoveAfterReturnDirection = xlToRight Application.EnableEvents = True End Sub

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.3

Sheet1がアクティブな時だけ設定するようにすればかがでしょう。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False If Sh.Name <> "Sheet1" Then '設定を戻す Exit Sub End If '設定をする Application.EnableEvents = True End Sub

akira0723
質問者

お礼

ありがとうございました。 今回はどうも当方のシートに問題があるようなので一旦Closeさせていただきます。 (ご回答者様各位への被害の拡大防止です)

akira0723
質問者

補足

いつもお世話になっております。 実際のシートには保護をかけて、「ロックされていないセル範囲の選択」にしてあるのでご回答の条件でも問題ありません。 他のBookでも同様のケースがあったので、汎用性を考えてどうせなら後出しよりはと範囲指定させていただきましたが、ご提案で十分です。 が、残念ながら全く変化なし(入力可能セルを上から順に下に移動)します。 因みにシートからロックを外しても上から順に下に動きます。(横には移動しません) 全く無反応です。 F8でも全く変化なし。 やりたいことは、大きなシートに散らばっている入力セルにエンターキーで順番に移動させたいのでどうしても横移動でないと、非常に入力しづらいのです。 例えば、宛先欄の郵便番号、住所、氏名、・・・という枠内セルに、郵便番号の次に「支払い条件」セルとなって、下まで入力したら住所・・・というような動きになります。 最悪は必要な項目を全部縦に並べる方法も考えましたが、従来紙に入力していた人にはなじまないと思い何とかできないかと。 またまた、質問に不備があるならご容赦!!

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.2

ChangeイベントとかApplication.OnKey/Application.MacroOptionsとかGetAsyncKeyStateとか色々考えたのですが、SelectionChangeイベントで変更前のセルと比較して、直下に移動していたら右上に移動する、という方法で何とかできそうです。 ENTERだけでなく、マウスによるセルの選択でも右上のセルに移動してしまいますが。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  Static LastCell As Range  If LastCell Is Nothing Then   Set LastCell = ActiveCell  End If  If Not Application.Intersect(Target, Range("C6:Z50")) Is Nothing And LastCell.Address = Target.Offset(-1, 0).Address Then   Target.Offset(-1, 1).Activate  Else   Set LastCell = ActiveCell  End If End Sub 参考:https://www.moug.net/tech/exvba/0050141.html

akira0723
質問者

お礼

ありがとうございました。 今回はどうも当方のシートに問題があるようなので一旦Closeさせていただきます。 (ご回答者様各位への被害の拡大防止です)

akira0723
質問者

補足

早々のご回答ありがとうございます。 が、設定して最初の入力セルを選択したらすぐにエラーとなり、アプリケーションの定義・・・と出て下記のコードが黄色になりました。 それを無視してエンターを押すと普通に下に移動します。 当方のシート情報に何か抜けがあるようですがそれが分らないレベルですのでご容赦。 If Not Application.Intersect(Target, Range("C6:Z50")) Is Nothing And LastCell.Address = Target.Offset(-1, 0).Address Then

  • Nobu-W
  • ベストアンサー率39% (725/1832)
回答No.1

すみません Tabの動きにしたい という意図がいまいち理解できてないので 的はずれな回答かもしれませんが (´・ω・`) https://www.sony.jp/support/vaio/guide/excel/005.html 上記サイトのような事でしょうか? 逆質問となりますが、今エンタ~を押されると、どの方向にセル選択が移動 しますか? 下にさがっていく? もしそうだとしたら・・・ https://iinamotto.com/2013/04/579.html この設定で移動方向が変わりますよっ m(_ _)m

akira0723
質問者

お礼

ご回答の質問の1つに回答していませんでした。 入力前の範囲指定では一旦別セルに動いたときにはその都度必要な範囲を指定する必要があるので今回の主旨とは違っています。 私自身はこの方法も使うことがありますが、その場限りのケースのみしか有用性は無いと思っています。 繰り返し同じシートに入力する時にはセルの保護機能でカーソルの動きを決めています。 この範囲指定された状態で,横に動かしたいのです。 今回は不特定多数(PCスキル0)の人の紙への手書きをエクセルに入力する場合に、何とか抵抗を少なくしたくて質問しました。

akira0723
質問者

補足

現在エンターで下方向に動きます。 (ご回答にあるエンター時のカーソルの方向の設定は知っています) が、それを決まった範囲だけエンターで横に動くようにしたいのです。 回答の設定の変更では >設定を変えてしまうと当然ながら他のシートにも影響するすることが分かり・・・で質問しました。 複数の人が手書きの書式をエクセルに入力するように変更したいのでこのような要求になっています。

関連するQ&A

  • VBAでのセル範囲指定について

    お世話になります。 私が分からないのは、VBAでのセル範囲指定なのですが、 例えば、シートにデータが有、そのデータの1行目は見出しなので 2行目からデータが入っているセルまでの範囲を指定、コピーして 隣のシートに貼付したいのですが、そのデータの入力される範囲が 毎回違います。「CurrentRegion.Select」としてしまうと、1行目 の見出しまでも範囲指定されてしますので、どうやったら良いのか どなたかお教え頂きたく宜しくお願い申し上げます。

  • エクセルで TABキーと同じ横への動き

    エクセルで TABキーと同じ横への動き エクセルのセル上で TABキーを押すと横へ動くと思いますが TABを押し慣れていないのでENTERキーで横へ動くように キー操作の変更したいのですが どうやって 変更できますか? (確か以前本で 動き方を変えられると見たことがありましたので)

  • エクセルに張り付けている画像をVBAで指定の範囲を削除し、画像サイズを

    エクセルに張り付けている画像をVBAで指定の範囲を削除し、画像サイズを変更させることは可能でしょうか?似たように情報は見ましたが、どれも上手くいかずに困っています。具体的には、縦1000×横1200の画像があります。(上50、下80、左150、右200)を削除し、縦870×横850の画像にし、さらに90%にサイズをトリミングし、縦435×横425としたいのです。これをVBAで一発で行う方法があれば教えて下さい。また、同じシート、異なるシートに複数の画像があった場合、全てを同時にできましたらなお良いです。以上、宜しくお願いいたします。

  • エクセルの範囲指定(2002です)

     例えばA1:D5まで範囲指定したいときは、斜めにクリック&ドラッグすればいいですよね。 ところが、何の設定もしくは操作を誤ったのか、先程Excel立ち上げてみますと縦か横にしか 範囲指定できなくなっていたんです。この場合、 どうしたら元に戻せますか?操作方法を教えて下さい。

  • VLOOKUPのセル範囲指定

    VLOOKUP(検索値,セル範囲,列番号,検索型) のうち、セル範囲を別の色々なワークシート上のセル範囲として指定したい と思っています。 ワークシート名を書いたセルをT()で参照すればできるかと思ったのですが、 エラーになってしまいました。ワークシートが少数であればIFをつかって 場合わけをしても良いのですが、そこそこ数がある上にこれから増えるかも しれないので、どうにかワークシート名を簡単に変更・指定できる方法が ないか悩んでいます。 なにか知恵があれば教えてください。 よろしくお願いします。

  • VBA 範囲指定について

    VBAでシートAの範囲A1:B200までをコピーして シートBの範囲A1:B200にコピペしたいのですが、 範囲のB200のみ変動する可能性があるので、その変動に対応出来るようにしたいです。 例) Worksheets("A").Activate PD = Worksheets("入院費用一覧").Range("A1:B〇〇〇").Value Windows("B").Activate Worksheets("B").Range("A1:B〇〇〇").Value = PD B〇〇〇の所に変動できる数値を関数でC1に行数指定して対応できないかと考えていますが、何かいい方法有りますでしょうか。 宜しくお願い致します。 ※VBAあまり詳しくはありません。

  • VBAで印刷範囲指定を複数

    お世話になります。 Execelのシート上でVBAを使って印刷範囲を複数飛び飛びに添付のような 感じで指定する方法をご教示いただきますか? どうも、改ページプレビューが残ったりしてうまくいきません。 一塊の一範囲に1ページとしたいです。 多量に指定するので文字列の制限とかもあるのですか? よろしくお願いします。

  • Excelのグラフ範囲をセル内容で指定したい

    皆さんに知恵をお貸しいただきたく思います。 同じようなグラフをグラフ範囲を変えて複数作成するために、以下のようなことを考えています。 ・sheet1のA1セルにグラフ対象範囲を格納し、 例)[別のbook]sheet2!A1:E50 ・グラフの範囲にsheet1のセル内容を範囲として設定する ということをしたいのですが、うまくいきません。 indirect関数を使ってみたのですが、グラフのプロパティの範囲部分にはindirect関数は書けないようでした。 また、VBAでグラフ範囲を修正するマクロを書こうとしましたが、 SetSourceData Source:= Sheet("sheet1").range("A1") と書くと、当然ながらsheet1!A1そのものを範囲として認識してしまいます。 取得した値をrangeに変換する方法を知りたいです。 どうかよろしくお願いします。

  • セル範囲と図形を指定してVBAで削除するには?

    エクセルで一枚のシートに複数のオートシェイプ(○、△、□)を使用したものがあります。 オートシェイプを使用しているセルの範囲は(A1:G20)と(AP1:AX20)の二箇所なのですが、 VBAで(A1:G20)の範囲にあるオートシェイプ(○のみ)を削除する事はできますか? (A1:G20)の範囲にあるオートシェイプは全体がこのセル範囲に入っています。 手動で、オブジェクトの選択で範囲指定をした後削除という方法もあるのですが この削除の作業の前後に他のVBAを使用しているので、 VBAで削除が出来ればと思います。 いろいろ検索したのですが、セル範囲もしくは図形のいずれかを指定して 削除する方法はあったのですが、両方を指定してのVBAがわかりませんでした。 よろしくお願いいたします。

  • Excel2007、pdfで保存範囲を指定する方法

    VBAでの質問です。 Excel2007の名前を付けて保存のpdfでExcelファイルブック全体を保存したいのですが、 各シートの余白に計算用のセルが多数存在しており、そのまま保存を行うと それもpdf化されてしまいます。 余白を除いた部分をきれいにまとめたものを、配布用のpdfにしたいのですが VBAでpdfの保存範囲を指定することは可能でしょうか? 印刷範囲の指定は聞いたことがありますが、保存範囲の指定は聞いたことがありません。 ご存知の方がいらっしゃいましたら、ご教授お願い致します。

専門家に質問してみよう