• ベストアンサー

csvファイルの文字コードを変更するvbaコード

お世話になってます。 ¥C:User¥documentのフォルダにあるBefore.csv(中身の文字コードはUnicode)のデータを文字コードをUft-8に変更して別名保存して 同フォルダ内のAfter.csv(元々あるファイルでも新規作成でも大丈夫です)として保存するvbaコードを教えてもらえませんか。 毎週使痛いコードなのでよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.5

回答No.3です。 「VBA」そのものです。 なお、後ろに「VBScript」の改良版を掲載します。 一度でいいので、使ってみてください。 使い方は、以前の説明と同じで、プログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。 できたプログラムファイル(「~.vbs」ファイル)に、「csv」ファイルを1つだけ、ドラッグ&ドロップするだけです。 ドラッグ&ドロップしたファイルと同じフォルダ内に「After.csv」という、結果ファイルを作成します。 では、「VBA」版です。 基本的に、全く同じですが、「VBA」では、ドラッグ&ドロップなどできませんので、特定の「Before.csv」(今は、私の環境の「D:\Programming」フォルダ内)を、「After.csv」(やはり、「D:\Programming」フォルダ内)を作成していますので、質問者の環境に合わせてください。 Sub Sample() Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "Unicode" ab.Open ab.LoadFromFile "D:\Programming\Before.csv" a = ab.ReadText(-2) ab.Close Set ab = Nothing Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "UTF-8" ab.Open ab.WriteText a, 0 ab.SaveToFile ("D:\Programming\After.csv") ab.Close Set ab = Nothing MsgBox ("Finished!") End Sub 次に、「VBScript」の改良版です。 こちらは、ドラッグ&ドロップするファイルの名前は何でもかまいませんが(「拡張子」は、必ず「csv」でなければなりませんが)、結果ファイルをドラッグ&ドロップしたファイルと同じフォルダ内に「After.csv」という名前で作成します。 Option Explicit Dim a, ab, f, gf, so, wa Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです") WScript.Quit End If f = Left(wa(0), InStrRev(wa(0), "\")) Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "Unicode" ab.Open ab.LoadFromFile wa(0) a = ab.ReadText(-2) ab.Close Set ab = Nothing Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "UTF-8" ab.Open ab.WriteText a, 0 ab.SaveToFile(f & "After.csv") ab.Close Set ab = Nothing Set wa = Nothing Set so = Nothing MsgBox("Finished!") 最後に、読まなくてもいいですが、私としては、「Unicode(UTF-16)」の「~.csv」ファイルを「UTF-8」に変換するだけなのに、重たいエクセルを立ち上げる意味があるのでしょうか? エクセルの機能は全く使っていませんので、エクセルを立ち上げることに何の意味もありません。 「VBScript」なら、ドラッグ&ドロップするだけです。 しかも、「VBScript」のドラッグ&ドロップの部分を取り除いて、ファイルを指定しているだけで、全くそのままです。

crossinlove
質問者

お礼

お礼が大変遅くなって申し訳ありません。 やってみたのですが、私の勉強不足で文字化けしてしまいます。 質問締め切り後も、ご提示のコードで挑戦&勉強を継続したいと思います。 遅くなって申し訳ありませんでした。 詳しい説明をありがとうございます。

crossinlove
質問者

補足

私のためにコードを作成ありがとうございます 自宅に帰り動作確認させていただきます 遅くなり失礼しました

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

>親プログラムの呼び出し元は、ご提示のサイトのどこにありますか? 提示したサイトには「部品」しかありません。呼び出し元(親プログラム)は自作して下さい。

crossinlove
質問者

お礼

もっと勉強します。 ありがとうございます!

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

