こんにちは、盤屋の試験員です。
今日はエクセルにデータ入力する際の高速化について考えます。
エクセルでデータを入力する際未だに手打ちが必要な部分って多いですよね。
今回は、そんな入力を少しでも高速化するための小ネタマクロを紹介します。
第1回はマクロによるフォーカスの移動です。
フォーカスをマクロで動かすのは簡単ですが、問題はその順番と場所をどう指定するかです。マクロに順番を組み込みこともできますが、それでは汎用性に欠けるので、今回はセルに名前を付けて対応します。
あまり知られてませんが、エクセルではセルに名前を付けられます。
セルを選択した際に場所”A1”などが表示されている部分は”名前ボックス”というらしく、ここでセルやセル範囲に命名できます。
今回は、セル単体に”SEL_●●"(●=数字)という名前を付けています。
"SEL_"の4文字を選択候補の識別子として、後の数字の順番に選択していくようにコードを組み立てます。
下がサンプルコードになります。
このコードを、モジュールに貼り付けてください。
------------------------------------------------------------------------------
Option Explicit
Public Function GetRangeName(TergetCell As Object) As String
'指定したセルの範囲名称を返します。
Dim Q As Object
For Each Q In ActiveWorkbook.Names
If Not (Application.Intersect(TergetCell, Q.RefersToRange) Is Nothing) Then
GetRangeName = Q.Name
Exit For
End If
Next
End Function
Public Sub NextTerget(TergetCell As Object)
'ターゲットセルの次のセルを探索します。
Dim Q As Object
Dim S As String
Dim D() As String
Dim M As Integer
Dim I As Integer
Dim L() As Integer
Const Tgs As String = "SEL_"
'ターゲットセルの取得
S = GetRangeName(TergetCell)
If S = "" Then Exit Sub
D = Split(S, Tgs)
If UBound(D) = 1 And D(0) = "" Then
If IsNumeric(D(1)) = False Then Exit Sub
Else
Exit Sub
End If
M = Val(D(1))
ReDim L(ActiveWorkbook.Names.count)
'目標セルを探す
For Each Q In ActiveWorkbook.Names
S = Q.Name
D = Split(S, Tgs)
If UBound(D) = 1 And D(0) = "" Then
If IsNumeric(D(1)) Then
If Val(D(1)) > M Then
L(I) = Val(D(1))
I = I + 1
End If
End If
End If
Next
Select Case I
Case 0
Exit Sub
Case 1
M = L(0)
Case Else
ReDim Preserve L(I - 1)
M = L(0)
For I = 1 To UBound(L)
If M > L(I) Then M = L(I)
Next
End Select
S = Tgs & CStr(M)
If S <> "" Then ActiveWorkbook.Names(S).RefersToRange.Select
End Sub
-------------------------------------------------------------------------------
このマクロは対象のセルの名前を取得し、その名前の末尾の数字から最も近い数字を持つセルへフォーカスを移すものです。
これは本体なので、そのままでは意味を成しません。
次にワークシートに変更があった際にマクロが発動するようにワークシートの記述シートに次のコードをコピペします。
-------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Call NextTerget(Target)
End Sub
-------------------------------------------------------------------------------
これは、Worksheetのイベントになるので、複数シートがある場合は全部のシートに記載が必要になります。
次に、入力順番でセルに名前を付けていきます、 SEL_1 → SEL_2 ・・・
これについては 結構面倒かつ地味な作業ですが一度だけなので頑張ってください。(慣れた人なら名前つけるマクロとか作った方が楽ですけどね。)
これで完成です。このシートで値が変更されると
SEL_1 → SEL_2 → SEL_3 ・・・・ と順番にフォーカスが移ります。
このマクロは選択したセルの値が変更されれば勝手にフォーカスが動くので、バーコードリーダ・音声入力でのデータ自動入力の際にも使用できます。
結構応用範囲の広いマクロですので、参考にしていただければ幸いです。
----------------------------------------------
マクロの作成承ります。興味があったら相談してみてください。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