アプリ版:「スタンプのみでお礼する」機能のリリースについて

仕事で,
・G列の入力が1~4ならば,その行のL列にのみ入力する。
・G列の入力が5~8ならば,その行のJ,K列にのみ入力する。
というシートを作ろうとしています。
そこで,以下のようなマクロを作成してみました。
しかし,
①セルに何かを入力するたびに読み込みが入り,重くなる
②Tabキーで隣に進んだ後,Enterキーで下の行の左側にActiveCellが移動してくれない
という問題があります。
この2つの問題を解決するためにはどうすればよいのでしょうか。

---------------------------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)

'アクティブシートの保護を解除する
ActiveSheet.Unprotect

'変数の宣言と最終行までの繰り返し作業の設定
Dim i As Integer
For i = 7 To 205

'アクティブシートの特定セルのロックを解除する
ActiveSheet.Range(Cells(i, 10), Cells(i, 12)).Locked = False

'アクティブシートの特定セルをロックする
Select Case Cells(i, 7).Value
Case 1, 2, 3, 4
ActiveSheet.Range(Cells(i, 10), Cells(i, 11)).Locked = True
Case ""
ActiveSheet.Range(Cells(i, 10), Cells(i, 12)).Locked = True
Case Else
ActiveSheet.Cells(i, 12).Locked = True
End Select

Next i

'アクティブシートを保護する
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False, AllowFiltering:=True

End Sub

---------------------------------------------------------------------------------------------------

A 回答 (2件)

こんにちは。

参考になれば。

>①セルに何かを入力するたびに読み込みが入り,重くなる

Change イベントにおいて値が変更されたセルは Target で参照される。
Target とセル範囲 G7:G205 が交差しない場合、さっさと終了する。

>②Tabキーで隣に進んだ後,Enterキーで下の行の左側にActiveCellが移動してくれない

Loced プロパティーの操作完了前に Tab キーでカーソルが動いてしまうため。

簡易的な対処例:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r_change As Range
  Set r_change = Intersect(Target, Range("G7:G205"))
  If r_change Is Nothing Then
    Exit Sub
  End If
  
  ' 必要な処理~
  
  r_change.Cells(1).Select
  SendKeys vbTab
End Sub

その他ポイント

1. Dim i As Integer → 行番号を受ける場合、Long型が望ましい
2. For i = 7 To 205 → 全件処理ではなく、Target、Intersect
  などを使って変化のあったセルのみに処理対象を絞る
    • good
    • 0

こんばんは


入力支援を目的としている処理と判断すると、
多分Worksheet_Changeイベントではなく(を使わず)
標準モジュールに任意名のプロシージャを作成して
ボタンなどから実行する方が良いと思います。

もし、イベントで行うなら、Open系のイベントで
    • good
    • 0

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