表部品でカーソルを右に動かせるか考えてみる

#概要
表計算ソフトでは、ほとんどの場合エンターキーを押すと下のセルにカーソルが移動する仕様になっているかと思います。MicrosoftExcelの場合は、右へカーソルが移動するように設定をかえられるのですが、よほど特殊な場合を除いてそうした設定はしないでしょう。しかしプロデルにおいては表部品として取り扱うので、そうした設定はありません。そこで表部品でカーソルを右へ動かす方法を考えてみました。

#準備する物
特に準備物はいらないのですが、動作や使用場面を想像しやすいように、下のような「item.csv」というCSVデータを用意しました。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/6c82cd6c-a3fc-0c14-19f8-4b779c534839.jpeg)

#作り方
####１　表部品をウィンドウに配置する
表部品をウィンドウに配置します。ただ、表部品だけのウィンドウを作ることはあまりないと思うので、それらしい部品を配置してみました。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/27604a36-a554-2821-f6d4-06e4b4c80045.jpeg)

御覧いただければわかる通り、受注管理システムのようなものです。準備物にあげたデータは商品のデータです。

商品データを読み込むための手順を「はじめの手順」に書いておきます。

```
	商品データというデータ表を作る
	商品データに｛「商品コード」、「商品名」、「規格」、「単価」｝という列を加える
	商品データへ「item.csv」から読み込む
```

ちなみに表部品自体の仕様は下記の通りです。

```
受注内容という表部品を作る
		受注内容を初期化開始する
			その位置と大きさを｛12,108,920,308｝に変える
			その行追加可能を×に変える
			その列幅変更可能を×に変える
			その行高さ変更可能を×に変える
			その編集箇所表示を○に変える
			その列見出し高さを30に変える
			その行見出し幅を30に変える
			その内容を「受注番号」に変える
			その移動順を11に変える
			そのIME状態を「半角英数字」に変える
			そのフォントを「MS UI Gothic,9.75」に変える
		受注内容を初期化終了する
```
ここでポイントとなるのは、「行追加可能」を不可にしておくことです。表部品では1行目を入力し始めると自動的に2行目が追加されるようになっています。そうするとエンターキーを押したなどに勝手に下へ進んでしまうので、それを防ぐ意味合いと、今回の受注管理システムの場合では、1行飛ばしなどがあると困るので、そのようにしています。（ただし、後々解除する場面があります。）

また、「はじめの手順」において、データ表を使って、1行目を入力しておきます。

```
	受注データというデータ表を作る
	受注データに{「取引」,「商品コード」,「商品名」,「メーカー名」,「規格」,「数量」,「単価」,「金額」,「備考」}という列を加える
	取扱という選択リスト列部品を作る
	取扱のデータ列名は、「取引」
	取扱の見出しは、「取引」
	取扱に{「受注」,「返品」,「値引」}を一括追加する
	受注内容に取扱を加える
	受注データへ{取引＝「受注」}を加える
	受注内容のデータ表を受注データに変える
```

####２　表部品のセルでのイベントを定義する
表部品上のセルごとにイベントを設定します。表部品上のセルの値が変更された時、それが起こった列ごとに発生するイベントが違うので、「もし」で場合分けしています。（※表部品の名前は受注内容としています。）

```
	受注内容のセルの値が変更された時の手順
		もしイベントの列は、「1」ならーー取引区分の確認
			受注内容の選択列番号は、2
```
1列目のセルは「受注」「返品」「値引」という3つの選択リストになっています。特に入力する項目もないので、次の列へ移動、つまりカーソルを右へ動かすようになっています。

```
		他でもしイベントの列は、「2」ならーー商品コード入力
			商品コードは、受注内容の｛[イベントの行],[イベントの列]｝セル目からセル部品を取得したものの内容ーー商品検索
			コードデータは、（商品コードを（商品データの1列目を一覧で取得したもの）から完全一致で探したものの内容）
			もし　受注内容の｛[イベントの行],1｝セル目からセル部品を取得したものの内容が「」　なら
				「取引区分を選択してください。」を警告アイコンで表示する
				受注内容の選択列番号は、1
			他でもし　商品コードは、「」なら
				「商品コードを入力して下さい。」を警告アイコンで表示する
				抜ける
			他でもし　コードデータが｛｝　ならーー商品登録がない場合
				「商品の登録がありません」を警告アイコンで表示する
			でないならーー商品名・規格・単価を設定
				コードデータは、コードデータから先頭から1文字消したものから末尾から1文字消したもの
				商品名データは、（商品データの2列目を一覧で取得したもの）の（コードデータ）番目の内容ーー商品名取得
				メーカーデータは、（商品データの3列目を一覧で取得したもの）の（コードデータ）番目の内容ーーメーカー取得
				規格データは、（商品データの4列目を一覧で取得したもの）の（コードデータ）番目の内容ーー商品規格取得
				単価データは、（商品データの5列目を一覧で取得したもの）の（コードデータ）番目の内容ーー単価取得
				受注内容の｛[イベントの行],3｝セル目からセル部品を取得したものの内容を商品名データに変える
				受注内容の｛[イベントの行],4｝セル目からセル部品を取得したものの内容をメーカーデータに変える
				受注内容の｛[イベントの行],5｝セル目からセル部品を取得したものの内容を規格データに変える
				受注内容の｛[イベントの行],7｝セル目からセル部品を取得したものの内容を単価データに変える
				受注内容の選択列番号は、6
		もし終わり	
```
2列目のセルには商品コードを入力するのですが、商品コードを入力すると商品のデータから商品名やメーカーといった必要な情報を自動的に入力するようにします。少々無理やりな感じですが・・・。
自動的に入力がされるので、次に6列目の数量の入力へ飛ぶようになっています。

