0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Linuxで生成したCSVをVBA(Excelマクロ)で読み込むときの注意点

Posted at

タイトルに関して結論から言っちゃうと「改行コードに気をつけて」で終わっちゃう話なんですが、
そんな凡ミスで延々と悩み続けてしまったので、備忘録としてきちんと書いときます。

※解決方法はLinux寄り(ShellScriptで解決する方法)で、最下部に書いてます。急いでいるかたはそちらをどうぞ。

したかったこと

(1) Linuxでカンマ区切りのCSVファイルを生成

(2) PSCPでWindowsへファイル転送

(3) 任意のExcelへCSVをインポート

...というのを、VBA(Excelマクロ)を使ってやりたかったわけです。
※(1) だけはLinuxのShellScriptでやってますが。

ハマった

やりたいことはすごく簡単なはずなのに、(3) のCSVインポートが下記エラーで引っかかる!
※やり方(コード)はググった結果を試しただけなので、ここでは割愛します。
image.png
(アプリケーション定義またはオブジェクト定義のエラーです。)

デバッグしてみると、どうやら最初の変数に格納されるデータ量が多すぎるように思えたので、
(2) で転送してきたCSVファイルを編集して行・列を減らしてみると、うまくいく… やっぱりデータ量?

もしかして...?

行・列をたった1行・1列減らしただけでうまくいくということは、データ量の問題ではない?
もしかして、Linux/Windowsの文字コードの違いが原因か!?

と思い、コード変換してからインポートしてみる。(ちなみにコードは下記のような感じ)

 # iconv -f utf-8 -t sjis test.pl -o test.csv

...が、うまくいかない。状況変わらず。

あぁ、、そうか

(最初に結論を書いちゃってるので、読み物としては面白くないですが)
そうです、Linux/Windowsの改行コードの違いが原因でした...。

言われてみれば当たり前、誰でも知ってる(?)ことなんですが、

Linux(UNIX/Mac)環境では LF
Windows環境では CR+LF

これです、これを考慮しておかないとダメなんです。
違いは知ってました。知ってましたけど、なかなか気づけなかったんですよ…。

で、どうやって解決したか

VBA側で改行コードを変換(置換)するか、LFコードで改行したファイルを読み込む 方法もあるようですが、
VBAのコードを書き換えるのが面倒なので 簡潔に、Linux側で改行コードを変換する方法で対応しました。

# 変換前 ($はLF)
[user@testsv ~]$ cat -e test.csv
head1,head2,head3$
test1,test2,test3$

# 改行コード変換
[user@testsv ~]$ sed -i -e 's/$/\r/g' test.csv

# 変換後 (^M$がCR+LFです)
[user@testsv ~]$ cat -e test.csv
head1,head2,head3^M$
test1,test2,test3^M$

(1) のCSVファイルの生成Scriptに、sed ... の一行を加えるだけで解決!

めでたしめでたし。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?