人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルVBAについて質問です。

指定したフォルダに入っている全てのCSVファイルの内容を
アクティブなエクセル内の新しいシートを左から3番目に作って
書き出すというマクロを作ってください。

手作業だと以下のような手順になります。
?フォルダ内のCSVファイルを一つずつ開いていく。
?エクセル内に新しいシートを左から3番目(sheet3)に作成。
(注)できあがったシートは名前順に並んでるようにしてください。
?開いているCSVの内容を全部コピー。
?新しく作ったシートに貼り付ける。
?CSVファイルを閉じる。
?全てのCSVについて同じ作業を繰り返す。

以上、よろしくお願いします。


●質問者: taroemon
●カテゴリ:コンピュータ
✍キーワード:CSV VBA アクティブ エクセル コピー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ku__ra__ge
●100ポイント

以下のコードを利用してみてください。

'Option Explicit '変数宣言強制をしない

Sub readCsv()
 Const MODE_READ = 1

 Set ShellApp = CreateObject("Shell.Application")
 Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1)
 targetFolder = oFolder.Items.Item.Path

 Set fso = CreateObject("Scripting.FileSystemObject")
 Set fileList = fso.GetFolder(targetFolder).Files

 For Each file In fileList
 Worksheets.Add Worksheets(3 + fileCounter)
 ActiveSheet.Name = file.Name
 
 Set ts = file.OpenAsTextStream(MODE_READ)
 Set pasteCell = Range("a1")
 While Not ts.AtEndOfStream
 pasteCell.Value = ts.ReadLine
 Set pasteCell = pasteCell.Offset(1, 0)
 Wend
 ts.Close
 
 fileCounter = fileCounter + 1
 Next
End Sub

http://example.com/dummy

◎質問者からの返答

ご回答ありがとうございます。

うまくいきました。


2 ● SALINGER
●40ポイント

ようは、フォルダ内のCSVを3枚目以降に挿入するということだと思うので(違ったらすいません)

Sub Macro()
 Dim FoldPath As String
 Dim f
 Dim ch1 As Long
 Dim r As Long
 Dim textLine As String
 Dim csvLine() As String
 Dim i As Long
 Dim FSO
 
  'フォルダのパスを指定
 FoldPath = "C:\Documents and Settings\hogehoge\デスクトップ\test"
 
 Set FSO = CreateObject("Scripting.FileSystemObject")
 
 i = 2
 For Each f In FSO.GetFolder(FoldPath).Files
 If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then
 ch1 = FreeFile
 Open f.Path For Input As #ch1
 r = 1
 
 Worksheets.Add after:=Worksheets(i)
 With ActiveSheet
 .Name = Left(f.Name, Len(f.Name) - 4)
 Do While Not EOF(ch1)
 Line Input #ch1, textLine
 csvLine() = Split(textLine, ",")
 .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine()
 r = r + 1
 Loop
 End With
 i = i + 1
 
 Close #ch1
 End If
 Next
End Sub

CSVを参照渡しで表示してるので、数字が文字列として扱われますが一度保存して開けば問題ないです。

http://q.hatena.ne.jp/

◎質問者からの返答

いつもご回答ありがとうございます。

質問の解釈は間違っていません。わかりづらい説明で失礼しました。


たぶん私の方に問題あると思うのですが、コピペしてそのまま実行すると、

「.Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine()」の部分で、

アプリケーション定義もしくはオブジェクト定義のエラーです。」というエラーがでます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