- ベストアンサー
指定のシート、指定範囲だけエンタキーをTabキーに
いつもお世話になっております。 少し変なお願いかと思うのですが、 決まったシート(Sheet1)の指定した範囲(C5:Z50)のみエンターキーでTabキーの動き(横)にしたいのですが。 エクセルの設定変更をVBA化してみたのですが、設定を変えてしまうと当然ながら他のシートにも影響することが分かり、これは許容できないのでお知恵拝借したく。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (6)
- Mathmi
- ベストアンサー率46% (54/115)
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/17069)
なんぼ、初心者に入力させるため、ということらしいが、やりすぎ、考えすぎだろう。 ここへ質問しなくても、自力でできるなら、勝手にやったらよいが。 質問者は、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行で説明してほしいから、あえてこうした。この辺考慮する質問者は少ないが。
お礼
ご回答ありがとうございました。 おっしゃる通りだと思います。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> 、残念ながら全く変化なし(入力可能セルを上から順に下に移動)します。 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
- ベストアンサー率66% (1725/2595)
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
お礼
ありがとうございました。 今回はどうも当方のシートに問題があるようなので一旦Closeさせていただきます。 (ご回答者様各位への被害の拡大防止です)
補足
いつもお世話になっております。 実際のシートには保護をかけて、「ロックされていないセル範囲の選択」にしてあるのでご回答の条件でも問題ありません。 他のBookでも同様のケースがあったので、汎用性を考えてどうせなら後出しよりはと範囲指定させていただきましたが、ご提案で十分です。 が、残念ながら全く変化なし(入力可能セルを上から順に下に移動)します。 因みにシートからロックを外しても上から順に下に動きます。(横には移動しません) 全く無反応です。 F8でも全く変化なし。 やりたいことは、大きなシートに散らばっている入力セルにエンターキーで順番に移動させたいのでどうしても横移動でないと、非常に入力しづらいのです。 例えば、宛先欄の郵便番号、住所、氏名、・・・という枠内セルに、郵便番号の次に「支払い条件」セルとなって、下まで入力したら住所・・・というような動きになります。 最悪は必要な項目を全部縦に並べる方法も考えましたが、従来紙に入力していた人にはなじまないと思い何とかできないかと。 またまた、質問に不備があるならご容赦!!
- Mathmi
- ベストアンサー率46% (54/115)
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
お礼
ありがとうございました。 今回はどうも当方のシートに問題があるようなので一旦Closeさせていただきます。 (ご回答者様各位への被害の拡大防止です)
補足
早々のご回答ありがとうございます。 が、設定して最初の入力セルを選択したらすぐにエラーとなり、アプリケーションの定義・・・と出て下記のコードが黄色になりました。 それを無視してエンターを押すと普通に下に移動します。 当方のシート情報に何か抜けがあるようですがそれが分らないレベルですのでご容赦。 If Not Application.Intersect(Target, Range("C6:Z50")) Is Nothing And LastCell.Address = Target.Offset(-1, 0).Address Then
- Nobu-W
- ベストアンサー率39% (725/1832)
すみません Tabの動きにしたい という意図がいまいち理解できてないので 的はずれな回答かもしれませんが (´・ω・`) https://www.sony.jp/support/vaio/guide/excel/005.html 上記サイトのような事でしょうか? 逆質問となりますが、今エンタ~を押されると、どの方向にセル選択が移動 しますか? 下にさがっていく? もしそうだとしたら・・・ https://iinamotto.com/2013/04/579.html この設定で移動方向が変わりますよっ m(_ _)m
お礼
ご回答の質問の1つに回答していませんでした。 入力前の範囲指定では一旦別セルに動いたときにはその都度必要な範囲を指定する必要があるので今回の主旨とは違っています。 私自身はこの方法も使うことがありますが、その場限りのケースのみしか有用性は無いと思っています。 繰り返し同じシートに入力する時にはセルの保護機能でカーソルの動きを決めています。 この範囲指定された状態で,横に動かしたいのです。 今回は不特定多数(PCスキル0)の人の紙への手書きをエクセルに入力する場合に、何とか抵抗を少なくしたくて質問しました。
補足
現在エンターで下方向に動きます。 (ご回答にあるエンター時のカーソルの方向の設定は知っています) が、それを決まった範囲だけエンターで横に動くようにしたいのです。 回答の設定の変更では >設定を変えてしまうと当然ながら他のシートにも影響するすることが分かり・・・で質問しました。 複数の人が手書きの書式をエクセルに入力するように変更したいのでこのような要求になっています。
お礼
何度もご回答いただきありがとうございました。 昨夜考えてこれ以上ご回答者様のお手数を煩わせるのは申し訳なく。 入力シートに「Tabキー使用」を大きく表示して対応としたいと思います。 また、保護で許可セル以外にはカーソルが行かないようにし、かつ入力漏れは空白セルの数でセル色が変わるように設定できましたのでこれをもって一旦Closeとさせていただきます。 本当にお手数をおかけし申し訳ありませんでした。
補足
何度もすみません。 やっぱり動かずで、今度は If LastCell.Address = Target.Offset(-1, 0).Address Then でエラーとなりました。 範囲の最後のセルに適当に文字を入れると Target.Offset(-1, 1).Activate でエラーになりました。 色々試してみたら、シートにロックがかかっていない場合は希望通りに動くようです。 しかし、指定範囲を(B1:J36)に等に変えると同じエラーになりました。 範囲はシートで変えることがありますし、保護がかかった状態で横に動く必要があるのですが。 シートの保護(一部解除状態)でコードが影響受けるのでしょうか? 元々、保護セル以外への動きを想定しているのでもしシートの保護が影響するなら出直さないとだめですよね。 既に何が要因か正確にはわからなくなってきました。 何か当方のシート設定に抜けがあると思うのですが、申し訳ありません。