C#を使用した家計管理支援システムの開発

概要
--
私が高校2年生の頃から開発を始めた、家計簿支援システムの開発記録です．

開発を始めたころはC#は全くの無知で、VBAのユーザーフォームで色々なツールを開発しまくっていました．
そのため、VBAで開発したシステムをC#へ移行した形になります．


システム名称
--
**NP#**
問題なく(Non Problem)鋭敏に(Sharp)動作するようにという意味を込めています．


家計簿支援システムの機能
--
- 食費登録
- 交通費登録
- 請求登録(親→自分)
- 請求登録(自分→親)
- ガソリン代登録
- 各種レポート表示
- 月末の帳票作成
- 請求承認機能(親が使用)

元々は食費等のレシートを渡して精算していたのを、月1回で済むように管理できるシステムを目指して開発しました．
親に**レシートは必ず渡すように**と言われたので、承認機能を実装し、親の承認が無ければ帳票出力ができないようにしています．


VBAでの開発
--
この頃は、とにかくユーザーフォームで何かを作るのが楽しい時期でした．
親が使用する機能(請求登録)があったので、余っていたノートPCに各自の端末からリモートデスクトップで接続して使用するようにしました．

今VBAコードを見返すと、「なんでループにしてないんだ」などと思うことは色々ありますが、始めて1つのシステムを完成させ、やりがいとプログラミングの面白さを感じた瞬間でした．

開発期間：約1ヵ月

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/14c54700-c53a-34e9-0ee0-3c1442c6a69d.png" width="330">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/e6636797-2d1a-bc83-38c3-2172ff0e4612.png" width="330">


Windowsタブレットへの移行
--
母親が前に購入したWindowsタブレット(dynabook Tab VT484)が使われずに放置されていたのを思い出し、タブレット向けのシステムに移行しました．
中の仕組みは変わらないのですが、フォームが1から作り直しになるのでそこそこ大変でした．

この頃にはVB.NETとC#を習得しつつあり、メニュー画面はC#で開発しました．
ここまで来れば全てC#に移行するつもりだったのですが、大学入試(総合型選抜)の面接試験にプレゼンテーションがあり、**自分で開発したシステムについて説明しなさい**という課題だったので、全てをC#に移行している時間はありませんでした．
それほど性能の高くないタブレットですので、フォームの起動までにかなり時間が掛かっており、自分でも使う気がしない状態でした．

何はともあれ、一般入試で通用するだけの学力の無い私が、このシステムを面接試験でプレゼンしたことで大学に通えています．
面接官の方は興味を持って聞いて下さり、志望理由を聞かれることなく、質疑応答で時間が終了しました．
面接対策をしておらず、本当は就職希望だったので、聞かれていたら答えられなかったかも...

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/cdaa1127-419c-c98e-4cc3-362e6c2e0b8a.png" width="330">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/71b0f57f-3dd8-dae2-449f-d5aaa566765f.png" width="330">

開発期間：約2週間


C#への完全移行
--
大学生になり、冬休みに入ったタイミングでC#への完全移行をスタートしました．
まずはフォームのデザインを刷新し、カラフルで分かりやすいデザインにしました．
フォーム上のボタンはPhotoshopで作成し、PictureBoxで表示しています．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/f96dc32f-0f45-44cf-fb6a-f0bcad291895.png" width="500">

データはExcelファイルで管理しているので、ClosedXMLを使用することにしました．
思っていたほど難しくなく、動作がかなり早くなりました．

開発期間：約3週間


ファイルサーバーへのデータ移行
--
メルカリで、ThinkCentre M72e Tinyという小型のデスクトップを購入していたのでそれをファイルサーバーにしました．
これまでは全てのデータをタブレットに保存していましたが、落下故障のリスクがあると考えたためです．
Windowsのファイル共有機能を使用し、データを全て移行しました．
それに伴い、コードの書き換えが必要となりましたが、これがなかなか大変でした．
以下のように、ファイルパスを全て文字列で記述していたため、全てを書き換える必要があったためです．
```C#
XLWorkbook workbook = new XLWorkbook(@"C:\Users\NP#-SERVER\DATA\SHDG5281.xlsx");
```

今後、ファイルサーバーが壊れてIPアドレスが変わる可能性を考慮して、以下のように記述しなおしました．
```C#
string fileip;
fileip = @"\\192.168.XXX.XXX";

XLWorkbook workbook = new XLWorkbook(fileip + @":\Users\NP#-SERVER\DATA\SHDG5281.xlsx");
```

WANからでもアクセスできるように
--
データをファイルサーバーへ移行したことで、他の場所からでもアクセスできるようにしたいと考えました．

以下のポートをファイルサーバーのIPアドレスへ開放することで、外部からアクセス可能となりました．
※当然、ユーザー認証は必要です．

|プロトコル|ポート番号|
|:---:|:---:|
|UDP|137|
|UDP|138|
|TCP|139|
|TCP|445|

起動時にLAN/WANを選択して、変数"fileip"を変えています．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/a5235fe5-fd90-f131-ea9f-5b1572b0256a.png" width="500">

現在のシステム概要図です．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087800/a7992961-0055-88d0-32d7-4e763a71df31.png" width="500">

本システムの今後
--
滋賀の実家と一人暮らし中の京都の家、2拠点で使用できるようになったので、今後は以下の機能を追加予定です．

現在はファイルサーバーへリモートデスクトップ接続をして、VBAフォームを通して実施している作業をタブレットでできるようにしたいと考えています．

* データ登録機能
* 在庫管理
* 資材移動依頼
 →買い物に行く時間があまりないので、生活用品は実家に依頼して届けてもらっています．