2021/11/23

MFF形式の家計簿データを変換してGnuCashへインポートする(前篇)

←前回の記事:2021/11/22 ついにGnuCashに対応 MFFマクロV2.27出現

_今回は、MFFマクロ(V2.27以降)を使用して、MFF形式のデータをGnuCashにインポートする手順をご紹介します。記事にすれば割とあっさり終わりますが、この機能を実装するには大変な手間がかかりました。

_しかも、今回の記事を執筆中に、MicrosoftがOfficeソフトを更新して画面デザインを変えやがったため、画面例のキャプチャを全てやり直しする羽目になりました。ここのところ筆者の身にはロクなことが起きません…(泣)。

_なお、Excelの更新によって、クイックアクセスツールバーが標準では非表示になりました。これは非常に困るので、Excelで【ファイル】タブ>【ホーム】メニュー>【その他…】サブメニュー>【オプション】を選択し、Excelのオプションダイアログ内の【クイック アクセス ツール バー】設定画面で□クイック アクセス ツール バーを表示する のチェックBOXをONにして、MFFマクロ動作用のアイコンを表示するように設定してください。

1.MFF形式データをGnuCashにインポートできる形にする

_サンプルのMFF形式データは、実はGnuCashからのエクスポートのテストに使用したものを利用します↓。セルに色をつけているのは説明を判り易くするためで、本来のデータにはありません。各色はそれぞれ

  • 2021/10/22の緑色系のデータ:給与明細
  • 2021/10/26の黄色系のデータ:クレジットカードによる買い物
  • 2021/10/28の青色系のデータ:お土産を現金・Suica併用で買った
_という取引を示しており、いずれも「明細分離用」という仮想の口座を設定して疑似的に複合仕訳を実現しているものです(家計簿アプリを活用するうえでの典型的な手法ですね)。よって、これらは当然スプリット取引としてGnuCashにインポートさせたいところです。

_そこで、MFFマクロV2.27では、MFF形式のL列を「スプリットフラグ」というデータ列として使用します(L列は、本来はMFFマクロのACF機能用ですが、GnuCashはインポートの際に勘定科目の対応関係を設定する機能があるのでACFを使う必要はありません)。スプリットフラグとは、MFF形式の複数のデータがスプリット取引を構成していることを明示するための自然数で、ユーザーが以下のように入力します。

  • 同じ日付で、同じ口座名の複数のデータに入力する。↓の2021/10/28の例のように、振替取引が複数含まれていても構わない。
  • 支出欄・収入欄の総額がそれぞれ同じになるようにする。↓の2021/10/26の例では支出・収入とも計1133円。
  • 親取引(これは1つだけ)となるデータ行に1を、子取引となるデータ行(これは複数)に2以上の自然数を入れる。子取引全てを2と指定しても、2以上の連番としてもかまわない。また、同じ日に複数のスプリット取引が発生する場合は、100の位を異なるものにする(101を親として、子を102~199とする。200台・300台…でも同様)
  • 親取引は、対象となる複数の取引の中でそれを代表するものを指定する。例えば↓のデータ例では2021/10/22の給与明細であれば、「明細分離用」口座から「あの筋銀行」口座に300,000円が振り込まれた体になっている取引が該当する。
  • スプリット取引に含まれる振替取引に対しては、反対取引(↓の画面でグレーに塗った行)の方にはスプリットフラグは入れないこと。また、そのような反対取引はデータ変換の処理対象外となる。反対取引が無いデータであればそのままで良い。
  • スプリット取引にせず、通常の取引データとしてインポートさせる場合はスプリットフラグ欄には何も入れない。
_↓の画面例の①のようにスプリットフラグを入力し、②D1セルのプルダウンメニューでGnuCashと設定し、③セルカーソルをD1セルに合わせた状態でMFFマクロを動作させます。

_なお、マクロを動作させる時点では、オートフィルタの絞り込み機能は使用しないようにしてください(オートフィルタ機能を解除しろということではなく、絞り込みをするな、という意味です。絞り込んでいる場合はMFFマクロが強制的に解除します)。これは、MFFマクロが処理の途上でMFF形式データを(日付とスプリットフラグをキーにして)昇順ソートする段階があるのですが、その際に絞り込みをかけているとExcelが「表示中の行だけでソートする」という動作をして、スプリット取引のデータ行が不連続になる場合があるためです。

GnuCashインポートテスト用MFF形式データ

_MFFマクロV2.27は、GnuCash向けのデータ変換の前に、スプリット取引の整合性をチェックするようにしています。スプリット取引を構成している取引群の貸借の一致、データの連続性、口座名の統一…といった条件に不整合があれば、その旨のダイアログを表示して、そこでマクロの動作を終了します(セルカーソルは誤りがあると思われるところへ移動します)

_整合していることが確認できれば↓のようなダイアログが表示され、L2セルに"Split OK"という文字列が入ります(不整合の場合は"スプリットフラグ"が入ります)。また、振替フラグ欄は、スプリット取引に含まれる振替取引については11となってデータ変換の対象となり、その反対取引には12が入ってデータ変換の対象外となります。このあたりの動作も、V2.27で新設したものです。

