[[20110705155353]] 『指定フォルダのCSVをシートを分けて全て取り込む』(いち) ページの最後に飛ぶ

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

 

『指定フォルダのCSVをシートを分けて全て取り込む』(いち)

 マクロ初心者です。
 マクロで指定のフォルダの中に複数あるCSVファイルを全てSheet毎に分けて
 取り込みた いのですが、どうすればよいでしょうか。
 またSheet名はCSVのファイル名(拡張子の前部分)にしたいです。
 よろしくお願い致します。


 一例

 Sub csv取り込み()
    Dim myPath As String
    Dim myCsv As String

    myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")  '適宜変更
    myCsv = Dir(myPath & "\*.csv")
    Do While Len(myCsv) > 0
        Workbooks.Open myPath & "\" & myCsv
        ActiveSheet.Name = Split(myCsv, ".")(0)
        ActiveWorkbook.Sheets(1).Move after:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
        myCsv = Dir()
    Loop

 End Sub

 ぶらっと立ち寄り


マクロ作成ありがとうございます。
 ActiveWorkbook.Sheets(1).Move after:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
 のところでエラーになってしまいました。
どうしたら良いでしょうか?(いち)


 Sub test()
 Dim myObj As Object
 Dim myDir As String
 Dim myFileName As String
 Dim myc As Long
 Application.ScreenUpdating = False
 Set myObj = CreateObject("Shell.Application"). _
          BrowseForFolder(0, "取り込むフォルダを選択してください", 0)
          If myObj Is Nothing Then Exit Sub

          myDir = myObj.Items.Item.Path
          If Right(myDir, 1) <> "\" Then myDir = myDir & "\"
        'フォルダ内のExcelファイルを確認
          myFileName = Dir(myDir & "*.csv")
          myc = 0
          Do While myFileName <> ""
           Workbooks.Open (myDir & myFileName)
            myc = myc + 1
            Workbooks(myFileName).Worksheets(1).Move ThisWorkbook.Worksheets(1)
            myFileName = Dir()
          Loop
          If myc = 0 Then
             MsgBox "CSVファイルがありません。"
          End If
 Application.ScreenUpdating = True
 End Sub
 こんなのはどう?  mama

 >のところでエラーになってしまいました。

 こちらでは、もちろん動くんだけど、
 ・エラーメッセージはどんなものでしたか?
 ・ActiveWorkbook.Sheets(1).Move after:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
   これを
   ActiveSheet.Move after:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
   にしても同じエラー?

 ぶらっと立ち寄り


 シートの移動や複製はデータ量によっては、エラーになります。
 ディスクが足りません。とかでて。
 知らないのかな?
 Bj

 私も最初、ぶらっと立ち寄りさんのコードでエラーになりました。
 「アプリケーション定義またはオブジェクト定義のエラー」のメッセージです。

 なんでだろ?と思って模索していたら
 私の環境はExcel2007で互換モードが標準なのですが
 単にWorkBooks.OpenでCsvを開くと2007の標準モードで開くので
 シートの行列範囲の違いでエラーになっていたようです。

 状況が該当するかわかりませんが、参考程度に。

 作られるシート数によってもエラーになりそうですね。
 (momo)

 >私の環境はExcel2007で互換モードが標準なのですが
 >単にWorkBooks.OpenでCsvを開くと2007の標準モードで開くので
 >シートの行列範囲の違いでエラーになっていたようです。

 momoさん、アドバイス深謝。なぁるほど。しばらくは(自分のような)2003心中派?や
 互換モード派、さらには、もう2003はさよなら派、xlsmしか使わない派。。。
 いろんな環境が混在するので、ややこしくなりそうですなぁ・・・

 ということで、いちさんの環境も2007がらみなら、別の手当てが必要だね。
 でも、もし、実行時のメモリー状況によるものなら、ひょっとすると、以下のようにすると
 エラーにならないかも?

 Sub csv取り込み()
    Dim myPath As String
    Dim myCsv As String

    myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")  '適宜変更
    myCsv = Dir(myPath & "\*.csv")
    Do While Len(myCsv) > 0
        Workbooks.Open myPath & "\" & myCsv
        ActiveSheet.Name = Split(myCsv, ".")(0)
        ActiveWorkbook.Sheets(1).Move after:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
        DoEvents
        DoEvents
        DoEvents
        DoEvents
        DoEvents
        myCsv = Dir()
    Loop

 End Sub

 使用しているのはExcel2010です。
 エラーメッセージは
 実行時エラー1004「移動先またはコピー先のブックの行列数が
 元のブックの行列数よりも少ないため、シートを移動先または
 コピー先に挿入できません。・・・・・・・」とでます。
 最後のマクロも同じエラーです。
 手作業でcsvのSheetをExcelBookにコピーしても同じエラーメッセージが
 出ました。シートの移動は無理でしょうか?
 もしそうでしたら、各CSV毎にExcelBookにシートを新規挿入して、
 csvのシートを全選択して、 ExcelBookのシートにペーストして、
 シート名は各CSVの名前になるようにということは出来ますでしょうか?
 注文が多くて申し訳ございません。よろしくお願い致します。(いち)


 私のと同じ状況のようですね。
 ぶらっと立ち寄りさんのコードでも、ちょっと変更すれば出来そうです。
 以下で試してみてください
 なお、元のCSVに変更をしないように同じフォルダにブックを保存する仕様にしています。

 Sub csv取り込み()
    Dim myPath As String
    Dim myCsv As String
    Dim wb As Workbook
    myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")  '適宜変更
    myCsv = Dir(myPath & "\*.csv")
    Do While Len(myCsv) > 0
        Workbooks.Open myPath & "\" & myCsv
        ActiveSheet.Name = Split(myCsv, ".")(0)
        If wb Is Nothing Then
          Set wb = ActiveWorkbook
        Else
          ActiveWorkbook.Sheets(1).Move after:=wb.Sheets(wb.Sheets.Count)
        End If
        myCsv = Dir()
    Loop
    wb.SaveAs myPath & "CSVtmp.xlsx", xlOpenXMLWorkbook
    Set wb = Nothing
 End Sub

 ==============================
 他の方のコードをお借りしてばかりなので、私のやり方だと

  Sub csv取り込み2()
  Dim n      As Integer
  Dim buf()  As Byte
  Dim myCSV  As String
  Dim myPath As String
  Dim tbl    As Variant
  myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")  '適宜変更
  myCSV = Dir(myPath & "\*.csv")
  Do While Len(myCSV) > 0
    n = FreeFile
    Open myCSV For Binary As n
      ReDim buf(1 To LOF(n))
      Get #n, , buf
    Close n
    tbl = Application.Transpose(Split(StrConv(buf, vbUnicode), vbCrLf))
    With ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
      .Cells.NumberFormatLocal = "@"
      With .Range("A1").Resize(UBound(tbl))
        .Value = tbl
        .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False
      End With
      .Name = Split(myCSV, ".")(0)
    End With
    myCSV = Dir()
  Loop
  End Sub

 こんな感じです。
 (momo)

 別案で
 Sub tset()
Dim myDir As String, fn As String, n As Long
Dim txt As String, x, y(), i As Long, maxCol As Long
myDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
fn = Dir(myDir & "\*.csv")
Do While fn <> ""
    txt = CreateObject("scripting.filesystemobject").opentextfile(myDir & "\" & fn).readall
    x = Split(txt, vbCrLf)
    ReDim y(UBound(x))
    For i = 0 To UBound(x)
        y(i) = Split(x(i), ",")
        maxCol = Application.Max(maxCol, UBound(y(i)) + 1)
    Next
    y = Application.Transpose(Application.Transpose(y))
    n = n + 1
    If n > Sheets.Count Then Sheets.Add after:=Sheets(Sheets.Count)
    With Sheets(n)
        .Cells(1).Resize(UBound(y) + 1, maxCol).Value = y
        .Name = Split(fn, ".")(0)
    End With
    maxCol = 0
    fn = Dir
Loop
End Sub
(seiya)
修正有

コメント返信:

[ 一覧(最新更新順) ]


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