[[20151002141031]] 『複数のCSVをxlsxに変換したい』(ゆーな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のCSVをxlsxに変換したい』(ゆーな)

初めまして、
200〜1000近いcsvファイルをxlsxファイルに変換したいのですが、
ひとつひとつ手作業をするには多すぎる量の為、マクロを組めないかと思いご相談いたします。

同フォルダに入っているcsvファイルを
指定フォルダ(又は同フォルダ)にxlsxとして保存

上記の作業を行いたいです。

こちらの掲示板でそれらしきものを拝見したのですが、
400のエラーが出てしまいました。

マクロ初心者で申し訳ありませんが、何卒ご協力お願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >こちらの掲示板でそれらしきものを拝見したのですが、 
 >400のエラーが出てしまいました。

 コードおよび、参考にしたページのリンクを貼ってみてください。
(カリーニン) 2015/10/02(金) 14:25

 >>400のエラーが出てしまいました。 

 せっかく、がんばって書かれたコードですから、それをアップして、皆さんに添削してもらうほうがよくないですか?
 もったいないですよ。

(β) 2015/10/02(金) 14:26


こんにちは

コマンドで結合してから開いて名前を付けて保存とかも検討してみてはどうですか?

copy /b c:\temp\*.csv c:\temp\test\all.csv

(ウッシ) 2015/10/02(金) 14:35


参考にさせていただき実行してみたものはこちらです。
URLは失念してしまいました。
会社の制限付きPCで閲覧しているため、一部会員向け掲示板等の閲覧できずあまり参考にできるサイトを探せておりません。

終わりの方にあるxlsをxlsxに変更しているくらいしか触れていません。
よろしくお願いいたします。

Sub CSV変換()

 Dim myObjA As Object
 Dim myDirA As String
 Dim myFileNameA As String
 Dim myFileListA As String
 Dim myFileCountA As Long
 Dim wb As Workbook

 Dim myObjB As Object
 Dim myDirB As String

 '変換元フォルダ選択ダイアログの表示
    Set myObjA = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "変換元のフォルダを選択して 「OK」 をクリックしてください", 0)
    If myObjA Is Nothing Then Exit Sub

    myDirA = myObjA.Items.Item.Path
    If Right(myDirA, 1) <> "\" Then myDirA = myDirA & "\"

 'フォルダ内のCSVファイルを確認
    myFileNameA = Dir(myDirA & "*.csv")

    Do While myFileNameA <> ""
        If myFileNameA <> ThisWorkbook.Name Then
            myFileListA = myFileListA & Chr(13) & myFileNameA
            myFileCountA = myFileCountA + 1
        End If

        myFileNameA = Dir()
    Loop

    If myFileCountA = 0 Then
       MsgBox "ファイルは見つかりませんでした。変換を終了します。", 48
       Exit Sub
    ElseIf vbNo = MsgBox(myFileCountA & " 個の .csv ファイルが見つかりました。変換を実行しますか?" _
                                       & Chr(13) & myFileListA, 4, "ファイル確認") Then
       MsgBox "キャンセルしました。"
       Exit Sub
    End If

 '保存先フォルダ選択ダイアログの表示
    Set myObjB = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "変換後の保存先フォルダを選択して 「OK」 をクリックしてください", 0)
    If myObjB Is Nothing Then Exit Sub

    myDirB = myObjB.Items.Item.Path
    If Right(myDirB, 1) <> "\" Then myDirB = myDirB & "\"

 'Excel処理
    myFileNameA = Dir(myDirA & "*.csv")

    Do While myFileNameA <> ""
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False

        If myFileNameA <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(myDirA & myFileNameA)
                wb.SaveAs Filename:=myDirB & Left(myFileNameA, Len(myFileNameA) - 3) & "xlsx", _
                FileFormat:=xlExcel3
                wb.Close
        End If

        myFileNameA = Dir()
    Loop

  Application.DisplayAlerts = True
  Application.ScreenUpdating = True

  MsgBox "完了しました。"

 End Sub