_なお、↓のダイアログで【いいえ】を叩いてマクロの処理から抜けた後は、オートフィルタで絞り込みをかけて、変換の対象となるデータを限定してから再度MFFマクロを動作させることができます。このとき、MFFマクロは、L2セルが"Split OK"となっている場合に限り、スプリットフラグの整合性チェックをスルーするようになっています(データのソートを行わないので絞り込みをかけても問題が生じない)。このような操作を行う場合は、整合性チェックの結果を狂わせるようなマネは絶対にしないようにして下さい。

スプリット取引の整合性チェックを完了した

_↑のダイアログで【はい】を選択すると、GnuCashにインポート可能なCSVファイルが出力され、保存先を問い合わせるダイアログが出現します↓。なお、インポート用のデータは「GnuCashインポート形式」という新しいワークシート上に展開されますが、これははっきり言えばMFFマクロのデバッグ用の機能で、このワークシート上でマクロを動作させても「サポート外です」と冷たく返すだけです(【追記】:MFFマクロV2.33でこの動作は変わりました)。つまり、このワークシート上でデータを修正しても無意味なのでご注意下さい。

003_GnuCashインポート形式のCSVファイルを出力する

_インポート用のCSVファイルの中身↓を見ますと、10/22、10/26、10/28のデータがそれぞれスプリット取引の形になっているのが確認できます(セルの色は判り易いように筆者が付けたものです)。10/26のデータを例にすると、親取引の金額-1,113円と、子取引群の総額1,113円は正負が逆ながら一致しています。このような出力を得られるようにするまでの労苦は凄まじいものがありました…(´;ω;`)ウゥゥ

GnuCashインポート形式のCSVファイルの中身

2.MFFマクロのGnuCashインポート用データ変換の処理チャート

(1)通常取引の場合

_当BlogではGnuCashにおいて借方・貸方が一対一となっている取引データを「通常取引」と呼んでいます。こちらの変換処理は、↓のようにチャートとしてお見せすれば至極単純なものです。苦労したのは、このチャートを作る以前に、GnuCashがインポート時にデータをどのように解釈するのかを理解するところでありまして…情報がほとんど無い中で、試行錯誤を繰り返しデータ形式を確立するまでには相当な日数を要しています。

_なお、説明欄が空になる場合に全角アンダースコア"_"を入れるようにしているのは、GnuCashのバグと思われる動作を回避するためです。説明欄が空になっていると、その直前にインポートしたデータ行の説明欄の中身がそのまま入り込む…というありがちなものなのですが、現象を理解するまでには長時間を要しました。取引IDを使用しているのも、GnuCash側のインポート動作が確実に行われるようにするための方策です。

MFF2GnuCashの動作チャート(通常取引)

(2)スプリット取引の場合

_GnuCashでは、ある1回の資金移動について借方・貸方の片方あるいは両方が複数となる取引データをスプリット取引と呼び、いわゆる複合仕訳が可能です。そして、GunCashの最大の特徴は、データインポートの際にスプリット取引を認識できるところにあり、MFFマクロもぜひそのようなデータを出力する機能を実装したいところでした。

…が、それはやはり簡単にはいきません。GnuCashにスプリット取引を認識させる方法そのものは、先の通常取引と同様の考え方でイケると気づけたのですが、問題はMFF形式のデータに対して、ユーザーがどうやってスプリット取引を構成していることを示すのか、という点です。

_MFFマクロV2.25(非公開)では、MFF形式のデータを一旦「中間形式」に変換し、その段階でユーザーがスプリットフラグを設定する、という方式を採っていました。しかし、操作があまりにも煩雑で、しかも複数の振替取引を含んだスプリット取引には対応できない大バグが発覚して断念。

_最終的には「MFF形式の状態のままでスプリットフラグを指定する」現在の方式にすることを決断したのがV2.27公開の3日前です。この方式の厄介なところは、MFF形式の特徴である「振替取引にはその反対取引をでっち上げる」という仕様に対し、片方をスプリット取引に含めたらもう片方は確実にデータ変換から排除しなければならぬ、という点でして、そのためにMFF形式のままで「整合性チェック」を行うという考え方にたどり着きました。

_その「整合性チェック」を合理的に行うために、これまで筆者としては極力避けていた「MFF形式データのソート」をあえて行い、ソートの際にオートフィルタが邪魔になることから、口座別の絞り込みをチェック動作後に行うという苦肉の策を採っています。

_なお、同日に複数のスプリット取引が存在する場合は、フラグの番号の付け方をユーザー自身で工夫していただく必要もあり、決してスマートとは言えない実装に終わったのが何とも残念です。

MFF2GnuCashの動作チャート(スプリット取引)

次回はGnuCashにCSVファイルをインポートする際の操作方法を解説します→

注目の記事

家計簿アプリとデータをやりとりする際のファイル形式のまとめ

_今回の主題は…家計簿アプリとデータをやりとりするときに使用するファイルの形式について、です。筆者がこれまで MFFマクロ に対応させてきた家計簿アプリは27種類(Money通帳とあっと家計簿は別カウント)。まず、家計簿アプリからエクスポートする方向では↓のようになります。...

最近の人気トップ3