[Excel] 黙々と入力する際の設定

エクセルで入力作業をする際の設定です。
設定しなくても入力はできますが、ちょっと手を入れてあげれば楽になる場合もあります。
エクセルのバージョンや個々の設定によって機能しない場合もございますのでご了承ください。

ここでは表形式で入力していくことを想定しています。
１件につき１行使い、列ごとに該当項目の内容を入力します。行をレコード、列をフィールドと呼ぶやつです。


## セルの編集
セルに文字を打ち込む際、「入力」と「編集」という二つのモードがあります。
セル選択の状態でキーボードを押して文字を入れると「入力」になります。
セル選択の状態でBackSpaceを押すと、セルの中身をクリアしてから「入力」になります。
一方、セル選択の状態で`F2`(ファンクション2)を押すと「編集」になります。
入力と編集の違いは、入力の場合は矢印キーを押すと「セルの移動」になります。
編集の場合は矢印キーを押すと「セル内でのカーソルの移動」になります。
(矢印キーだけでなく`Home`や`End`ボタンも同様です)
`F2`ボタンは押すごとに編集と入力を切り替えてくれるので、セルの移動と、セル内のカーソルの移動で使い分けることができます。

### 注意点
IMEがオンの状態で、変換が確定していない場合は、矢印キーを押しても文字列内の移動となります。

## セルの移動
Tabで右のセルに移動します。
Enterでは移動先を選ぶことができます。オプションで設定してください。
余談になりますが、私はセル値を確定したら数式バーで内容を確認したいので、Enterを押しても移動しない様にしています。

## 入力規則
入力規則もいろいろありますが、入力作業のときは列ごとに、IMEの「オン」または「オフ(英語モード)」を設定しておくと楽になります。
数字やアルファベットなど半角しか入力しない場合はオフにします。
日本語など全角を入力する場合はオンにします。
このIMEのオン・オフはセルを移動してきたときに作用します。「半角／全角キー」を押せば切替えられます。

## 表示／非表示
入力に必要のない列は非表示にしておきます。
これだけで作業がはかどることもあります。

## 次の行への移動
VBAのイベント機能を使って次の行へ移動するようにすると、連続した入力が可能になります。

```VB
' シートモジュールに設置してください。
' 17列目以降が選択された場合は次の行の先頭にカーソルを移動します。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column >= 17 Then
    Cells(Target.Row + 1, 1).Select
  End If
End Sub
```

このマクロは対象のシートのモジュールに置いてください。
セルの選択が変更された際にこのイベントは発生します。
If～End Ifの間にいろいろ追加することもできます。
`thisworkbook.save`を追加すれば保存をしてくれます。
Target.Rowで入力していた行番号を取得できるので、入力値の確認などもできます。

## 小技

### ウィンドウ枠の固定
ウィンドウ枠の固定を使えば、ヘッダーやキーとなる入力値を常に確認することができます。

### ワークシート関数
入力の際はできるだけ数字のみにした方が早くて正確です。
例えば生年月日を入力する際、「年」や「月」まで入力すると「漢字の変換」が必要になり時間を取られます。
この場合は書式で表すことができるので、シリアル値を入れておけばいいという流れになると思います。
年と月と日をそれぞれ別の列で入力し、関数で計算して一つの生年月日にすることで効率アップにつながることもあります。

入力の際、関数を入れる列は非表示にしておきます。
入力が終わったら関数で計算し、それを値にしたら、年、月、日の列は削除してしまってもいいです。

逆に20010101と入力しておき、`=mid(xx, 1, 4)`などで分割することもできます。
文字の桁で分割する場合は、前ゼロ(1月を01と表す)などルールが必要です。

### 今日を入力する
`ctrl + ;`(コントロールを押しながらセミコロン)で今日の日付を入力することができます。
`ctrl + :`(コントロールを押しながらコロン)で今の時間を入力することができます。

### コピー
セルがひとつだけ選択されている場合に、`ctrl + d`(コントロールを押しながらd)でひとつ上のセルの内容をコピーしてくれます。
セルが複数行選択されている場合に`ctrl + d`で、選択範囲の最上段の内容を、選択範囲全体にコピーします。
セル選択の行が１つか複数かで、コピー元が範囲外と範囲内とで違うのでご注意ください。
ちなみに左から右へのコピーは`ctrl + r`です。
下から上、右から左へのコピーのショートカットはありません。

### セルの複数選択
セルを複数選択している状態でEnterやTabを押すと、選択している範囲の中だけでの移動になります。
このときは、オプションでEnterの移動先を移動しないに設定していても移動するようになります。

### 複数セルへの入力
セルを複数選択している状態で入力を開始し、確定させるためのEnterを`ctrl + Enter`(コントロールを押しながらEnter)に変えると、
選択範囲すべてに確定内容を入力することができます。同じ内容を入力するときに使います。
また入力値を`=int(rand()*99)`などにすると選択範囲内にランダムな数字を入力することができます。

