[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『指定フォルダの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.