Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5386 / 13646 ツリー ←次へ | 前へ→

【51140】テキストファイルを相対パスでインポートする方法について S 07/8/29(水) 19:22 質問[未読]
【51155】Re:テキストファイルを相対パスでインポー... 通りすがり 07/8/30(木) 17:56 発言[未読]
【51157】Re:テキストファイルを相対パスでインポー... S 07/8/30(木) 19:56 お礼[未読]
【51158】Re:テキストファイルを相対パスでインポー... S 07/8/30(木) 20:30 お礼[未読]

【51140】テキストファイルを相対パスでインポート...
質問  S  - 07/8/29(水) 19:22 -

引用なし
パスワード
   掲題について質問させて下さい。

fooフォルダ配下に、bar.xlsとbaz.datが置かれているとします。
bar.xlsのシートに、baz.dat(これはスペース区切りのテキスト)を
読み込みたかったので、

「データ→外部データの取り込み→テキストファイルのインポート」

としました。以降は、これをボタン一つでおこなえるようにしたかったので、

Sub ImportData()
  Worksheets("Sheet1").Activate
  Worksheets("Sheet1").Range("A1").Select
  Selection.QueryTable.Refresh BackgroundQuery:=False
End Sub

なるマクロを作って、bar.xlsのボタンオブジェクトに割り当てました。
更に、該当シートの「外部データ範囲のプロパティ」で、
「更新時にファイル名を確認」のオプションをオフにしました
(ファイル選択のダイアログが毎回出るのを避けるため)。
これにより、ボタンを押せば、シート上のデータがすぐに
baz.datの最新内容で更新できるようになりました。

しかし、フォルダ名を変えた際には、予め最初の作業
「データ→外部データの取り込み→テキストファイルのインポート」
を行わないと、ボタンを押しても実行時エラー'1004'が出てしまいます。
どうやら、baz.datを絶対パスで探しに行っている様なのです。

当方としては、無条件でカレントに置かれているbaz.datを
読み込ませたいのですが、そのようにする事は可能でしょうか。
もし方法をご存知の方がいらっしゃいましたら、是非ご教示下さい。

【51155】Re:テキストファイルを相対パスでインポ...
発言  通りすがり  - 07/8/30(木) 17:56 -

引用なし
パスワード
   ▼S さん:
私のエクセル2002で試したところ、
毎回ファイル選択のダイアログが出てきました。

ので、どういう状況なのかが良く分かりませんでした^^;;

ThisWorkbook.Path

これで、現在のブックのパスを取得することが出来ますので、
利用すれば、相対パス的(?)に操作することも可能かと思います。

参考になれば。。。

【51157】Re:テキストファイルを相対パスでインポ...
お礼  S  - 07/8/30(木) 19:56 -

引用なし
パスワード
   ▼通りすがり さん:
ご返答ありがとうございます! 

いろいろと勝手がわからず、かなり心細かったので、レスが付いて勇気が出ました^^
VBAを始めて今日で3日目なもので・・VC++には結構親しんでいるのですが・・

>私のエクセル2002で試したところ、
>毎回ファイル選択のダイアログが出てきました。

質問時にも書きましたが、私は「データ→外部データの取り込み→データ範囲プロパティ」で
「更新時にファイル名を確認」のオプションをオフにしています。オンだと、ダイアログが出ますね・・
私はExcel2000ですが、多分同じだと思います・・・

因みに、ダイアログを出す場合でも、開くのは、以前に設定したパス(か、デフォルト時のパス)だと思います。
カレントは開かないのではないでしょうか(フォルダ名を変えてからやってみるとわかると思います)。

本日この問題に取り組んでいましたが、ボタンを押すたびにクエリを作成しなおすようにして解決しました。

具体的には、baz.datのインポート先のシート(Sheet2とする)のメンバ関数として、QT()という関数を作りました。
そして、ボタンが配置されているシート(Sheet1とする)から、次のようにして呼び出すようにしました。

'-----------------------------------------------
Private Sub CommandButton1_Click()
  Call Worksheets("Sheet2").QT
End Sub
'-----------------------------------------------

QTは例えば次の通りです。ポイントは、Connectionの引数にインポート元のファイル名baz.datだけを書いて、
絶対パスでは指定しない事です(「テキストファイルのインポート」をマクロ記録したところ、
絶対パスで書かれる事が分かりました。つまり、その部分を下記のように相対パスに修正したという事です)。

'-----------------------------------------------
Sub QT()
  With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;baz.dat", Destination:=Range("A1"))
'    .Name = "Sheet2"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = xlWindows
    .TextFileStartRow = 1
    .TextFileParseType = xlFixedWidth
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(2, 1)
    .TextFileFixedColumnWidths = Array(24)
    .Refresh BackgroundQuery:=False
  End With
End Sub
'-----------------------------------------------

なんとなくVBAの雰囲気?が分かってきましたので、他にも色々と試してみたいと思います。
ご意見ありがとうございました!

-----

【51158】Re:テキストファイルを相対パスでインポ...
お礼  S  - 07/8/30(木) 20:30 -

引用なし
パスワード
   すみません、さきほど抜書きしてしまったのですが、あれだけだとやはりエラーになります。
カレントパスの取得と設定、およびシートのアクティブ化をしないと正常に動きません。
再現性のあるもの(多分・・)を上げておきます。
Sheet1とSheet2の内容はそれぞれ下記の通りです。

'-----------------------------------------------------------------------------------
'--------------------------------------Sheet1---------------------------------------
'-----------------------------------------------------------------------------------
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" ( _
ByVal CurrentDir As String) As Long

Private Sub SetCurDir()
SetCurrentDirectory (ThisWorkbook.Path)
End Sub

Sub ImportData()
  Worksheets("Sheet2").Activate
  Call ActiveSheet.QT
End Sub

Private Sub CommandButton1_Click()
  Call SetCurDir
  Call ImportData
End Sub
'-----------------------------------------------------------------------------------


'-----------------------------------------------------------------------------------
'--------------------------------------Sheet2---------------------------------------
'-----------------------------------------------------------------------------------
Sub QT()
  With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;baz.dat", Destination:=Range("A1"))
'    .Name = "Sheet2"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = xlWindows
    .TextFileStartRow = 1
    .TextFileParseType = xlFixedWidth
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(2, 1)
    .TextFileFixedColumnWidths = Array(24)
    .Refresh BackgroundQuery:=False
  End With
End Sub
'-----------------------------------------------------------------------------------

5386 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free