### オートコンプリート
列方向のみですが、入力履歴をもとに入力候補が表示されます。
オートコンプリート機能をオンにしてください。
入力値を固定化するときは入力規則のリストを使うこともできます。
オートコンプリートも入力規則のリストも`Alt + ↓`(Altを押しながら矢印キーの下)で呼び出すことができます。

### 列幅
個人的には入力値の確認は数式バーを使います。場所が固定されていた方が探しやすいからです。
ただ「何を入力しているか」は知る必要がありますので、その場合はヘッダーを見ます。ヘッダーは数式バーのすぐ下にあるので視点の移動が短くて済みます。
その際、何のヘッダーかが分かる範囲で列幅を狭くしておくことが多いです。だいたい4～8くらいにしておきます。
列幅を狭くすることで、全体の中の位置も把握しやすくなります。

### ヘッダーの行数
並べ替えやオートフィルタを使う場合に備えて、ヘッダーは1行にします。
どうしても複数行のヘッダーが必要な場合は、複数行のヘッダーの下に空行を入れ、その下に1行のヘッダーを追加します。
そして空行と1行ヘッダーは非表示にします。
エクセルは表のヘッダーと最左端のセルがすき間なくデータが入っていれば表として認識してくれるので扱い易くなります。

## 速く、そして正確な入力
人はミスをするものです。簡単な作業でもミスをします。
たとえば100枚くらいの紙を数えてみてください。3回数えても同じ数字になる人は意外と少ないものです。
ただインクリメントしていくだけですが、3回数えて3通りの数字になる人も多いです。
入力と言う作業の中で、ミスを減らし、さらに速く入力する方法を紹介します。

それは２回入力するというものです。
２倍の時間がかかるじゃないかと思われるかもしれませんが、そうではありません。
正確な入力結果を得るのが目的であれば、２回入力の方が速くなります。

２回入力というのは、①１回目の入力、②２回目の入力、③入力内容の確認の、３つの作業を分けて行います。
入力と確認を分けることがミソです。
確認しながらではなく、入力だけ行うので、それほど集中力は使いません。ある意味でリラックスして作業できます。
そして確認作業はエクセルで行うので短時間でできます。
もし１度しか入力しないのであれば、ちゃんと入力されているか目で確認します。それは少しずつ時間を使っていきます。
「紙を見て文字を認識し、キーボードで入力して、画面上で確認」を繰り返すのはかなり疲れます。
ぜひ騙されたと思って２回入力をしてみてください。１度の入力より疲れないと思います。
ちなみに入力のプロの方々は２度打ちと言い、１回目の入力をエントリー、２回目の入力をベリファイ(verify)と呼びます。

### 入力内容の確認
入力するシートを二つ用意し、それぞれに入力します。
下記のマクロは１番左にあるシートと２番目に左にあるシートを比較していき、違ったらデバックに表示します。
日本語を入力した列は対象外にしたかったので避けています。

```vb
Private Type ar_variant
  ws As Worksheet
  rc As Range
  gc As Variant
  ys As Long
  xs As Long
End Type

Private Function cc_arv(ws As Worksheet) As ar_variant
  Dim a As ar_variant
  Set a.ws = ws
  Set a.rc = a.ws.UsedRange
  a.gc = a.rc.Value
  If IsArray(a.gc) Then
    a.ys = UBound(a.gc, 1)
    a.xs = UBound(a.gc, 2)
  Else
    a.ys = 1
    a.xs = 1
  End If
  cc_arv = a
End Function

Public Sub main_entry_check()
  Dim bb  As Variant
  Dim col As Collection
  Dim x   As Long
  Dim y   As Long
  Dim b   As ar_variant
  Dim a   As ar_variant
  a = cc_arv(ThisWorkbook.Worksheets(1))
  b = cc_arv(ThisWorkbook.Worksheets(2))
  Set col = New Collection
  For y = 2 To a.ys
    For x = 1 To a.xs
      If a.gc(y, x) <> b.gc(y, x) Then
        ' 2, 4, 12, 16行目は対象外とします。
        Select Case x
          Case 2, 4, 12, 16
          Case Else
            col.Add CStr(a.gc(y, 1)) & ": " & CStr(x)
            b.rc(y, x).interior.color = rgb(255, 0, 0)
        End Select
      End If
    Next x
  Next y
  If col.Count Then
    For Each bb In col
      Debug.Print bb
    Next bb
  End If
  MsgBox "end of run" & vbCrLf & "Error: " & CStr(col.Count)
End Sub
```

上記のマクロを使わなくても、関数の`=A1=B1`のような簡単なものでも確認はできます。
入力したデータは大元になることが多いです。
２回入力することを強くおすすめします。

## おわり
エクセルでの入力はセルの移動などで、もどかしい気持ちになると思いますが、
TabやEnter、Shiftを押しながらのテンキーなどを駆使してなんとかこなしてください。