広告

先日、弥生会計にインポートするCSVファイルをExcelマクロで作成したのですが、想定外のエラーに遭遇しました。備忘も兼ねてまとめておきます。

弥生会計インポート時に遭遇したトラブル

入力業務の効率化のため、弥生会計のCSVファイルインポート機能を使いますが、毎回手動でExcelからCSVファイルを保存するのも効率的でないため、CSVファイルを作成するマクロをつくりました。

テストを兼ねて弥生会計にインポートしたところ、次のようなメッセージが。

インポート可能な形式ではない、または1行の項目数が正しくないため、インポートできません。インポートを中止します。

いつもであれば、エラーログが作成されて「この行のここが間違っている」というのがわかるのですが、今回はエラーログを出力してくれません。

「1行の項目数が正しくないため」というメッセージがありましたので、再度CSVファイルの中身を確認しましたが、項目内容や項目数に誤りはなし。

そうなると「インポート可能な形式ではない」に該当することになりますが、目視でいくら確認しても誤りが見つけられない。

困り果ててTwitterでぼやいていたら、親切な方からいろいろとアドバイスを頂戴しました。

文字コード・改行コードあたりが怪しいということで、テキストエディターで確認してみたところ、

  • インポートできなかったファイルの改行コード:CR
  • Excelから手動で保存したCSVファイル(=インポートできた)の改行コード:CRLF

ということで、改行コードの種類が正しくなかった、というのが原因でした。

「改行コードとは?」といった話は私も詳しくはないので割愛しますが、弥生のサイトをみても「各行の最後に改行コードが必要」とは書いてありますが、改行コードの種類までは指定されていません。

まったく想定していなかったエラーのため、解決にかなり手間取りました・・・。

そもそも改行コードが違ってしまった原因は?

では、なぜ通常と異なる改行コードでデータを作成してしまったのか?

これは完全に私の無知が原因、ということになります。

今回マクロを作成するにあたり、いろんな方のコードを参照させていただいたのですが、それを踏まえて作成したCSVファイルへの書き出し部分のコードが次のものになります。

(ysheetは保存対象のExcelシート、#1はデータを書き込むファイルを指しています)

Dim i As Long, j As Long
i = 1
Do While ysheet.Cells(i, 1).Value <> ""
For j = 1 To 24
Print #1, ysheet.Cells(i, j).Value & ",";
Next
Print #1, ysheet.Cells(i, 25).Value & vbCr;
i = i + 1
Loop

セルを1つずつ確認して、順次書き出していくコードにしていますが、この中のPrintステートメントという命令文、何も指定しないと1セルのデータごとに改行されてしまいます。

それではインポートするCSVファイルの形式を満たしませんので、改行させないために、行の最後にセミコロン(;)を追加します(こうすると改行せずにデータを作成します)。

弥生会計のインポートデータは、全部で25列。

そのため、1~24列までは改行せずに、各データの最後にコンマ(,)を追加、25列目だけは、改行コードを追加して、次の行のデータ作成に移行するという流れです。

25列目のデータを作成する際に、

「改行コードなんてどれも同じでしょ」

と安易に考えた私が、”vbCr”というCRの改行コードを追加する命令を書いてしまったのが、今回のトラブルの原因でした。

修正方法としては、”vbCr”を”vbCrLf”に変更するか、もしくはそもそもセミコロンがなければ自動的に改行されますので、”&vbCr;”を削除してしまえばよいことになります。

(削除した場合に作成されるCSVファイルの改行コードはCRLFになっていました。)

修正後のコード(以下のどちらかに変更する)

Print #1, ysheet.Cells(i, 25).Value & vbCrLf;

Print #1, ysheet.Cells(i, 25).Value

広告

シートをそのまま保存するマクロじゃダメなの?

ここまで読んで、

「そもそもデータのあるシートをそのままCSVファイルとして保存するマクロつくれば、こんなトラブル起きなかったんじゃないの?」

と思われる方もいるかもしれません。

この方法を使わなかった理由は、「この方法では正しく保存されなかったから」です。

弥生会計へのインポートファイルを作成する場合には、多くの場合、

  1. 元データを貼付けるシート(金銭出納帳など)
  2. インポート用データを作成するシート

の2枚のシートで運用しています。

この場合、1のシートに入るデータ数が毎回変るため、2のシートには必要なデータを作成するための式を余裕を持って入れてあります。

(この式では、1のシートにデータがなければ、2のシートの該当セルには空白(“”)を入れるようにしてあります)

次の画像は、2のシートの一部抜粋ですが、1のシートには4行のデータ、2のシートには5行目まで式を入力しています。

この状態で、次のコード(かなり雑なので実務でそのまま使えませんが)を処理すると、

Dim Fname As String
Fname = ActiveWorkbook.Path & "\yayoi_import.csv"
Sheets(2).SaveAs Fname, FileFormat:=xlCSV, Local:=True

確かにCSVファイルは作成されるのですが、そのファイルをテキストエディターで開いてみると、5行目にデータのないコンマだけの行が保存されてしまいます。

このCSVファイルだと、5行目が弥生会計のルールを満たしていませんので、そのまま弥生会計にインポートすると、

というメッセージが表示されて、

というエラーログが出力されることになります。

そのため、今回はPrintステートメントを使って、CSVファイルに1セルずつ書き込むという方法を採用しました。


内容が少しマニアックになってしまいましたが、同じような症状で悩まれている方がいるかもしれない、ということでトラブルの顛末、まとめさせていただきました。

参考になれば幸いです。

投稿者

加藤 博己
加藤 博己加藤博己税理士事務所 所長
大学卒業後、大手上場企業に入社し約19年間経理業務および経営管理業務を幅広く担当。
31歳のとき英国子会社に出向。その後チェコ・日本国内での勤務を経て、38歳のときスロバキア子会社に取締役として出向。30代のうち、7年間を欧州で勤務。

40歳のときに会社を退職。その後3年で税理士資格を取得。

中小企業の経営者と数多く接する中で、業務効率化の支援だけではなく、経営者を総合的にサポートするコンサルティング能力の必要性を痛感し、「コンサル型税理士」(経営支援責任者)のスキルを習得。

現在はこのスキルを活かして、売上アップ支援から個人的な悩みの相談まで、幅広く経営者のお困りごとの解決に尽力中。
広告