• ベストアンサー

複数のCSVファイルを読み込んで複数シートを1ブックとしたい

始めまして。 VBA初心者です。 2枚のCSVファイルをダイアログで各々指定し、保存する2枚のシートを1ブックにまとめたいのですが、うまくいきません。 現状は以下のようなマクロですが、別々のシートとなります。 よろしくお願い致します。 Sub 選択されたPDPファイルを開いて読み込む() With Application.FileDialog(msoFileDialogOpen) .Title = "ファイルを選択して[OK]ボタンをクリックしてください" .AllowMultiSelect = False '複数選択不可 .Filters.Clear .Filters.Add "1枚目", "*.csv", 1 If .Show = -1 Then .Execute 'キャンセルでなければ開く End With With Application.FileDialog(msoFileDialogOpen) .Title = "2つめのファイルを選択して[OK]ボタンをクリックしてください" .AllowMultiSelect = False '複数選択不可 .Filters.Clear .Filters.Add "2枚目", "*.csv", 1 If .Show = -1 Then .Execute 'キャンセルでなければ開く End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 こちらにはレスはつかないかもしれませんが、コードを出しておきます。 ファイルオープン・ダイアログで、複数のCSVファイルを選択してください。 マルチセレクトにしてあります。 '標準モジュール Sub CSVImportSheets() Dim FileNames As Variant Dim fn As Variant  FileNames = Application.GetOpenFilename _   ("CSV(*.csv),*.csv", MultiSelect:=True)  If VarType(FileNames) = vbBoolean Then Exit Sub    For Each fn In FileNames   Worksheets.Add After:=Worksheets(Worksheets.Count)   With ActiveSheet.QueryTables.Add(Connection:= _     "TEXT;" & fn, _     Destination:=Range("A1"))     .Name = ActiveSheet.Name     .FieldNames = True     .RowNumbers = False     .FillAdjacentFormulas = False     .PreserveFormatting = True     .RefreshOnFileOpen = False     .RefreshStyle = xlInsertDeleteCells     .SaveData = True     .AdjustColumnWidth = False     .RefreshPeriod = 0     .TextFilePromptOnRefresh = False     .TextFilePlatform = 932     .TextFileStartRow = 1     .TextFileParseType = xlDelimited     .TextFileTextQualifier = xlTextQualifierDoubleQuote     .TextFileConsecutiveDelimiter = False     .TextFileTabDelimiter = False     .TextFileCommaDelimiter = True     .TextFileTrailingMinusNumbers = True     .Refresh BackgroundQuery:=False   End With     ActiveSheet.UsedRange.QueryTable.Delete  Next fn End Sub

redsocksjp
質問者

お礼

早速のご回答有難うございました。 早速試してみましたが私の思うような内容でした。 大変参考になりました。 また、機会ありましたらよろしくお願い致します。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 >選択したcsvファイルを1ブックに複数シート作成したかったのですが、ご質問の書き方が不十分でした。 QueryTable で、シートにインポートすればよいのでは?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 VBAで作らなくてはも、単に、二つのCSV を足すなら、コマンドプロンプトでしてしまえばよいのではありませんか? copy test01.csv+test02.csv test03.csv これで、test03.csv という結合ファイルが出来ますけれども。 もし、VBAで行いたいなら、それぞれのファイル名を確保して、Shell で行えばよいだけです。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です。読み込むCSVが2つなら先のコードで問題がありませんが、将来的に数が増えることを想定し最後から6行目を変更します 変更前 ActiveSheet.Cells(Selection.Rows.Count + 1, 1).Select 変更後 ActiveSheet.Cells(ActiveCell.CurrentRegion.Rows.Count + 1, 1).Select なお余談ですがファイルの選択もFor~Nextに入れてしまえば、コードもすっきりすると思いますよ

redsocksjp
質問者

お礼

早速のご回答有難うございました。 非常に参考になりました。 選択したcsvファイルを1ブックに複数シート作成したかったのですが、ご質問の書き方が不十分でした。 研究してみます。 ありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

