Excel VBA インポートファイル名指定方法と実行時エラー1004の解決方法

このQ&Aのポイント
  • Excel VBAを使用してテキストファイルのインポートダイアログを開き、外部データの取り込みをしたいと考えています。しかし、ファイル拡張子を指定する方法や、キャンセル時のエラー解決方法についてわかりません。
  • マクロの自動記録を参考にしたマクロ処理を使用していますが、ダイアログを開いた際にファイル拡張子を指定する方法が分かりません。また、ダイアログをキャンセルで閉じると、実行時エラー1004が表示されます。このエラーの解決方法を教えてください。
  • Excel VBAを使用してテキストファイルのインポートダイアログを開き、外部データの取り込みをしたいと考えています。しかし、ダイアログを開いた際にファイル拡張子を指定する方法が分かりません。また、ダイアログをキャンセルで閉じると、実行時エラー1004が表示されます。この問題の解決方法を教えてください。
回答を見る
  • ベストアンサー

Excel VBA インポートファイル名指定したい

Excel VBA 初心者です。 スイッチを押すと、テキストファイルのインポートダイアログを開いて、外部データの取り込みをしたいと考えています。 指定セルにインポートを設定+シートにマクロ実行スイッチを配置+マクロの自動記録の記述を参照してマクロを登録し、そのスイッチを押す事で、正常にインポート作業を行なう事ができました。 しかし不明点が2箇所ほどあります。 1.ダイアログを開いたとき、ファイル拡張子を指定したいのですが、どうすれば指定できますか? 2.ダイアログを「キャンセル」で閉じると、「実行時エラー1004:アプリケーション定義またはオブジェクト定義のエラー」と表示されるのですが、解決方法はどうすればいいですか?  ※マクロの自動記録を参照して記述したマクロ処理 Sub Macro1() Sheets("HIN").Select Range("A1").Select ActiveCell.Offset(2, 0).Select Selection.QueryTable.Refresh BackgroundQuery:=False Sheets("Sheet1").Select End Sub 環境:EXCEL2000、VB6.0 以上、宜しく御願い致します。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.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

guzura-1
質問者

お礼

end-u 様 アドバイス有難う御座います。 こちらの説明不足で何度もお手数取らせてしまい大変申し訳有りません。  >qt.TextFileCommaDelimiter = True の追加でうまくいく事ができました。 有難う御座いました。

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

既に作ってある[外部データ範囲](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)右クリック[データの更新]か、 コマンドボタンユーザー設定から[データ]-[データの更新]ボタンをメインメニューに配置するだけでも良さそうな気もしますが。 #確かにファイル拡張子の指定はできないですけどね。

guzura-1
質問者

お礼

end-u 様、アドバイス有難う御座います。 ご指摘通り、現時点では[データの更新]ボタンで更新させています。 しかし、これを不特定の人が操作する時に操作が判り難い為、どうにかしたいと思っていました。 今時間が取れずにまだ確認出来ていませんが、近いうちに結果報告したいと思います。

guzura-1
質問者

補足

end-u 様、やっと試す事ができました。 結果、データを取り込めました。 しかしテキストデータをカンマ区切りで読み込みたいのですが、連続したデータになってしまいます。 マクロ登録前の段階ではカンマ区切りでデータ更新できていたのですが、マクロ登録後はカンマ区切りになりません。 どこを修正すればいいでしょうか? お手数ですが、宜しく御願い致します。

