[[20040524175457]] 『EnterやTabで指定したセルだけに移動する方法』(ki) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『EnterやTabで指定したセルだけに移動する方法』(ki)

入力するセルが既に決まっているので、他のセルにはEnterやTabを押しても
とばされる様にしたいのですが、何かいい方法はありますでしょうか?


 2002ですと「ロックされたセルの選択不可」をシート保護で設定できます。
2000でもVBAとの組み合わせで出来ます。
ですから、バージョンを記入しましょう〜。
(KAMIYA)


返信ありがとうございます。
バージョンは2000になるのですが…
VBAの組み合わせ、どの様にしたら良いでしょうか??
度々すみません。。


 まず、移動させたいセルのロックをはずしておきます。
 (セルの書式設定、ロックのチェックをはずす)
続いて シートの見出しを右クリック、「コードの表示」を選択、
左側のThisWorkBookをダブルクリックして下記のコードを
右側のコードウィンドウへコピペします。
 
 Private Sub Workbook_Open()
 With Worksheets("Sheet1")
     .EnableSelection = xlUnlockedCells
     .Protect Contents:=True
 End With
 End Sub
 
いったんブックを保存して再度ブックを開くと有効になります。
これだと
↓ /↓ /↓
↓/ ↓/
というカーソル送りになるので、
→→→
 /
/
→→→
という送りの場合は
下記のコードのほうが良いかもしれません。
 
 Private Sub Workbook_Open()
 With Worksheets("Sheet1")
     .EnableSelection = xlUnlockedCells
     .Protect Contents:=True, UserInterfaceOnly:=True
 End With
     Application.MoveAfterReturnDirection = xlToRight
 End Sub
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
     Application.MoveAfterReturnDirection = xlDown
 End Sub
 
(KAMIYA)


KAMIYAさん、ありがとうございます。
ホントにできました!あんなに悩んでいたのに
感動です!

ただ、欲を言えばなんですが…

↓ /↓ /↓
↓/ ↓/

上記の様なカーソル送りになる方で良いのですが、
その移動するセルの順番を指定する事は不可能でしょうか?
何度も無茶な質問ですみません。。


 「良くある相談」なので、過去レスにも同様のものがあるかもしれませんが、
練習でつくってみました。
下記のような状況で試しています。
入力用のシートひとつ(Sheet1)、
入力順設定シーとひとつ(Sheet2)
Sheet2には入力用シートと同じアドレスのセルへ入力順を記入しておきます。
Sheet1でA1、A2、C1・・・と入力していく場合は
Sheet2のA1に1、A2に2、C1に3・・・と入力しておきます。
先ほどのWorkBook_Openを消して下記と差換えます。
 
 Dim C As Range, MyRng As Range
 Rem 入力シート名
 Const MySh As String = "Sheet1"
 Rem 移動順設定シート名
 Const NumSh As String = "Sheet2"
 Rem 移動順設定範囲
 Const Rng As String = "A1:G20"
 Private Sub Workbook_Open()
 Set MyRng = Worksheets(NumSh).Range(Rng)

 With Worksheets(MySh)
     .Unprotect
     .EnableSelection = xlUnlockedCells
     .Cells.Locked = True
     For Each C In MyRng
         If C.Value <> "" Then
         .Range(C.Address).Locked = False
         End If
     Next C
     .Protect Contents:=True
     .Activate
 End With
 End Sub
 
 さらに、入力用のシートのコードとして下記を追加します。
入力用として使用するシートオブジェクトのコードウィンドウへ貼り付けてください。

 Dim MyAdr As String
 Dim MyCount As Long
 Dim C As Range, MyRng As Range
 Rem 移動順設定シート名
 Const NumSh As String = "Sheet2"
 Rem 移動順設定範囲
 Const Rng As String = "A1:G20"

 Private Sub Worksheet_Change(ByVal Target As Range)
 Set MyRng = Worksheets(NumSh).Range(Rng)
 MyAdr = Target.Address
     With Worksheets(NumSh)
         MyCount = .Range(MyAdr).Value + 1
         MyAdr = .Range("A1").Address
         For Each C In MyRng
             If C.Value = MyCount Then
                 MyAdr = C.Address
                 Exit For
             End If
         Next C
     End With
 Me.Range(MyAdr).Select
 End Sub

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Application.EnableEvents = False
 Set MyRng = Me.Range(Rng)
    For Each C In MyRng
        If C.Locked = False Then
            C.ClearContents
        End If
    Next C
 Application.EnableEvents = True
 End Sub
 
いったん保存して開きなおすと有効になります。
こんなところでいかがでしょう。
Constのところを直せばそちらの状況にもすぐにあわせられると思います。
ダブルクリックで入力値クリア。
とりあえず、何があるか解らないので、使用の時は元のファイルを
バックアップしといてください。
(便利そうなんで、自分でも応用しよっと)
(KAMIYA)

 簡単に入力指定するものでは、このようにする方法もありますね。

  A  B  C
1 1  5  2
2 3		
3 4     6

 上の表で番号順に入力する場合ですが、

 挿入、名前、定義で、名前をINPUT、参照範囲にCtrlを押しながら、
 C1、A2、A3、B1、C6、A1と2番目、3番目〜1番目を指定しておきます。

 名前ボックスで、INPUTを指定しますと、入力範囲が選択され、各項目入力後
 EnterやTabで、次の項目に移動できます。
 矢印キーやマウスクリックでこの状況を解除できます。     (LOOKUP)

 なんだかデバッグしてましたら、結局、前掲のものは
不都合が出そう(未入力でEnterだとうまくいかない、
A1セルが入力セルになっていないとエラーが出る)なので、
浪速コトバのチェックマンが出現する前に修正版。
下記に差し替えしてください。
 
ThisWorkBookモジュール
 
 Dim C As Range, MyRng As Range
 Rem 入力シート名
 Const MySh As String = "Sheet1"
 Rem 移動順設定シート名
 Const NumSh As String = "Sheet2"
 Rem 移動順設定範囲
 Const Rng As String = "A1:G20"
 Private Sub Workbook_Open()
 Set MyRng = Worksheets(NumSh).Range(Rng)

 With Worksheets(MySh)
     .Unprotect
     .EnableSelection = xlUnlockedCells
     .Cells.Locked = True
     For Each C In MyRng
         If C.Value <> "" Then
         .Range(C.Address).Locked = False
             If (C.Value = 0) * (C.Value <> "") Then
             .Activate
             .Range(C.Address).Select
             End If
         End If
     Next C
     .Protect Contents:=True
     .Activate
 End With
 MyCount = 1
 End Sub
 
入力用シートのシートオブジェクトで
 
 Dim MyAdr As String
 Public MyCount As Long
 Dim C As Range, MyRng As Range
 Rem 移動順設定シート名
 Const NumSh As String = "Sheet2"
 Rem 移動順設定範囲
 Const Rng As String = "A1:G20"
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Application.EnableEvents = False
 Set MyRng = Worksheets(NumSh).Range(Rng)
     With Worksheets(NumSh)

         MyCount = MyCount + 1
         For Each C In MyRng
         If C.Value = 1 Then MyAdr = C.Address
             If C.Value = MyCount Then
                 MyAdr = C.Address
                 Exit For
             End If
         Next C
     End With
 Me.Range(MyAdr).Select
 If Worksheets(NumSh).Range(MyAdr).Value = 1 Then
 MyCount = 1
 End If
 Application.EnableEvents = True
 End Sub
 
また、入力順を設定するシートで入力順を
0から始まる連続値(0,1,2,3・・・)で設定してください。
登録後、いったん保存終了して開きなおすと有効です。
(KAMIYA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.