考え方としては2つのCSVファイルを開いて、それぞれのシートをコピーして、マクロが登録されている元のブックに貼り付ける方法が素直だと思います。ちょっとベタですがこんな具合です Sub Test() Dim bkName(2) As String Dim wb As Workbook Dim idx As Integer  Set wb = ActiveWorkbook  Range("A1").Select  With Application.FileDialog(msoFileDialogOpen)   .Title = "ファイルを選択して[OK]ボタンをクリックしてください"   .AllowMultiSelect = False '複数選択不可   .Filters.Clear   .Filters.Add "1枚目", "*.csv", 1   If .Show = -1 Then .Execute 'キャンセルでなければ開く  End With  bkName(1) = ActiveWorkbook.Name  With Application.FileDialog(msoFileDialogOpen)   .Title = "2つめのファイルを選択して[OK]ボタンをクリックしてください"   .AllowMultiSelect = False '複数選択不可   .Filters.Clear   .Filters.Add "2枚目", "*.csv", 1   If .Show = -1 Then .Execute 'キャンセルでなければ開く  End With  bkName(2) = ActiveWorkbook.Name  For Idx = 1 To 2   Workbooks(bkName(Idx)).Activate   Cells.CurrentRegion.Copy   wb.Activate   ActiveSheet.Paste   ActiveSheet.Cells(Selection.Rows.Count + 1, 1).Select  Next Idx  Application.CutCopyMode = False  Workbooks(bkName(1)).Close False  Workbooks(bkName(2)).Close False End Sub またFSO(FileSystemObject)を使って1行ずつデータを読み込み、","をタブに変換してクリップボード経由でセルに貼り付ける方法もあります。こちらはコードは上げませんが、慣れてきたら調べてみたら良いと思います

redsocksjp
質問者

お礼

ご回答ありがとうございました。 試してみたいと思います。 また、なにかありましたらよろしくお願い致します。