「VBScript」による回答ですので、無視していただいて結構です(「Windows限定」です)。 このプログラムは、「csv」ファイルを1つだけ、プログラムファイルにドラッグ&ドロップするだけです。 直接、書き換えられなかったので、「abc.csv」をドラッグ&ドロップした場合、「abc.xyz」というファイルをいったん作成し、元の「abc.csv」ファイルを削除、その後「abc.xyz」を「abc.csv」に換える、という処理をしていますので、こちらで、問題なく動くのを確認はしていますが、必ず、コピーのファイルなど、試してから、実際のファイルで使ってください。 以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。 できたプログラムファイル(「~.vbs」ファイル)に、これから処理したい「csv」ファイルを1つだけ、ドラッグ&ドロップするだけです。 Option Explicit Dim a, ab, f, gf, n, so, wa Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです") WScript.Quit End If f = Left(wa(0), InStrRev(wa(0), "\")) n = so.GetBaseName(wa(0)) Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "Unicode" ab.Open ab.LoadFromFile wa(0) a = ab.ReadText(-2) ab.Close Set ab = Nothing Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "UTF-8" ab.Open ab.WriteText a, 0 ab.SaveToFile(f & n & ".xyz") ab.Close Set ab = Nothing Set gf = so.GetFile(f & n & ".xyz") so.DeleteFile wa(0), True gf.Name = n & ".csv" Set wa = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」というような意味ですが、気にしないでください。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしています。 Set wa = WScript.Arguments If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです") WScript.Quit End If ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされると、ファイルの個数や拡張子を調べて、想定外なら、メッセージを表示して、プログラムそのものを終了してしまいます。 f = Left(wa(0), InStrRev(wa(0), "\")) n = so.GetBaseName(wa(0)) ドラッグ&ドロップされたファイルのフォルダとベースネーム(「abc.csv」→「abc」)を調べています。 Set ab = CreateObject("ADODB.Stream") 「UTF-8」を扱うのに費用ですが、まず、「Unicode」の処理から、 ab.Type = 2 ab.Charset = "Unicode" ab.Open ab.LoadFromFile wa(0) a = ab.ReadText(-2) ab.Close Set ab = Nothing ドラッグ&ドロップされたファイルを、「Unicode」として、ファイル全体を一気に読み込んで「a」に入れて、閉じています。 Set ab = CreateObject("ADODB.Stream") ab.Type = 2 ab.Charset = "UTF-8" ab.Open ab.WriteText a, 0 ab.SaveToFile(f & n & ".xyz") ab.Close Set ab = Nothing 今、読み込んだファイルを「UTF-8」で、「~.xyz」で書き出しています。 Set gf = so.GetFile(f & n & ".xyz") 書き出したファイルを取得しています(ファイル名の変更に必要)。 so.DeleteFile wa(0), True 元々の「~.csv」ファイルを削除。 gf.Name = n & ".csv" 「~.xyz」→「~.csv」。 Set wa = Nothing Set so = Nothing MsgBox("Finished!") あとは、終了処理ののち、「Finished!」と表示しています。

crossinlove
質問者

補足

御紹介ありがとうございます。 vba操作で、自動化を目指しているのですが、 そのVBScriptをExcelvbaから操作することは難しいでしょうか?

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

>ご提示された頁のコードの”Option Explicit”~最下層までを標準モジュールに貼り付けて、F5を押しましたが動きません。 これらの関数は、すべて「部品」で、単体では動作しません。これらの部品を呼び出す「親プログラム」つまり「呼び出し元」が必要です。 「呼び出し元」では「読み込み、書き込み用にそれぞれのcsvファイルを開く」「開いている読み込みファイルから1行読み込む」「読み込んだ1行の文字列を、部品の関数に渡し、結果を受け取る」「受け取った結果を開いている書き込みファイルに1行書き込む」「すべての行を処理したらファイルを閉じる」と言う処理が必要です。

crossinlove
質問者

補足

度々すみません 親プログラムの呼び出し元は、ご提示のサイトのどこにありますか? 理解力なくて申し訳ありません

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.1
crossinlove
質問者

補足

URLありがとうございます。 ご提示された頁のコードの”Option Explicit”~最下層までを標準モジュールに貼り付けて、F5を押しましたが動きません。 どうしたら良いでしょうか? 度々ご面倒おかけいたします。

関連するQ&A

  • VBA CSVファイルの文字コードをANSIからUFT-8に変更する方法

    VBAを勉強している初心者です。 VBAでCSVファイルの文字をANSIからUFT-8に変更する方法を教えてもらえませんでしょうか。

  • ファイルを文字化けせずに開けるVBAコードを教えて

    アプリをダウンロードして、Excelファイルで開こうとすると文字化けします。 いろいろ調べたところ、一旦、テキストファイルで開き、 文字コードをUFT-8に設定して保存し、その後、Excelで開くと文字化けはしません。 毎週行いたい作業ですので、できればVBAコードで一発で文字化けせずに開けると ありがたいのです よろしくお願いします 補足:アプリはiphoneのCount Logというアプリです。 メールにファイルが添付されています。それを開くと文字化けしてしまうという話です。

  • 文字コードの違うファイルインポート

    こんにちわ。 いつもお世話になっています。 文字コードの違うcsvファイルをTransferTextでインポートしたいのですが いい方法がなく困っています。 ご存知の方、ご教示下さい。 【経緯】 csvファイルはインターフェイス上では文字コードが「unicode」 で設定されているとの事でした。 mdbにてファイルのインポートを行うと文字化けするのでインポート定義を 設定してみた所、「UTF-8」だけが日本語にできたました。 しかし、インポートしてみるとカラム数が12個あったのに対して9個しか 取込できませんでした。 そこでそのcsvをエディタにて「名前を付けて保存」→文字コードを「SJIS」に変更して 保存し直しました。 その保存し直したcsvを読込するとカラム数も12個で文字も日本語でインポート できました。 どうしてもVBAでコマンドボタンを押下してインポートしたいのですが いい方法が見つかりません。 お知恵をお貸し下さい。 よろしくお願い致します。

  • EXCEL2000 VBA CSVファイルの読み込み

    エクセル2000です。 VBAでCSVファイルを読み込もうとしているのですが、CSVファイルの一部に改行コード[*]が入っています。 そのまま読み込んだ場合、エクセルの中では改行されません。CSVファイル(文字列)を精査していって、[*]があれば、VBでの改行コードChr(10)に変換する方法でいけるのでしょうか。 Workbooks.Open   Filename:="C:\temp\sample.csv" Range("A2:J901").Select このsample.csvの中身を変換したいのですが。 よろしくお願いします。

  • VBA 複数ファイルを読み込んで、抽出

    VBA初心者です。どうぞよろしくお願いいたします。 <やりたいこと> 同じフォルダにある複数ファイル(logファイル)を順番に読み込み、 特定の文字が含まれている行だけを、別ファイル(sum.csv)に保存していきたい。 ファイルが多数あるため、VBAで処理できればと思っています。 急いでおり、今回は丸投げになりますが、どなたかコードを教えていただけますと 非常に助かります。 コードを見て、勉強させていただきます。 どうかよろしくお願いいたします。

  • メモ帳で文字コードの警告がでます。

    メモ帳で文字コードの警告がでます。 メモ帳でシフト+JISコード形式のHTMLホームページ(日本語)を作っています。 C:\Users\個人ユーザー名\Documents\サイト名\フォルダ\ファイル名.htmlですが、 上書きをしようとすると<このファイルは、ANSIテキストファイルとして保存すると失われてしまうUnicode形式の文字を含んでいます。Unicodeの情報を保存するには、・・・>と あります。 プルダウンメニューからとりあえず「Unicode」を選択して上書き保存していますが、 文字化けなどderu出ないか心配です。 大丈夫でしょうか。 WindowsXPのときはこんなのが表示されませんでしたが、Windows7を使うようになってからこんな警告みたいな脅かしみたいのがでます。 (親切心であれば反って不安に駆られるのは私だけでしょうか)

  • postgresからcsvファイルのときの文字コードについて

    >CREAT TEMP TABLE テーブル名 as (SELECT文) >\copy テーブル名 to /フォルダ保存先/file1.csv としてCSVファイルにしたのですが、 文字化けしてしまいます。 何かよい方法はないのでしょうか?

  • VBAでテキストを書き出す時に、文字コードを指定するには?

    VBAでテキストを書き出す時に、たとえば、 shift_jisなど、文字コードを指定して書き出すには どうすればいいのでしょう? unicodeはFSOを使えばいいことはわかったのですが…。

  • エクセルVBA CSVファイルで保存方法

    エクセルのVBA初心者です。 VBAでコードを組んでデータ作成できるようにしました。 最後にそのデータをどのパソコンのディスクトップでもCSVファイルで 保存されるようにコードを組みたいと考えております。 教えて頂ければ幸いです。 宜しくお願い致します。

  • EXCEL- VBA(CSVファイル→インポート)

    A列~F列になる複数(100個以上)のCSVファイルをエクセルファイルにインポートして更に個別にエクセルファイルとして保存したいのですが VBAでできるのでしょうか? 記憶マクロでやったらどうにもうまくいきません。 エクセルのVBAについては ほとんど知識ゼロなので困っております。 大変厚かましくありますが どなた様かご教授お願いできたらと思います!! 【元のファイルの状態】   ◆ファイル名「*.CSV」*は文字数それぞれ違います。   <例:tanaka.xls だったり 09福島.xls>  ◆入っているドライブ   TEXT;C:\Documents and Settings\AA_B\デスクトップ\練習  ◆A~F列にデータが入っている 【やりたいこと】    (1)A~F列はカンマ区切りで全て文字列としたい  (2)元のファイル名でエクセルとして保存したい「*.XLS」

専門家に質問してみよう