- ベストアンサー
Excel VBA インポートファイル名指定方法と実行時エラー1004の解決方法
- Excel VBAを使用してテキストファイルのインポートダイアログを開き、外部データの取り込みをしたいと考えています。しかし、ファイル拡張子を指定する方法や、キャンセル時のエラー解決方法についてわかりません。
- マクロの自動記録を参考にしたマクロ処理を使用していますが、ダイアログを開いた際にファイル拡張子を指定する方法が分かりません。また、ダイアログをキャンセルで閉じると、実行時エラー1004が表示されます。このエラーの解決方法を教えてください。
- Excel VBAを使用してテキストファイルのインポートダイアログを開き、外部データの取り込みをしたいと考えています。しかし、ダイアログを開いた際にファイル拡張子を指定する方法が分かりません。また、ダイアログをキャンセルで閉じると、実行時エラー1004が表示されます。この問題の解決方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>マクロ登録前の段階ではカンマ区切りでデータ更新できていたのですが、マクロ登録後はカンマ区切りになりません。 あら、失礼しました。 #そんな仕様だったかしらん。 Sub test2() Dim qt As QueryTable Dim b As Boolean Dim x As Variant On Error Resume Next Set qt = Sheets("HIN").Range("A3").QueryTable On Error GoTo 0 If qt Is Nothing Then MsgBox "no QueryTable": Exit Sub End If x = Application.GetOpenFilename(",*.txt") If VarType(x) = vbBoolean Then MsgBox "cancel" Else b = qt.TextFilePromptOnRefresh qt.TextFilePromptOnRefresh = False qt.Connection = "TEXT;" & x qt.TextFileCommaDelimiter = True '■カンマ区切りを設定 'qt.TextFileTabDelimiter = True 'タブ区切り。(必要に応じて) qt.Refresh BackgroundQuery:=False qt.TextFilePromptOnRefresh = b End If Sheets("Sheet1").Select Set qt = Nothing End Sub >qt.TextFileCommaDelimiter = True この行を挿入です。 ちなみに、(あくまで参考) 手動で更新する事がなければ、 毎回QueryTableでTextだけ残してQueryTableの定義は削除、という処理でも良いかもしれません。 以下はActiveSheetのRange("A3")起点でtextのみ取り込む例。 Sub test3() Dim x As Variant Dim n As Long x = Application.GetOpenFilename(",*.txt") If VarType(x) = vbBoolean Then MsgBox "cancel" Exit Sub End If With ActiveSheet '場合によっては既存データ消去の必要あり 'n = .Cells(.Rows.Count, 1).End(xlUp).Row 'If n >= 3 Then ' .Rows("3:" & n).ClearContents 'End If With .QueryTables.Add(Connection:="TEXT;" & x, _ Destination:=.Range("A3")) .RefreshStyle = xlOverwriteCells .FillAdjacentFormulas = False .AdjustColumnWidth = False .PreserveFormatting = True .TextFilePlatform = xlWindows .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileTabDelimiter = True .TextFileCommaDelimiter = True .TextFileConsecutiveDelimiter = False .TextFileSemicolonDelimiter = False .TextFileSpaceDelimiter = False .Refresh BackgroundQuery:=False .Parent.Names(.Name).Delete .Delete End With End With End Sub
その他の回答 (1)
- end-u
- ベストアンサー率79% (496/625)
既に作ってある[外部データ範囲](QueryTable)を更新するケースですね? その場合、[データの更新]ダイアログでファイル拡張子を指定するのはちょっと面倒です。(多分) 手動操作をエミュレートするようなコードになってしまいそう。 なので、[外部データ範囲のプロパティ]で指定するところの 「更新時にファイル名を確認」オプション(TextFilePromptOnRefreshプロパティ)の設定を一時的にOffにして、 GetOpenFilenameメソッドでファイルを選択するようにしたほうが簡単そうです。 Sub test() Dim qt As QueryTable Dim b As Boolean Dim x As Variant 'キャンセルに対応するためVariant型でファイル名を受ける '"HIN"SheetのA3セルが含まれているQueryTableをSet On Error Resume Next Set qt = Sheets("HIN").Range("A3").QueryTable On Error GoTo 0 'QueryTableが無ければExit If qt Is Nothing Then MsgBox "no QueryTable": Exit Sub End If 'GetOpenFilenameメソッドで拡張子を指定↓ x = Application.GetOpenFilename(",*.txt") 'キャンセル時はGetOpenFilenameメソッドはvbBoolean型を返す If VarType(x) = vbBoolean Then MsgBox "cancel" Else '「更新時にファイル名を確認」オプションを一時記憶 b = qt.TextFilePromptOnRefresh '「更新時にファイル名を確認」オプションを外す qt.TextFilePromptOnRefresh = False 'GetOpenFilenameで得たファイル名をセット qt.Connection = "TEXT;" & x qt.Refresh BackgroundQuery:=False '「更新時にファイル名を確認」オプションを戻して手動時にも対応の余地を残す qt.TextFilePromptOnRefresh = b End If Sheets("Sheet1").Select Set qt = Nothing End Sub でも、既に作ってあるQueryTableの更新の為に『マクロ実行スイッチを配置』するより [外部データ範囲]範囲(A3)右クリック[データの更新]か、 コマンドボタンユーザー設定から[データ]-[データの更新]ボタンをメインメニューに配置するだけでも良さそうな気もしますが。 #確かにファイル拡張子の指定はできないですけどね。
お礼
end-u 様、アドバイス有難う御座います。 ご指摘通り、現時点では[データの更新]ボタンで更新させています。 しかし、これを不特定の人が操作する時に操作が判り難い為、どうにかしたいと思っていました。 今時間が取れずにまだ確認出来ていませんが、近いうちに結果報告したいと思います。
補足
end-u 様、やっと試す事ができました。 結果、データを取り込めました。 しかしテキストデータをカンマ区切りで読み込みたいのですが、連続したデータになってしまいます。 マクロ登録前の段階ではカンマ区切りでデータ更新できていたのですが、マクロ登録後はカンマ区切りになりません。 どこを修正すればいいでしょうか? お手数ですが、宜しく御願い致します。
お礼
end-u 様 アドバイス有難う御座います。 こちらの説明不足で何度もお手数取らせてしまい大変申し訳有りません。 >qt.TextFileCommaDelimiter = True の追加でうまくいく事ができました。 有難う御座いました。