関連するQ&A

  • エクセル2007VBAで新規ファイルを作る場合

    現在A社というファイルのsheet1に電気代と名前を付けたデータ、sheet2に ガス代という名前を付けたデータがあり電気代のブックからコピーして新規ファイルに貼り付けをしたいと思い下記のとおりマクロがありますが、新規ブックを開いた時常に1ではなく他に新規ブックを開いていたら2とか3になってしまいます。すると再度新規ブックに戻ってガス代を貼り付ける時2とか3tpか4とかでしたらエラーになってしまいます。 こういう場合どのように書いたら良いのでしょうか? それから最後に新規ファイルで名前を付けて保存のところまでダイアログ出すところまで 教えていただきたいのですが。 マクロ勉強始めたばかりでよろしくお願います。 Sub DGCopy() Cells.Select Selection.Copy Workbooks.Add Cells.Select ActiveSheet.Paste Sheets("Sheet1").Select Sheets("Sheet1").Name = "電気代" Windows("A社.xls").Activate Sheets("電気代").Select Cells.Select Application.CutCopyMode = False Selection.Copy Windows("Book1").Activate Sheets("Sheet2").Select Cells.Select ActiveSheet.Paste Sheets("Sheet2").Select Sheets("Sheet2").Name = "ガス代" Application.CutCopyMode = False End Sub

  • エクセル VBAで範囲に名前を定義する

    Sub 範囲import設定() Sheets("Format").Select Range("A1").Select Selection.CurrentRegion.Select ActiveWorkbook.Names.Add Name:="import", RefersToR1C1:="=Format!R1C1:R26C7" End Sub 「マクロの記録」でCTRL + * で全データ範囲を選択して"import"という名前を定義したところ 上のようなコードになりました。全データ範囲は毎回違うのですが、ごらんのようにセル番号 で指定されてしまいます。そのつど異なる全データ範囲に名前を定義するにはどうすればいいのでしょうか。 よろしくお願いします。

  • エクセル「マクロの記録」を少し直したい

    マクロの記録で作った下記を Sub Macro1() Sheets("Sheet1").Select Rows("6:6").Select Selection.Copy Sheets("Sheet2").Select Rows("2:2").Select ActiveSheet.Paste End Sub 以下のように書き換えたら、2行目(Paste)がエラーになりました。 Sub ts1() Sheets("Sheet1").Rows("6:6").Copy Sheets("Sheet2").Rows("2:2").Paste End Sub セレクトしないで行ないたいのです。 どう直せばいいでしょうか?

  • VBA 一個前のシートのデータをコピーして貼付

    (1) Private Sub Workbook_Open()に、マクロの記録で作成した(2)を組み込んで処理をしたいのですが、一つ前のファイルを選択する記述・一つ前のシートを指定する記述が判りません。 ●御教示いただきたい事項 ・(1)で開かれた時、ファイルはマスター.xls が開いていますが、 ファイル名 ccc.xlsが開いた状態にする記述のしかた。     ・(2)が各シートで実行される、共通の記述のしかた。 (1) Private Sub Workbook_Open() Workbooks.Open Filename:="C:\Documents and Settings\aaa\My Documents\bbbマスター\マスター.xls" End Sub (2)  ファイル名 ccc.xlsにマクロの記録で作成 Sub Macro4()     Range("J11").Select     'Sheets("7月")のセル J11 Sheets("6月").Select  Range("I7").Select Selection.Copy Sheets("7月").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

  • Excel エクセル マクロ VBA

    エクセルマクロで指定したシート(2シート目)から末尾のシートまで印刷したい場合、下記のようなコードで良いでしょうか? Sub Sample1() Dim i As Long For i = 2 To Sheets.Count ActiveWorkbook.Sheets(i).Select (Replace:= False) Next i Activesheet.PrintOut Preview:=True End Sub

  • Excel 「テキストファイルのインポート」 ダイアログボックスを表示させない方法

    excel2002の「データの取り込み」機能を使って 外部テキストファイルをシート上に直接展開する作業をマクロ記録したところ、 下記のようなマクロコードが自動生成されました。 With Selection.QueryTable .Connection = "TEXT;C:\hogehoge.txt" .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = False .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With これを走らせると、 「テキストファイルのインポート」ダイアログボックスが開いて、 インポートするファイルを選ぶよう求められるのですが、 開くファイル名も決まっているので、このダイアログが出ないようにしたいのです。 vbaの記述でこのダイアログをすっとばす方法はあるのでしょうか? ご指導のほどよろしくお願いします。

  • VBA で名前の定義をしたいのですが・・・

    初心者です。 いろいろ試してみたのですが、だめでした。 ご教授ください。 対象という名前を定義させたいと思っています。 定義の参照範囲は可変です。 定義したい範囲はSheet1のAA3からAAの最終行までです。 それでマクロの自動記録から名前の定義のコードを取ってきて 変数を代入してみましたが、参照範囲を正しく取ってきてくれませんでした。 Sub test() '対象の名前を定義する Dim n As Long n = Sheets("Sheet1").Cells(Rows.Count, 27).End(xlUp).Row Sheets("Sheet1").Select Range(Cells(3, 27), Cells(n, 27)).Select ActiveWorkbook.Names.Add Name:="対象", RefersToLocal:="=Sheet1!R3C27:RnC27" End Sub RefersToLocal:="=Sheet1!R3C27:RnC27"の部分を RefersToLocal:="=Sheet1!R3C27:R&n&C27" RefersToLocal:="=Sheet1!R3C27:"R"&n&"C27"" にしてもだめでした。 うまく範囲をとってくれる方法を教えてください。 お願いします。

  • Excel VBAで他のブックを選択する方法を教えてください。

    こんにちは。VBA初心者です。 ブックを2つ開いた状態で、 マクロを保存してあるブック〔Book1〕から、 毎回ブック名が異なる[Book2]の選択されている2枚のシートを新しいブックに(仮Book3)コピーしたいのですが、どのように記述したらよいのでしょうか。(選択されるシートも毎回異なります。) 特に教えていただきたい部分は、 1.マクロが記録されているBOOK1以外のBookを操作する方法。 2.私以外の方が利用する為、Book1に保存したマクロから実行させる予定なのですが、Book1を毎回開いて実行させる方法がベストのやり方なのでしょうか。 マクロの記録では下記の感じになります。 Sub Macro4() Windows.Arrange ArrangeStyle:=xlVertical Windows("Book2.xls").Activate Sheets(Array("Sheet3", "Sheet4")).Select Sheets("Sheet4").Activate Sheets(Array("Sheet3", "Sheet4")).Copy End Sub 宜しくお願い致します。

  • エクセルVBAについて

    Sub a() Sheets("Sheet1").Select End Sub Sub b() Worksheets("Sheet1").Select End Sub どちらコードもSheet1を選択しますが 「こちらを使うべき!」ってありますか? 独学のため、SheetsとWorksheetsの違いがわかりません。 ご教授よろしくお願いします。

  • EXCELのVBAですが。

    EXCELのVBAですが。 Sub macro1() Dim mycnt As Integer Dim sheet_name1 As String Sheets("kekka").Select Range("A1").Select Sheets("shiji").Select mycnt = Range("B1").Value sheet_name1 = Range("c" & mycnt) Sheets("kekka").Select Sheets("kekka").name = sheet_name1 Sheets("kansuke").Select Sheets("kansuke").Copy Before:=Workbooks("2007年報告.xls").Sheets(3) End Sub (やりたいこと) B1に入っている数値でC1からC10に入っているあるシートの名前(たとえばkansukeとする)を取り、その名前で kekkaというシート名をkansukeという名前に変える。 名前を変えたkansukeというシートを別の2007年報告というbookにコピーを転送する。 (質問)上のコードで実はkansukeと書いてあるところは,B1の値次第で当然いろいろに 変化するため、そのシート名にとらわれない書き方をしたいのですがどう記述すればいいのか わかりません。以上お願いします。

専門家に質問してみよう