```
		他でもしイベントの列は、「6」ならーー数量入力
			もし　受注内容の｛[イベントの行],3｝セル目からセル部品を取得したものの内容は、「」　なら
				「商品が入力されていません」を警告アイコンで表示する
				受注内容の｛[イベントの行],[イベントの列]｝セル目からセル部品を取得したものの内容を「」に変える
				受注内容の選択列番号は、2
				ーー商品コードセルの選択
			でないなら
				受注数量は、受注内容の｛[イベントの行],[イベントの列]｝セル目からセル部品を取得したものの内容
				もし　受注数量は、無　または　受注数量は、「0」なら
					もし　受注内容の｛[イベントの行],1｝セル目からセル部品を取得したものの内容は、「受注」　なら
						「数量を入力して下さい。」を警告アイコンで表示する　
						受注内容の選択列番号は、6
					もし終わり
				他でもし　[受注数量が数字である]　でないなら
					「数量を正しく入力して下さい。」を警告アイコンで表示する
					受注内容の選択列番号は、6
				でないなら
					受注内容の｛[イベントの行],8｝セル目からセル部品を取得したものの内容を（受注数量×単価データ）に変えるーー金額計算
					受注金額計へ｛行=「[イベントの行]」,金額=（受注内容の｛[イベントの行],8｝セル目からセル部品を取得したものの内容）｝を加える
					受注内容の選択列番号は、9
				もし終わり
			もし終わり
```
数量が入力されると自動的に単価と掛け合わされて合計金額が入力されるようになっています。（下から5行目）合わせて、画面上の受注金額合計に足しあわされていくようにもしています。（下から4行目）

```
		他でもしイベントの列は、「9」ならーー備考入力
			受注内容の行追加可能を○にする
			受注データへ{取引＝「受注」}を加えるーー次の行へ受注計上
			受注内容の行追加可能を×にする
			受注内容の選択行番号は、イベントの行+1
			受注内容の選択列番号は、2
			受注内容のIME状態を「半角英数字」に変える
	もし終わり
　終わり
```
最後に9列目に備考を入力して終わりです。備考の入力が終わった時点で、1行下に新しい行が追加されるようになっています。少々まどろっこしいやり方かもしれませんが、こうしておくことで、2行目からの入力や1行飛ばして入力することを防いでいます。ここにきてようやくカーソルは下へ移動しますが、直下ではなく、商品コードを入力するために2列目へ移動するようにしています。

####３　エンターキーが押された時の手順を組み込む
ここまでで、まずデータが入力された時の手順を一通り組み込みました。しかし、備考欄（9列目）をなにも入力しない場合、値は変わらないので次行へ進めることができません。そこで、エンターキーを押した際にも同じような動きをするようにします。

```
受注内容のキーが入力された時の手順
		もし　この時のキー番号が13　かつ　受注内容の選択列番号は、9　ならーー備考未入力時に次行へ飛ぶ
		受注金額の内容を（受注金額計の2列目を一覧で取得したものの合計）に変える
		受注内容の行追加可能を○にする
		受注データへ{取引＝「受注」}を加える
		受注内容の行追加可能を×にする
		「{TAB 2}」を入力する
		受注内容のIME状態を「半角英数字」に変える
	他でもし　この時のキー番号が13　かつ　受注内容の選択列番号は、2　かつ　受注内容の選択行番号は、2以上　ならーー受注の入力が終了した際に摘要へ飛ぶ
		受注内容を選択解除する
		摘要にフォーカスする
	もし終わり
終わり
```
エンターキー（キー番号13）が入力され、かつ入力された場所が9列目の時に次行の2列目へ移動するようにしてみました。先ほどと違うところは「イベントの行」というのがこの手順では取得できないので、『「{TAB 2}」を入力する』という少々強硬手段を取っている点です。行追加可能とうまく組み合わせることで目的のセルへ飛べるようにしました。
また、2行目を全く入力しなかった場合は、すべての入力が終わったという理解のもと、摘要欄（テキスト）へカーソルが移動するようにもしています。

:::note
あとは、登録ボタンを押せば受注データが作成されるようにプログラムを作れば良いのですが、本論からそれるので割愛します。
:::

#完成例
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/43a09e76-e016-478b-7de1-dc16da890d03.jpeg)

#最後に
例に出したプログラム（システム）は主にテンキーで入力することを想定して、設計してみました。表内で右にカーソルを動かすこと、特にキーボードからの操作のみでという場面は日常生活においては限られてくるでしょうから、果たしてこの記事が必要かどうかわかりませんが、備忘録の意味合いも込めて記事にしてみました。参考になれば幸いです。