こんにちは
先日、マネーフォワードMEの使い方の工夫としてわたしはExcelからデータを一括入力していると記載させていただきましたが、今回はその具体的な方法を記載させて頂こうと思います。
ExcelからのマネーフォワードMEへの一括登録が必要になるケース
前回記載させていただきましたが、主に以下のケースでわたしはExcelからのマクロでのデータ一括入力を実施しています。
予定されている現金取引を事前に一括入力
マネーフォワードMEでは、銀行、クレジットカード、オンラインショッピングサイト等からワンクリックで明細明細を取得できますが、わがやでは一部それ以外の現金取引が残っており、それらの現金取引は発生する都度手で入力する必要があります。わがやでの具体的な現金取引の例は、子供の習い事の費用や、オーケーストアでのお買い物(現金のほうがお得なため)等があります。
これらの現金取引は都度入力すると忘れる懸念もあるため、事前にまとめて1年分程度未来日付で入力することにしていますが、かなりの件数になり手で実施すると大変なのですが、Excelシートに入力した明細を一括でマネーフォワードMEに登録しています。
(最近気が付いただけなのか、最近機能が追加になったのか不明ですが、毎日、毎月、毎年等の定例で定額の支払いであれば、PC側からは家計簿入力機能に「繰り返し入力」チェックボタンがあり、「毎日」、「毎週」、「毎月」、「月末」を選択ができるのでその機能で入力することもできそうです。)
マネーフォワードMEでは、未来日付で出金を入力しておくとその日に到達して初めて収支に集計される仕様となっており大変便利です。
オーケーストアでの買い物は金額が一定ではないですが、我が家は毎週土曜日に必ずオーケーストアに1週間分の買い出しにいくため、まずは定額で出金を事前入力しておき、会計後に金額を修正しています。
配当金入金実績を一括入力
マネーフォワードMEの「資産形成アドバンスコース」コースでは、配当金を集計できるのですが、その金額は配当基準日の銘柄保有数から推定した金額となっています。しかし私は株主優待のクロス取引を実施しており、配当基準日に優待株を信用売+現物で保有しているため、配当金の額がそれらを含んだものとなってしまい本来集計したい長期保有株の配当金額になりません。そのためわたしは「資産形成アドバンスコース」は利用せず、「スタンダードコース」で各証券会社の配当実績のデータを元に直接マネーフォワードに配当金の入金実績を登録しています。この入力自体は手入力すれば済むものではありますが、面倒なので上記の様にExcelシートを経由して一括登録しています。
本来は「資産形成アドバンスコース」の機能がわたしの使い方にもフィットして正しく分析できるようになればよいのですが、クロス取引とかは特殊な事情なのであまり期待していません。
マネーフォワードMEへのExcelからのデータ一括入力方法
企業向けのマネーフォワード クラウドではExcelアップロード機能があるようですが、マネーフォワードMEではアップロード機能がないため、わたしはExcelマクロでVBAからSeleniumを利用して一括登録を実施しています。
(公式のヘルプを見るとかつてはマネーフォワードMEにもCSVのアップロード機能があったようですが、いまは無くなってしまったようです。残念。また復活を希望してます。)
以下は配当金を入金として手動一括登録する場合の例です。
自動入力時の画面イメージ
画像引用:マネーフォワードME
ExcelマクロからWeb画面を操作して明細を自動で連続登録していきます。配当金の記録のためで、マネーフォワード上の口座残高自体の増減はないため、入金先は”なし”で明細を登録しています。これにより月次の家計簿の収入の集計に正しく配当金の受取実績を反映することができます。
自動入力に利用するExcelワークシート
ワークシートには、各証券会社のサイトから取得した配当金の受取実績を所定フォーマットに加工したデータを準備します。必要な項目は上記入力フォームにある日付、金額と項目欄の大分類、小分類、摘要欄への入力内容です。A列には処理対象と処理結果を記載してマクロ制御に使っています。
Excelマクロ
Option Explicit Dim Driver As New Selenium.EdgeDriver Dim myBy As New By Sub CommandButton1_Click() Dim R As Long Dim lngMaxRow As Long Dim strUserId As String Dim strPassword As String Dim objElm As Object Dim blnElmExist As Boolean strUserId = InputBox("ユーザーIDを入力してください") strPassword = InputBox("パスワードを入力してください") ' strUserId = "xxxx@xxxx" 'ユーザーIDをソースに受けこむ場合はこちらに記載 ' strPassword = "xxxxxx" 'パスワードをソースに受けこむ場合はこちらに記載 With Driver 'ログイン画面表示 .Start .Get "https://moneyforward.com/sign_in" For Each objElm In .FindElementsByTag("a") If InStr(objElm.Attribute("href"), "/sign_in") Then objElm.Click Exit For End If Next DoEvents For Each objElm In .FindElementsByTag("a") If InStr(objElm.Attribute("href"), "/sign_in/email?client_id=") Then objElm.Click Exit For End If Next DoEvents 'ユーザーIDを入力 .FindElementByName("mfid_user[email]").SendKeys strUserId .FindElementById("submitto").Click DoEvents 'パスワードを入力してログイン .FindElementByName("mfid_user[password]").SendKeys strPassword .FindElementById("submitto").Click DoEvents '家計簿タブに切り替え For Each objElm In .FindElementsByTag("a") If InStr(objElm.Attribute("href"), "/cf") Then objElm.Click Exit For End If Next '手入力ボタンをクリックして家計簿入力フォームを表示 For Each objElm In .FindElementsByTag("button") If InStr(objElm.Attribute("href"), "#user_asset_act_new") Then objElm.Click Exit For End If Next 'Excelワークシートの入力対象の最大行を取得 lngMaxRow = Sheet1.Cells(Rows.Count, 2).End(xlUp).Row 'Excelワークシートをループ For R = 5 To lngMaxRow If Sheet1.Cells(R, 1).Value = "●" And IsDate(Sheet1.Cells(R, 2)) Then Sheet1.Cells(R, 2).Select '収入タブをクリック For Each objElm In .FindElementsById("info") objElm.Click Exit For Next '日付をB列の値を入力 .FindElementById("updated-at").Clear .FindElementById("updated-at").SendKeys Format(Sheet1.Cells(R, 2).Value, "YYYY/MM/DD") DoEvents .FindElementById("updated-at").Click .FindElementById("updated-at").Click DoEvents '金額にC列の値を入力 .FindElementById("appendedPrependedInput").Clear .FindElementById("appendedPrependedInput").SendKeys Sheet1.Cells(R, 3).Value '入金先に「なし」を入力 .FindElementById("user_asset_act_sub_account_id_hash").SendKeys "なし" '項目1にE列の値を設定 .FindElementById("js-large-category-selected").Click For Each objElm In .FindElementsByClass("l_c_name") If objElm.Attribute("text") = Sheet1.Cells(R, 5).Value Then objElm.Click Exit For End If Next '項目2にF列の値を設定 .FindElementById("js-middle-category-selected").Click For Each objElm In .FindElementsByClass("m_c_name") If objElm.Attribute("text") = Sheet1.Cells(R, 6).Value Then objElm.Click Exit For End If Next '項目3にD列の値(内容)を入力 .FindElementById("js-content-field").SendKeys Sheet1.Cells(R, 4).Value '保存ボタンをクリック .FindElementById("submit-button").Click Sheet1.Cells(R, 1).Value = "登録完了" DoEvents '保存後の確認ボタン待ち blnElmExist = False Do blnElmExist = Driver.IsElementPresent(myBy.ID("confirmation-button")) .Wait 1000 DoEvents Loop Until blnElmExist = True .Wait 1000 .FindElementById("confirmation-button").Click End If DoEvents Next End With End Sub
上記はExcelマクロのサンプルコードです。
VBAからEdgeなどのブラウザを操作するためにはSelenium Basicを利用する必要があります。”EXCEL VBA Edge Selenium"等のキーワードでGoogle検索すれば、いろいろなサイトにSelenium Basicについては詳しく記載されています。まだSelenium Basicを使ったことのない方はまず前提としてそちらを参照してみてください。はじめは私もよくわかりませんでしたが、調べて実際やってみると意外と簡単でした。最新の手順はどんどん変わるし、環境による違いもあるので直接調べていただくのが早いと思いますが、主に以下の手順が必要です、
- Selenium Basicのインストール
- 最新版のEdgeDriverのダウンロード
- VBAでの参照設定の追加(Selenium Type Library)
まとめ
マネーフォワードMEの使い方の工夫としてExcelからデータを一括登録する方法をご紹介させていただきました。私はこの方法を大いに活用しています。その他の方のご参考になれば幸いです。