- ベストアンサー
VBAマクロで複数ファイルを選択し、任意のシートにデータをペーストする方法
- 会社でVBAマクロを組みたいと思っていますが、複数ファイルを選択してデータを任意のシートにペーストする方法がわかりません。
- 現在、複数ファイルを選択し、最初のファイルを開いてデータを任意のシートの列に最後までペーストするVBAマクロを作成していますが、エラーが発生しています。
- VBAマクロを使って複数のファイルからデータを取り込み、任意のシートにペーストする方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>同じ位置に、【すでにファイルが開かれています】というエラーが出ます。 >どうしたらいいでしょうか? Openで開いたファイルはCloseで閉じないと同じファイル番号は使用できません。 以下の流れはセットで利用してください。 ’(1)CSVファイルを開く(Filename はFor Each で格納するファイルパス) Open Filename For Input As #1 ↓ '(2)開いたCSVファイルの処理内容を記述 ↓ '(3)CSVファイルを閉じる Close #1 以下のVBAコードでは一通り添付画像のようなデータと結果になるようにしています。 (末尾に「'★○○★」を表記している箇所を追加・修正しています) ただし、前半のブック名でシートを作成は変数に何を格納しているのか分かりませんので マクロを記述しているブックのファイル名をシート名としています。 ■VBAコード Sub ReadMultiCSVFiles() ' [[ 変数定義 ]] Dim varFileName As Variant Dim CSVWorkSheet As Worksheet Dim NewWorkSheet As Worksheet Dim SheetName As String Dim Filename As Variant '★追加★ ' [[ ファイルパスからファイル名を取得 ]] SheetName = Dir(ThisWorkbook.FullName) '★修正★ ' [[ ファイル名で新しいシート作成 ]] Set NewWorkSheet = CreateWorkSheet(SheetName) ' [[ 複数ファイルパス名を取得 ]] varFileName = Application.GetOpenFilename(FileFilter:="(*.*),*.*", _ Title:="CSVファイルの選択", MultiSelect:=True) ' [[ ファイルパス取得できなかったら ]] If IsArray(varFileName) = False Then Exit Sub End If ' [[ ファイルパス取得できたら ]] For Each Filename In varFileName ' [[ CSVファイルを開く ]] Dim buf As String, n As Long Open Filename For Input As #1 '★修正★ Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop ' [[ CSVファイルを閉じる(保存無し) ]] Close #1 '★修正★ Next Filename End Sub ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ' [[ ]] ' [[ ワークシート名を指定したワークシートの作成 ]] ' [[ ]] ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] Function CreateWorkSheet(WorkSheetName As String) As Worksheet ' 変数定義 Dim NewWorkSheet As Worksheet Dim iCheckSameName As Integer ' ワークシートの作成 ' ※一番最後に挿入 Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' 同じ名前ワークシートが無いか確認 iCheckSameName = 0 For Each WS In Sheets If WS.Name = WorkSheetName Then MsgBox "ワークシート名:" + WorkSheetName + " この名前は既に使われています。" iCheckSameName = 1 End If Next '同じ名前のワークシートがなければ If iCheckSameName = 0 Then NewWorkSheet.Name = WorkSheetName Set CreateWorkSheet = NewWorkSheet End If End Function
その他の回答 (2)
- eden3616
- ベストアンサー率65% (267/405)
No1に補足です。 複数ファイルに処理する場合は以下のようになります。 Dim myFile As Variant For Each myFile in varFileName Open myFile For Input As #1 'ファイルを読込 'ファイルの処理を記述 '閉じる処理を記述 Next myFile End Sub
- eden3616
- ベストアンサー率65% (267/405)
とりあえず。 MultiSelectがTrueの場合、ファイルパスは配列で帰ってきます。 -----"ヘルプ引用"----- このメソッドは、ユーザーによって選択、または入力されたファイルの名前とパス名を返します。引数 MultiSelect が True の場合は、選択されたファイルの名前の配列が返されます。選択されたファイルが 1 つでも、配列として返されます。入力が取り消された場合には False が返されます。 ----------------------- Open varFileName For Input As #1 '【ここにエラーが出ます。型が違うと出ます】 ↓ Open varFileName(1) For Input As #1 '【ここにエラーが出ます。型が違うと出ます】
お礼
ご確認ありがとうございます。 同じ位置に、【すでにファイルが開かれています】というエラーが出ます。 どうしたらいいでしょうか? 何度も申し訳ないのですが、お教えください。。。