関連するQ&A

  • EXCEL VBA EXCEL2000で「ファイルを開く」を表示させる

    EXCELで、「ファイルを開く」を表示させようとしています。 下記命令文でEXCEL2003ではうまくいくのですが、2000だとエラーになるようです。 どちらでも使えるコマンドを教えていただけるでしょうか。 タイトル = "ファイルを開く" ファイルの場所 = "C:\Users" '場所 フィルタ1a = "CSV" '種類 フィルタ1b = "*.csv" '拡張子 With Application.FileDialog(msoFileDialogOpen) .Title = タイトル .InitialFileName = ファイルの場所 .Filters.Clear 'フィルタクリア .Filters.Add フィルタ1a, フィルタ1b 'フィルタ設定 .AllowMultiSelect = False '複数選択不可 .Show End With

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • VBAでファイル名の取得方法

    FileDialogを使用してユーザーにファイル名を指定してもらい、結果からフルパスを取得する事はできたのですが、パスではなくファイル名を取得するにはどのようにすれば良いのでしょうか? Dim lngCount As Long ' ファイル ダイアログを開きます。 With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = True .Show '選択された各ファイルのパスを表示します。 For lngCount = 1 To .SelectedItems.Count lblPath_1.Caption = .SelectedItems(lngCount) Next lngCount End With

  • Excel : マクロでファイルを開く方法を

    Excelにて下記の方法で特殊なファイル(.textでは無い)を開いています。  1.メニューの『開く』で『ファイルを開く』ダイアログを表示させる。  2.毎回、同じフォルダを選択し、さらに一つ下の階層のフォルダ群の中から更新日が最新のフォルダを開く。  3.特殊なファイルなのでファイルの種類を『すべてのファイル』にする。    (他のアプリケーションで作成されたファイルで、拡張子もない)  4.表示されたファイル群から任意のファイルを選択し開く。    (選択するファイルは毎回変わる)  5.『テキストファイルウィザード』が立ち上がってくるのでスペース区切りでファイルを開く しかし、この一連の作業に煩わしさを感じ、 以下のマクロにて『ファイルを開く』ダイアログを表示させ、 任意のファイルを単純に開く所まではマクロ超初心者でもできましたが、 ファイルをスペース区切りの状態で開く方法がいくら調べても分かりません。   (↑あとこれだけなんです!!) どうかマクロ上級者様方、お知恵をお貸し頂けませんでしょうか? Private Sub CommandButton1_Click()   With Application.FileDialog(msoFileDialogOpen)     .AllowMultiSelect = False     .FilterIndex = 1     .InitialFileName = "c:\フォルダ\"    If .Show = -1 Then .Execute   End With End Sub

  • Word VBA: 任意の html ファイルをファイルを開くダイアログから開くには?

    こんにちは、 Word VBA のことで質問があります。 今任意の html ファイルを[ファイルを開く]ダイアログから開くというマクロを作りたいので下記のプログラムを書きましたがこれではあらかじめファイル名やパスが指定されたものになってしまうので目的を満たせないと気づきました。。 Documents.Open メソッドではファイル名の指定が必須だそうですし、、そうするとほかに考えられる手段はどんなものか、 変数を使えばできそうですが、具体的にはどんなプログラムを組めばよいかなど悩んでいます。 ちなみにマクロを作成する環境は word 2003 です。 ***以下、現状のプログラム内容です。*** Private Sub OpenButton_Click() '任意の html ファイルを開き、[File Path] テキストフィールドへファイルのフルパスを表示します Dim dlgOpen As FileDialog Set dlgOpen = Application.FileDialog( _ FileDialogType:=msoFileDialogOpen) With dlgOpen .AllowMultiSelect = False If .Show = -1 Then MainWindow.TextBox1 = .SelectedItems(1) Documents.Open FileName:="C:\test.html", Format:=wdOpenFormatEncodedText End If End With End Sub ************************************************************ 目的を満たすためにはどのようなプログラムをかけばよろしいのか どなたかご指導いただけませんでしょうか よろしくお願いいたします。

  • VBAでユーザーフォーム上に参照したファイルを開きたいのですが…

    EXCEL2003 SP3での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、対象月をコンボBOXで選択させた上で、 データ元とインプット先のファイルをテキストBOXに参照し、 実行ボタンクリックでデータ元からインプット先の該当月シートに データをコピーするといった感じです。 (データ元の該当シート内データを全てコピー&ペースト) 取り込み以降の処理はVBAを使用せずに作成しようと考えています。 質問は、取込みたいファイルの参照後の「ファイルを開いてデータをコピーする」処理がうまくいかず、 どのようにしたらよいか教えて頂けますでしょうか。 現在、以下のように記述していますが、 CommandButton3_Click()の部分の処理が分からずファイルが開けません。ご教授ください。 Private Sub CommandButton1_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox1.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton2_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox2.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton3_Click() Dim file_name As String If TextBox1.Text = "" Then MsgBox "ファイルが指定されていません", vbInformation ElseIf TextBox1.Text = "" Then file_name = TextBox1.Text = "" Shell "Workbooks.OpenText TextBox1.Value " End If End Sub Private Sub CommandButton4_Click() yesno = MsgBox("保存後、ファイルを閉じます。終了していいですか?", vbYesNo + vbQuestion, "Reportの終了") If yesno = vbYes Then ActiveWorkbook.Save ActiveWorkbook.Close Else End If End Sub

  • Access2000の定数について教えて下さい。

    Access2000を現在仕事で使用しています。 インターネット上で、使用したいツールがあり ダウンロードし使用してみたのですが、 変数が定義されていないというエラー表示が出ます。 FileDialogを使用するときにVBEエディターツールバーのツール から参照設定画面を表示させ、「MicroSoft Office XX(バージョン) Object Library」を有効にしなくてはならないということなので、 確認し有効としましたが改善されません。 msoFileDialogPickerという定数は、 Access2000(SR-1)で使えるものでしょうか。 VBEエディターは、MicroSoftVisualBasic6.0です。 使えないなら、代替としてどういったものがありますか? 今現在のコードは、下記の状態です。 Private Function FilePickerDialog() As String With Application.FileDialog(DialogType:=msoFileDialogPicker) .InitialView = msoFileDialogViewList .ButtonName = "選択" .Title = "データベースを選択してください..." .AllowMultiSelect = False .InitialFileName = "" With .Filters .Clear .Add Description:="Access Databases", _ Extensions:="*.mda;*.mde;*.mdb" End With If .Show Then FilePickerDialog = .SelectedItems(1) End If End With End Function

  • range クラスのselectメソッドが・・・

    マクロ実行時に 実行エラー 1004 「Range クラスのselectメソッドが失敗しました。」 のメッセージが出てしまいます。 マクロは以下のとおりです。 ----------------------------------------------------------------------------------- Sub 振替表作成() Workbooks.Add Application.SheetsInNewWorkbook = 1 ActiveSheet.Name = "未収" MsgBox ("未収・前受振替表エクセルファイルを作成します。" & "任意の場所を指定して保存してください。 ") With Application.FileDialog(msoFileDialogSaveAs) .InitialFileName = "未収・前受振替表" If .Show = -1 Then .Execute End With MsgBox ("対象月次の1370集計表 を選択してください。") With Application.FileDialog(msoFileDialogOpen) .InitialFileName = "" .AllowMultiSelect = True If .Show = -1 Then .Execute End With Columns("A:D").Select Selection.Delete Shift:=xlToLeft ---------------------------------------------------------------------------- Columns("A:D").Select の部分でエラーになります。 Columns("A:D").Select の前に ActiveWindow.Select を入れてみたんですが駄目です。 Columns("A:D").Select の前に Selection.Select を入れてみたんですが駄目です。 Columns("A:D").Select の前に Worksheets("シート名").Activate を入れてみたんですが駄目です。 原因と解消方法がわかりません。 何がいけないんでしょうか?

  • VBAでFileDialogを利用してファイル参照したいのですが

    EXCEL2002、SP2上での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、区分をコンボボックスで選択させた上で、 取込みたいファイルを参照し、取込実行ボタンを押すという感じに 作っています。 質問は、取込みたいファイルを参照させ選択したあと、すぐに処理を 行うのではなく、一度参照した結果のフォルダー名とファイル名を 別の窓(ツールボックスのどのコントロールがベストチョイスか不明) に表示させ、取込実行ボタンでコンボボックスで選択した内容と 参照したファイルを取得するようにしたいのですが、別の窓に参照結果 を表示させる方法がわかりません。 説明が長くてわかりにくいと思いますが、参照ボタンの記述を下記に 記載しますので、参照後の処理をどのようにしたらよいか教えて 下さい。 Private Sub 参照_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub →ここに参照した後の処理を追加したいです。 End With End Sub

  • Excelマクロでファイルを1つずつ選択する方法

    先日こちらで、あるフォルダから10個のcsvファイルをまとめて選択し、そのデータをSheet1~10に順番に取り込むという方法を教えていただきました。 その時のものを一番最後に添付します(長くてすみません)。 これとは別に、1つずつ任意のファイルを選択して、あらかじめ用意しているシートにデータを取り込むということをしたいと思っています。 教えていただいた内容をもとに、いろいろいじっているのですが、なかなかうまくいきません。 どのようにすればいいのか、教えていただけないでしょうか。 <やりたいこと> (1)デスクトップ上にあるフォルダ(フォルダ名:データ格納フォルダ)にあるcsvファイルを 選択できるダイアログボックスを表示する(ここで選択するファイルは1つ)。 (2) (1)で選んだファイルのデータを「Sheet1」に取り込む。 (3) 「Sheet1」のセルD2~D260までのデータを、同じブックにある「計算」シートのE4~E260にコピーする。 以降、 2つ目のcsvファイルを選択→「Sheet2」に取り込み→「Sheet2」のD2~D260までのデータを「計算」シートのK4~K260のセルにコピーする 3つ目のcsvファイルを選択→「Sheet3」に取り込み→「Sheet1」のD2~D260までのデータを「計算」シートのQ4~Q260のセルにコピーする といった感じです。 ファイルの数は10個あり、10回繰り返します。 その際、データを取り込む際のシート(sheet1~sheet10)と、コピー先のセルがずれていきます。 (コピー元のセルの位置は変わりません。もしかすると、Sheet1~10を用意しなくても1つのシートで出来るのかもしれませんが…) 分かりづらいかと思いますが、どうか教えていただけないでしょうか。 よろしくお願いいたします。 先日教えていただいた内容: ---------------------------------------------------------------- Sub データ取り込み() Dim FileList() As Variant, tmpName As Variant Dim i As Integer With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = True .InitialFileName = Environ("userProfile") & "\desktop\k-db" .Filters.Clear .Filters.Add "CSVファイル", "*.csv" .Filters.Add "すべてのファイル", "*.*" .FilterIndex = 1 If CBool(.Show) Then '選択ファイルのパスの格納 ReDim Preserve FileList(.SelectedItems.Count - 1) For Each tmpName In .SelectedItems FileList(i) = tmpName i = i + 1 Next Else MsgBox "選択ファイルが無いので中止しました" Exit Sub End If End With For i = LBound(FileList) To UBound(FileList) 'Debug.Print FileList(i), i Call 取り込みSheet(FileList(i), i + 1) Next End Sub Private Sub 取り込みSheet(ByVal MyFileName As String, ByVal MyFileNo As Integer) Worksheets("data" & CStr(MyFileNo)).Select Range("A1").Select With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;" & MyFileName, Destination:=Range("$A$1")) .Name = "cell" & CStr(MyFileNo) 'cell1~cell10 まで名前 .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With End Sub ------------------------------------------------------

専門家に質問してみよう