[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダーの中にあるCSVファイルのシートデータをコピー』(狭山)
お世話になっております。 どうぞよろしくお願いいたします。
携帯管理簿と名前のフォルダーがあります。 その中にファイル名がバラバラなCSVファイルが数十個あり 各ファイルの中のシートは1つしかないのですが名前もバラバラです。 また、各シートのデータ数量(行)も違います。
行いたいことですが 1、新規で作成したエクセルファイルを開きます 2、マクロを実行すると”フォルダーの参照画面が出てきて 携帯管理簿と名前のフォルダーを選択 3、各ファイルのシートのA〜Iに入っているデータを下記のようにコピー
A B C D E F G H I 1 電話番号 通信年月日 曜日 通信開始時刻 通信先電話番号 通信先 通信時間 通信料 通信種類 2 090-1234-5678 2017/6/5 月 9:16 01-234-5678 東京 00:44.5 100 スマホ 3 090-1234-5679 2017/6/5 月 9:18 01-234-5679 神奈川 00:28.0 100 スマホ 4 090-1234-5680 2017/6/5 月 10:19 01-234-5680 千葉 05:13.5 100 スマホ 5 090-1234-5681 2017/6/5 月 10:35 01-234-5681 埼玉 01:20.0 100 スマホ
A B C D E F G H I 1 電話番号 通信年月日 曜日 通信開始時刻 通信先電話番号 通信先 通信時間 通信料 通信種類 2 090-1234-5682 2017/6/5 月 11:40 01-234-5682 東京 03:13.5 100 スマホ 3 090-1234-5683 2017/6/5 月 13:10 01-234-5683 神奈川 00:32.5 100 スマホ
A B C D E F G H I 1 電話番号 通信年月日 曜日 通信開始時刻 通信先電話番号 通信先 通信時間 通信料 通信種類 2 090-1234-5684 2017/6/5 月 13:44 01-234-5684 千葉 01:17.5 100 スマホ 3 090-1234-5685 2017/6/5 月 14:19 01-234-5685 埼玉 00:48.0 100 スマホ 4 090-1234-5686 2017/6/5 月 15:05 01-234-5686 東京 00:18.5 100 スマホ
マクロ実行後
A B C D E F G H I 1 電話番号 通信年月日 曜日 通信開始時刻 通信先電話番号 通信先 通信時間 通信料 通信種類 2 090-1234-5678 2017/6/5 月 9:16 01-234-5678 東京 00:44.5 100 スマホ 3 090-1234-5679 2017/6/5 月 9:18 01-234-5679 神奈川 00:28.0 100 スマホ 4 090-1234-5680 2017/6/5 月 10:19 01-234-5680 千葉 05:13.5 100 スマホ 5 090-1234-5681 2017/6/5 月 10:35 01-234-5681 埼玉 01:20.0 100 スマホ 6 090-1234-5682 2017/6/5 月 11:40 01-234-5682 東京 03:13.5 100 スマホ 7 090-1234-5683 2017/6/5 月 13:10 01-234-5683 神奈川 00:32.5 100 スマホ 8 090-1234-5684 2017/6/5 月 13:44 01-234-5684 千葉 01:17.5 100 スマホ 9 090-1234-5685 2017/6/5 月 14:19 01-234-5685 埼玉 00:48.0 100 スマホ 10 090-1234-5686 2017/6/5 月 15:05 01-234-5686 東京 00:18.5 100 スマホ どうぞご教授お願いいたします。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
(マナ) 2017/08/05(土) 22:50
ご返信ありがとうございました。 Sub Macro1() ' ' Macro1 Macro '
'
Range("A1:I91").Select Selection.Copy Windows("Book1").Activate ActiveSheet.Paste End Sub
新規Book1を仮に作りまして携帯管理簿のフォルダーの中にあるファイルの1つのシートを コピーして貼り付けの記録を行いました。 後はどうすればよろしいのでしょうか。 ご教授願います。 (狭山) 2017/08/05(土) 23:17
Option Explicit
Sub test() Dim myFld As String, myCSV As String
myFld = "C:\***:\***\" myCSV = "******.csv"
Workbooks.Open myFld & myCSV
End Sub
(マナ) 2017/08/06(日) 00:01
フォルダ内の全てのCSVファイルを開くのは、エクセルの機能だけではできないので、FileSystemObjectというものを使います。詳細はネットで調べてみてください。
詳しい説明は敢えてしません。FileDialog,FileSystemObject,セルの選択方法,Sortメソッドなどを調べてみて、自分で読み解いてください。それでもわからないことがあったら言ってください。
以下がコードの骨格です。エラー処理はしていないので、必要があれば付け足してください。
Option Explicit Sub CopyFromFiles() Dim dlg As FileDialog, fpath As String Dim fso As Object, fc As Object, f As Object Dim wb As Workbook, ws As Worksheet Dim csv As Workbook, hyou As Worksheet, buf As Variant Set dlg = Application.FileDialog(msoFileDialogFolderPicker) With dlg .AllowMultiSelect = False .Title = "フォルダーの参照" .Filters.Clear If .Show = False Then Exit Sub End If fpath = .SelectedItems(1) End With Set dlg = Nothing Application.ScreenUpdating = False Set wb = Workbooks.Add Set ws = wb.Worksheets(1) buf = Array("電話番号", "通信年月日", "曜日", "通信開始時刻", "通信先電話番号", "通信先", "通信時間", "通信料", "通信種類") ws.Range(Cells(1, 1), Cells(1, 9)) = buf Set fso = CreateObject("Scripting.FileSystemObject") Set fc = fso.GetFolder(fpath).Files For Each f In fc If fso.GetExtensionName(f.Path) = "csv" Then Set csv = Workbooks.Open(f.Path) Set hyou = csv.Worksheets(1) hyou.Activate hyou.Range(Cells(2, 1), Cells(2, 1).End(xlDown).End(xlToRight)).Copy Set hyou = Nothing ws.Activate ws.Cells(1, 1).End(xlDown).End(xlToRight).Activate ActiveCell.Offset(1, 0).Activate ws.Paste csv.Close False Set csv = Nothing End If Next Set f = Nothing Set fc = Nothing Set fso = Nothing ws.Range(Cells(1, 1), Cells(1, 1).End(xlDown).End(xlToRight)).Sort ws.Cells(1, 4) Set ws = Nothing wb.Activate Set wb = Nothing Application.ScreenUpdating = True MsgBox "完了しました" End Sub
(:;:;:;:;:;) 2017/08/06(日) 00:46
(:;:;:;:;:;)さんありがとうございました。 FileSystemObjectとFileDialog,FileSystemObject,のことですが ダイアログで指定したフォルダの中のファイル一覧を取得する とかいろいろとあって理解が出来ませんでした。 (:;:;:;:;:;)さんの教えていただいたマクロを実行すると ActiveCell.Offset(1, 0).Activateの部分がエラーとなってしまいます。
(マナ)さまの教えていただきました方ですが
myFld = "C:\***:\***\" ←C:\Users\PCUSER\Desktopと変更しました myCSV = "******.csv" ←実際のCSVのファイル名を入れてみましたが Workbooks.Open myFld & myCSVにエラーが出てしまいます。 ご教授お願いいたします。 (狭山) 2017/08/06(日) 10:04
横から失礼します。
>myFld = "C:\***:\***\" ←C:\Users\PCUSER\Desktopと変更しました
↓のようにしましたか?
myFld = "C:\Users\PCUSER\Desktop\"
↓になってませんか?
myFld = "C:\Users\PCUSER\Desktop" (カリーニン) 2017/08/06(日) 10:08
myFld = "C:\Users\PCUSER\Desktop\"
の代りに
myFld = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
としてもいいですね。 (カリーニン) 2017/08/06(日) 10:20
これで試してください。
Sub test() Dim cn As Object, rs As Object, myDir As String, fn As String, n As Long With Application.FileDialog(msoFileDialogFolderPicker) If .Show Then myDir = .SelectedItems(1) & "\" End With If myDir = "" Then Exit Sub Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Text;HDR=NO" End With n = 1 fn = Dir(myDir & "*.csv") Do While fn <> "" cn.Open myDir cn.CursorLocation = 3 Set rs = cn.Execute("SELECT * FROM " & fn) Cells(n, 1).CopyFromRecordset rs n = n + rs.RecordCount rs.Close: cn.Close cn.Properties("Extended Properties") = "Text;HDR=YES" fn = Dir Loop Set cn = Nothing: Set rs = Nothing End Sub ( seiya) 2017/08/06(日) 10:56
ws.Cells(1, 1).End(xlDown).End(xlToRight).Activate ActiveCell.Offset(1, 0).Activate
↓
If ws.Cells(2, 1) = "" Then ws.Cells(2, 1).Activate Else ws.Cells(2, 1).End(xlDown).Offset(1, 0).Activate End If (:;:;:;:;:;) 2017/08/06(日) 11:08
(カリーニン)さん( seiya)さん(:;:;:;:;:;)さん(マナ)さん 皆さん本当にありがとうございます。 (:;:;:;:;:;)さんのを実行しましたがデータの移行はできました。 しかし、タイトル行が最終列にきてしまいまして。 (カリーニン)さんの myFld = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"で開きました。 でも、今回は( seiya)さんのマクロを使用させていただきたいと思います
( seiya)さんのマクロの式でご質問があるのですが たとえば、今回はフォルダーの中にCSVファイルでしたが エクセルファイルの場合どこを変更すれば使用できますでしょうか。 (とても便利で活用性があるためにお聞きしたく)
また、大変申し訳がないのですが1つ忘れていたことがありまして マクロ実行後、AとEは電話番号が転記されますが AとEの番号が誰の番号かをリストと言う別のシート名を参考に R列とS列に表示が出来ればと
例 A B C D 1 電話番号 使用者 通信先電話番号 使用者 2 090-1234-5678 A氏01 01-234-5678 E氏05 3 090-1234-5680 B氏01 01-234-5680 F氏06 4 080-1234-0000 C氏03 080-1234-0000 G氏07 5 080-1234-0001 D氏04 080-1234-0001 H氏08
マクロ実行後に、別のリストシート(上記)に基づきR列とS列に結果を表示させたいのですが
A E R列 S列 1 電話番号 通信先電話番号 2 090-1234-5678 01-234-5678 A氏01 E氏05 3 090-1234-5679 01-234-5679 該当無し 該当無し 4 090-1234-5680 01-234-5680 B氏01 F氏06 5 090-1234-5681 01-234-5681 該当無し 該当無し
1回で質問できなくて大変申し訳ございませんが ご教授お願いいたします。 (狭山) 2017/08/06(日) 17:19
1) "Text;HDR=NO" を "Excel 12.0;HDR=No;" に変更してください。 HDR=YES の場合は2行目から、NOの場合は1行目からになります。 2) Set rs = cn.Execute("SELECT * FROM " & fn) fn の部分はシート名をかぎかっこで括って$を付与した形になります。
例:シート名がSheet1の場合 "SELECT * FROM [Sheet1$]"
3) >R列とS列に結果を表示させたいのですが VLookup関数でなんとかなりませんか? ( seiya) 2017/08/06(日) 18:51
有難うございます。 早速、先ほどのCSVファイルをエクセルファイルに変更し行いましたが 実行後はシート一面何も表示されません。 以下に変更したのですが。 Sub test() Dim cn As Object, rs As Object, myDir As String, fn As String, n As Long With Application.FileDialog(msoFileDialogFolderPicker) If .Show Then myDir = .SelectedItems(1) & "\" End With If myDir = "" Then Exit Sub Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Excel 12.0;HDR=No;" End With n = 1 fn = Dir(myDir & "*.csv") Do While fn <> "" cn.Open myDir cn.CursorLocation = 3 Set rs = cn.Execute("SELECT * FROM " & fn) Cells(n, 1).CopyFromRecordset rs n = n + rs.RecordCount rs.Close: cn.Close cn.Properties("Extended Properties") = "Text;HDR=YES" fn = Dir Loop Set cn = Nothing: Set rs = Nothing End Sub
3) >R列とS列に結果を表示させたいのですが VLookup関数でなんとかなりませんか?
R2=IF(A2="","",VLOOKUP(A2,リスト!$A:$B,2,FALSE)) S2=IF(A2="","",VLOOKUP(A2,リスト!$A:$B,2,FALSE)) こちらで出来ました。 ただ、マクロで出来るかと思ったもので。 申し訳ございませんが、前題の件、ご教授お願いいたします。
(狭山) 2017/08/06(日) 20:19
おっと、 fn = Dir(myDir & "*.csv") これも fn = Dir(myDir & "*.xls") に変更ですね。 ( seiya) 2017/08/06(日) 20:39
数式が判明すれば
fn = Dir Loop '↓ ここから With Cells(1).CurrentRegion.Columns("R:S") .Offset(1).Resize(.Rows.Count-1).Formula = _ Array("=IF(A2="""","""",VLOOKUP(A2,リスト!$A:$B,2,FALSE))","=IF(A2="""","""",VLOOKUP(A2,リスト!$A:$B,2,FALSE))") End with '↑ここまで Set cn = Nothing: Set rs = Nothing
を追加すればいいと思いますが... ( seiya) 2017/08/06(日) 20:48
有難うございます。 fn = Dir(myDir & "*.xls")に変更してみたのですが cn.Open myDirが黄色くなってしまいやはり駄目でした。 また先ほどの私が出来ましたと言ったVLookup式ですが リストのA列に該当の電話番号がない場合 R S は#N/Aになってしまいますので、A列に該当の電話番号がない場合は”該当無し”にしたいのですが 何度も申し訳ございませんがご教授お願いします。
(狭山) 2017/08/06(日) 21:18
1) こちらで試してください
Sub test() Dim cn As Object, rs As Object, myDir As String, fn As String Dim n As Long, i As Long, flg As Boolean With Application.FileDialog(msoFileDialogFolderPicker) If .Show Then myDir = .SelectedItems(1) & "\" End With If myDir = "" Then Exit Sub Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") n = 2 fn = Dir(myDir & "*.xls") Do While fn <> "" With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Excel 12.0" .Open myDir & fn .cursorlocation = 3 End With rs.Open "SELECT * FROM [Sheet1$]", cn, 3 If Not flg Then For i = 0 To rs.Fields.Count - 1 Cells(1, i + 1).Value = rs.Fields(i).Name Next End If Cells(n, 1).CopyFromRecordset rs n = n + rs.RecordCount rs.Close: cn.Close: flg = True fn = Dir Loop Set cn = Nothing: Set rs = Nothing End Sub
2) Array("=IFERROR(VLOOKUP(A2,リスト!$A:$B,2,FALSE),""該当無し"")","=IFERROR(VLOOKUP(A2,リスト!$A:$B,2,FALSE),""該当無し"")")
かな? ( seiya) 2017/08/06(日) 22:20
有難うございます。 1) を試してみましたが rs.Open "SELECT * FROM [Sheet1$]", cn, 3が黄色くなってしまいまして 2) はCSVの方のマクロで試したところ完璧です。 Array("=IFERROR(VLOOKUP(A2,リスト!$A:$B,2,FALSE),""該当無し"")","=IFERROR(VLOOKUP(E2,リスト!$A:$B,2,FALSE),""該当無し"")") 後の方はA2ではなくE2でした。 ご教授お願いいたします。 (狭山) 2017/08/06(日) 22:49
シート名はSheet1で間違いありませんか? PCは落としましたので明日また... (seiya) 2017/08/06(日) 23:18
おはようございます。 大変申し訳ございません。 同じCSVデータを開き 名前を付けて保存、形式をエクセルにしただけでしたので 今回のエラーが出てしまいました。 CSVを開きコピー新たなファイルへ貼り付けを行いテストを行った結果 出来ました。 大変お騒がせ致しまして申し訳ございません。 (seiya)さん 最後まで本当にありがとうございました。 機会がございましたら、よろしくお願い致します。 米今日から早速に使用して見ます。
(狭山) 2017/08/07(月) 07:13
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.