(ゆーな) 2015/10/02(金) 14:41

済みません、間違えました。

一つずつxlsxに変換するんですね。

(ウッシ) 2015/10/02(金) 14:45


言葉が足らず申し訳ありません。

ファイル名などはそのままに、
csv→xlsx

を行えたらと思っています。
一つのbookやシートにはまとめず。
個々のものとして作業を行いたいです。

(ゆーな) 2015/10/02(金) 15:01


こんにちは

wb.SaveAs Filename:=myDirB & Left(myFileNameA, Len(myFileNameA) - 3) & "xlsx", _

                FileFormat:=xlOpenXMLWorkbook

とすると、どうですか?

(ウッシ) 2015/10/02(金) 15:02


 かぶりましたがそのままアップします。

 ↓がおかしいと思われます。

 >FileFormat:=xlExcel3

 ↓に変えてみてください。

 xlOpenXMLWorkbook

 参考HPです。

https://msdn.microsoft.com/ja-jp/library/office/ff198017.aspx
http://excwlvba.blogspot.jp/2013/04/xlfileformat.html
(カリーニン) 2015/10/02(金) 15:06


 コード自体は下記の一番最後のもののようだ。

[[20091119112315]] 『同一フォルダー内にあるcsvファイルを別ファイルにxls形式で一括保存』(shinv230)
(ねむねむ) 2015/10/02(金) 15:09


無事変換作業を行えました。
ありがとうございます!

150個以上位になると動作は止まってしまうようですが、
分割作業を行えば作業ができました!

ありがとうございます!

ねむねむ様>
ありがとうございます。
確かにこちらを参考にさせていただいていました!
(ゆーな) 2015/10/02(金) 16:22


 ちょっと気になったので・・・。

 せっかく 見つけた問題なのにこのままでよいのでしょうか?
 dir関数で2度ぐるぐる回す必要があるのか? なんて疑問もありますが、
 Workbookオブジェクト(コレクション)の持つ機能だけで簡単にCSVからXLSX変換を
 してくれるわかりやすいコードです。

 >150個以上位になると動作は止まってしまうようです
 これが事実なら、1000個のCSVファイルに対しては、当たり前ですが、15%の処理能力しかないことになります。

 プログラムでは、少量のデータなら、うまくいくことも大量のそれでは うまくいかない事は、よくあることです。

 大量データだと プログラムが止まってしまったり、極端に処理速度が下がってしまう、
 これらの克服のために頭のよい人がエラーにならない方法や処理速度の速いロジック等を公表し、
 それを我々は使わせてもらっています。
 とりわけExcel/VBAには、少量のデータ量だとうまく作動するロジックもその数が多くなると
 うまく行かないケースが多い印象があります(現象に遭遇したことが何回かあります)。

 Excel2000の時代には、今回の事例と同様 ブックのOpenとCloseを繰り返していると、エラーに成るケースや 
 とびとびのセルが大量にあるときのSpecialcellsメソッドの不具合などなど・・・。
 今の2013や2010では 修正されているものもありますが・・・・。

 これらの回避方法や大量データによる不具合の限界値などを探ることで今後に生かすことは、必要です。

 この「動作は止まってしまう」現象の詳細(エラーなるのか? エラーにはならないが結果的に作成されない)説明をしてください。

 先ほども少し触れましたが、Excel2000時には、「ブックのOpenとCloseを繰り返していると、メモリ不足でエラーになるケース」は、私も経験したことがあります。

 これは、ファイル情報(FCB?)がメモリ上に確保されるのですが、これが クローズで解放されるはずが
 そうはならないでプログラム終了後にガベージコレクションが行われていることが主な原因だったと思います。

 この時は、ループ内にDeventsを入れて、一回一回メモリ処理を行わせることで回避できました。
 が、これは Excel2002では、直っていました。

 同じ原因の現象がまだ直りきっていないのか? 新たな問題か調べる必要はあると思いますよ!!

(ichinose) 2015/10/03(土) 08:48


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.