dポイントプレゼントキャンペーン実施中!

久しぶりにVBAを使用してやらせたいことがありますので、質問です。

複数のCSVファイルがあり、これを同じブック内のシートとして開くことは
出来ますでしょうか。
メニューから開くとして、それぞれのファイルを開くと、別々のブックにて開いてしまいます。
これを同じブックで、シート別に開かせたいのですが、出来ますでしょうか。
さらに、これをVBAでやりたいと考えております。

まず考えたのは、 ”Application.GetOpenFilename”です。
ただし、これを利用すると、別々のブックでしか開くことができませんでした。

次に考えたのが、”QueryTables.Add”を利用することです。
これだと、同一ファイル、同一シート内にデータを取り込むことができるので、
問題ないのですが、ファイル名を指定しなければなりません。
ファイルが変わるたびにVBAでパスを修正するのは大変ですので、
”QueryTables.Add”のデータ取り込みでファイル選択ダイアログが開くような
コードがあればよいと考えております。
ファイル選択のダイアログが開いて、そのファイルのパスが取得できるような
コードにすれば、”QueryTables.Add”にてデータの取り込みができそうなのですが、
どうすればよいか思いつきません。
"Dialogs(wdDialogFileFind)"というものも見つけたのですが、うまくいきませんでした。

何か良い方法がありますでしょうか。

よろしくお願いします。


Dialogs(wdDialogFileFind)

A 回答 (3件)

こんにちわ



Application.GetOpenFilename でファイルをオープンせず、パスだけ持ってきて
OpenfileName = Application.GetOpenFilename("CSVファイル,*.csv?")

QueryTables.Addで、データを取り込む
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど。
こういう方法があるのですね。
実は、パスを取得してから、QueryTables.Addを使うという方法は考えたのですが、
パスの取得方法がわかりませんでした。
パスの取得方法を検索すると、色々とありましたが、
ダイアログを開いて、選択できる方法が見つからず、悩んでおりました。
この方法で出来そうなのです。

ありがとうございました。

お礼日時:2012/04/05 08:59

こちらがご参考になると思います。

たぶん複数選択したくなると思いますので。http://officetanaka.net/excel/vba/tips/tips107.htm
QueryTables.Addも結構面倒臭そうですね。
http://www.d3.dion.ne.jp/~jkondou/excelvba/T1.htm
CSVファイルはテキストファイルなので、自前でテキストを処理しても良いのですが、試みにADOを使ってやってみました。
ADOを用いると、必要なデータだけ抽出して読み込むといった事もできます。
http://home.att.ne.jp/zeta/gen/excel/c04p47.htm
毎回オブジェクトを作成しては消しているので無駄に重たいと思いますが、何十個も処理するので無ければ問題ないでしょう。
なお、データ型の自動認識で意図しない値になって困るような場合は更に手がかかりますので、ご参考にとどめて下さい。

Sub test()
Dim myFile As Variant
Dim f As Variant
Dim Path As String, WSH As Variant
Dim newWsh As Worksheet

Set WSH = CreateObject("WScript.Shell")
Path = WSH.SpecialFolders("MyDocuments") & "\"
ChDir Path
myFile = Application.GetOpenFilename( _
FileFilter:="CSV ファイル (*.csv),*.csv", _
MultiSelect:=True)

If IsArray(myFile) Then
For Each f In myFile
With ThisWorkbook
Set newWsh = .Sheets.Add(after:=.Sheets(.Sheets.Count))
End With
Call readCsvOnWorksheet(CStr(f), newWsh)
Set newWsh = Nothing
Next
Else
With ThisWorkbook
Set newWsh = .Sheets.Add(after:=.Sheets(.Sheets.Count))
End With
Call readCsvOnWorksheet(CStr(myFile), newWsh)
Set newWsh = Nothing
End If
End Sub

'指定csvファイルを、指定シートに貼り付け
Private Sub readCsvOnWorksheet(csvFileFullPath As String, myWorkSheet As Worksheet)
Dim myCon As Object
Dim connectionString As String
Dim myRs As Object
Dim mySQL As String
Dim csvFilePath As String, csvFileName As String

csvFileName = Right(csvFileFullPath, Len(csvFileFullPath) - InStrRev(csvFileFullPath, "\"))
csvFilePath = Left(csvFileFullPath, InStrRev(csvFileFullPath, "\") - 1)

Set myCon = CreateObject("ADODB.Connection")
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & csvFilePath & ";" _
& "Extended Properties=""Text;HDR=NO;FMT=Delimited"""
myCon.Open connectionString
mySQL = "SELECT * FROM " & csvFileName
Set myRs = myCon.Execute(mySQL)
myWorkSheet.Cells.Clear
myWorkSheet.Range("A1").CopyFromRecordset myRs
Set myRs = Nothing
myCon.Close
Set myCon = Nothing
End Sub
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
ここまでの回答をいただけるとは思ってもおりませんでした。
ADOというものははじめて知りました。
ただ、コードを読んでもいまいち理解できないところもありますので、
これから検討してみようかと思います。
ありがとうございました。

お礼日時:2012/04/05 09:20

> wdDialogFileOpen


それ、先頭にwd って付いてるってことはWord のサンプルコードじゃないの?
ちゃんと調べればいいだけだと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
しばらく出張に行っており、返答が遅くなってしまいました。
申し訳ありません。
これがワードのサンプルコードであることはわかっております。
自分なりに調べてわからなかったので質問させていただきました。
ちなみに、実際にコードを試したのは、
Application.Dialogs(xlDialogOpen).Show
です。
これだと、新規ブックを作ってしまうので、使えませんでした。
新規ブックを作らない。ということが知りたかったので、
使えなかった。ということを言いたかったのです。
紛らわしい書き方をして申し訳ありませんでした。

お礼日時:2012/04/05 08:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!