• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:現在、QueryTableが設定されているかの確認方法)

QueryTableの設定状態を確認する方法

このQ&Aのポイント
  • ExcelVBAを使用して、Webクエリを取得し、指定されたシートに書き込むプログラムを作成しています。新しいWebクエリを取得する前に、以前のQueryTableを削除するために「QueryTable.Delete」を使用しています。
  • しかし、QueryTableが存在しない場合にはエラーが発生してしまいます。そこで、シートにQueryTableが存在するかどうかをブール型で確認する方法があれば、制御文で回避できます。
  • また、エラーが発生してもプログラムを続行する方法もありますが、それによって不具合が発生する可能性があるため注意が必要です。別の方法がある場合は教えていただけると助かります。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

Countプロパティで確認できませんか? if ActiveSheet.QueryTables.Count <> 0 then msgbox "あり" '----------------------------------------- QueryTablesが、0~複数の場合の確認&Delete '----------------------------------------- Sub Test()  Dim Q As QueryTable    MsgBox ActiveSheet.QueryTables.Count    For Each Q In ActiveSheet.QueryTables    MsgBox Q.Name & vbLf & Q.ResultRange.Address    Q.Delete  Next Q End Sub '------------------------------------------- 外しましたらご容赦! 以上です。

Halical
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA 確認メッセージを非表示で保存

    VBA初心者です。 素人質問ですが、どうぞよろしくお願いいたします。 BOOK1のSheet1にwebクエリが設定されています。 Sheet1にはコマンドボタンが二つあり、 CommandButtun1にはクエリを更新するマクロ。 CommandButtun2にはクエリを更新してブックを閉じるマクロがあります。 コマンドボタン2をクリックすると、Webクエリを更新して、 ブックをメッセージなしで上書き保存したいのですが、 下記のマクロではうまく動作しません。 クエリ更新のあとの、ブック保存、クローズするマクロが動作しない状況です。 CommandButtun1のWSH.Popupが原因のようですが、 何か回避方法がありましたら、ご教授いただけませんか? CommandButtun1には下記のマクロ Private Sub CommandButton1_Click() '独自のエラーメッセージを表示する(On Errorステートメント) On Error GoTo Err_Msg 'webクエリ更新 Range("H6").Select Selection.QueryTable.Refresh BackgroundQuery:=False 中略 Exit Sub 'エラーメッセージの指定 Err_Msg: Dim WSH As Object Set WSH = CreateObject("Wscript.Shell") WSH.Popup "完了しました。", 3, "自動的に閉じます", vbYesNo + vbInformation Set WSH = Nothing End End Sub ------------------------------------------------------------------------- CommandButtun2には下記のマクロ Private Sub CommandButton2_Click() CommandButton1.Value = True If ThisWorkbook.Saved = False Then ThisWorkbook.Save End If ActiveWorkbook.Close End Sub

  • 複数csvファイルをexcelの各シートに書き込む

    複数のCSVファイルを各々一つのexcelファイルの各ワークシトに書き込む方法のコードを下記のようにQueryTableを使った形にしてみました。 $csvFile1 = "D:\test_data\test_data1.csv" $csvFile2 = "D:\test_data\test_data2.csv" $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $book = $excel.Workbooks.Add() $Book.Worksheets.Add() $sheet1 = $excel.Worksheets.Item(2) $sheet2 = $excel.Worksheets.Item(1) $startRange = "C2" $outputColumn = $sheet1.Range($startRange).Column $outputRow = $sheet1.Range($startRange).Row $QueryTable = $sheet1.QueryTables.Add("TEXT;$csvFile1",$sheet1.cells($outputRow,$outputColumn)) $QueryTable.TextFileCommaDelimiter = $True $QueryTable.TextFilePlatform = 65001 $QueryTable.TextFileStartRow = 1 $QueryTable.Refresh($false) $QueryTable.Name = "仮テーブル" $QueryTable.Delete() $startRange = "C2" $outputColumn = $sheet2.Range($startRange).Column $outputRow = $sheet2.Range($startRange).Row $QueryTable = $sheet2.QueryTables.Add("TEXT;$csvFile2",$sheet2.cells($outputRow,$outputColumn)) $QueryTable.TextFileCommaDelimiter = $True $QueryTable.TextFilePlatform = 65001 $QueryTable.TextFileStartRow = 1 $QueryTable.Refresh($false) $QueryTable.Name = "仮テーブル" $QueryTable.Delete() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) > $null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) > $null [gc]::Collect() これは2個のcsvファイルだから何とかなっていますがファイルが増えた場合これではとても面倒なことになります。私の能力ではコンパクトにコードを纏めることが出来ません。コンパクトな方法をお教えください。別にExport-Excel等使う方法でもかまいません。

  • ExcelVBA キーイベント設定した関数が別のファイルで実行されエラーになります。回避する方法は?

    DELETEキーを拾うため、SheetのOpenイベントに Application.onkeyにて"DELETE"キーと呼び出し関数を 指定しています。 標準モジュールにて、呼び出し先関数を定義して 普通に処理出来ているのですが・・・・・ まったく関係の無いほかのエクセルファイルを開き DELETEキーを押下しても、同じ関数が呼び出されて しまいます。 (同じExcel.exeのMDIの一つとして起動されてしまった場合) 困った事に、シートのある特定の状態を見ている為 現状エラーメッセージボックスが表示されてしまいます。 回避方法は幾らでもあるのですが。 Googleで検索しても、OnError で処理していたり まったく何も考えてなかったり。 具体的な対応策が見つかりません。 現状シート名にて判断しようと考えておりますが かなりの数がある&シート名に制約が生まれる のでやりたくないんです。 何か一般的な回避策がありましたら教えて頂け 無いでしょうか。

  • ExcelVBA:新規ワークブックを作成し、ワークシートを3枚作る方法 

    ExcelVBAで質問があります。 設定で新規作成時ワークシート3枚としているなら問題ないのですが、それ以外の枚数に設定している場合で、新規のワークブックを作成し、ワークシートを3枚作成するコードを作りたいのですが、以下のようにするとエラーが出ます。エラーは「コンパイルエラー:名前付き引数が見つかりません。」です。 Workbooks.Add Count:=3 このエラーをなくし、新規作成でワークシート3枚(枚数は変わるかもしれません)作るにはどうしたらよいのでしょうか? 回答よろしくお願いします。

  • エクセルVBAで、ある特定の名前のオブジェクトが存在するかどうかの確認方法

    Sheets("XXX").Shapes("SN").Deleteとすると、SNという名前のShapeが存在しなと当然エラーになります。 そこで、「SNがあったら削除する」と書きたいのですが、いい方法が思い当たりません。 For Each ~ Nextでshapeの名前を一個ずつしらべ、あったら削除する方法や、存在しない場合 On Error Resume Nextでエラーを強制的に回避するのではなく、Shapes("SN")があればDeleteするというようにすっきり書く方法は無いでしょうか?

  • Excel 「webクエリ」の接続失敗アラートダイアログを出させない方法は?

    Excel2000で一定時間おきに あるサイトをwebクエリで見に行き、その結果をテキストファイルで吐き出すマクロを作成しています。 webクエリ機能は普通、ネットワークエラー等の理由でweb参照が出来なかった場合、「サーバーが見つかりませんでした」という エラーダイアログが出ますが、vbaの記述でこのアラートを表示しないようにする方法はありませんでしょうか? (ダイアログが出てしまうとその時点で処理が停止し、ひいては定期更新がストップしてしまうので、これを回避したいです) ちなみに、 Application.DisplayAlerts = False では回避できませんでした。 何卒お知恵をお貸しください。

  • VBAでのwebクエリ更新について

    下記のように、For文で各シートに設定してあるwebクエリを更新しています。 問題は、サイトによって更新中にExcelに拘束され他の操作ができなくなる(ネットブラウザで文字が打てなかったり、ページが開けなかったり)場合があります。 そこで、webクエリの更新をバックグランドで処理して、他の操作ができるようにするみたいなことはできるのでしょうか?詳しい方アドバイスよろしくお願いしますm(_ _)m For i = 1 To MAX Worksheets("シート名" & i).Range("B5").QueryTable.Refresh BackgroundQuery:=False Next i

  • パスワード付Access2010からリンクテーブル

    パスワード付Access2010のテーブルを別のAccessでリンクテーブルとして使用しています。 このリンクテーブルを使ったクエリの結果を、ADOを使ってExcelシートに書きだしたいのですが、このリンクテーブルを使ったクエリを動かすと 「SQLステートメントが正しくありません。DELETE、INSERT、PROCEDURE、SELECTまたはUPDATEを使用してください」 というエラーメッセージが出てしまいます。 リンクテーブルのあるAccessでクエリを動かすと普通に動くのですが、ExcelからADOで動かすとエラーがでるということです。 このような場合に、エラーにならずにExcelからクエリを動かして結果をシートに出力する方法が何かありますでしょうか。 ご教授よろしくお願いいたします。

  • Powershellのexcel操作でCom終了?

    PowershellでCSVファイルをExcelに書き出すコードを正解かどうか分かりませんが他のサイト等を参考に継ぎ接ぎで下記のようにしましたが、COMオブジェクトの終了の方法がこれで正しいのかお伺いいたします。 #QueryTableオブジェクトを使ってCSVを取り込む方法 # Excelを操作する為の宣言 $excel = New-Object -ComObject Excel.Application # 起動直後は非表示(最小化ではない)になっているので表示する $excel.Visible = $true #新規ブックを作成する $book = $excel.Workbooks.Add() # シートを取得する $sheet = $excel.Worksheets.Item(1) # CSVファイル $csvFile = "D:\test\pp002.csv" # 書き出し開始セル $startRange = "B2" # 出力列(書き出し開始セルの列) $outputColumn = $sheet.Range($startRange).Column # 出力行(書き出し開始セルの行) $outputRow = $sheet.Range($startRange).Row # 読み込むファイルの形式を【2:文字列】と指定するための配列を作成 $arrDataType = @() for ($i=0; $i -lt 255; $i++){ $arrDataType += 2 } # QueryTableオブジェクトを作成 $QueryTable = $sheet.QueryTables.Add("TEXT;$csvFile",$sheet.cells($outputRow,$outputColumn)) # 区切り文字に「カンマ区切り」を指定 $QueryTable.TextFileCommaDelimiter = $True # 文字コードに「Shift_JIS」を指定 #$QueryTable.TextFilePlatform = 932 # 文字コードに「UTF-8」を指定 $QueryTable.TextFilePlatform = 65001 # 読み込み開始行を指定 $QueryTable.TextFileStartRow = 1 # 読み込むファイルの形式を指定 $QueryTable.TextFileColumnDataTypes = $arrDataType[0..255] # 読み込み実行 $QueryTable.Refresh($false) # 名前を指定(後続処理で削除できるようにするため) $QueryTable.Name = "仮テーブル" # 作成された「QueryTableオブジェクト(=クエリと接続)」を削除 $QueryTable.Delete() # 上記で作成されてしまう名前定義(仮テーブル)を削除 foreach($n in $book.Names){ If ($n.Name -Like $loadSheetName + "!" + "仮テーブル*") { $n.Delete() } } #COMオブジェクトの破棄とメモリの解放 [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) | Out-Null [GC]::Collect() 全体のコードの是非も問いたいところですが特に最後の2行で行う処理についてです。 いままで、コードが不十分だったためかどうか分かりませんが読み取り専用になったりプロセスが残ったままになったりメモリの問題等で再三PCの再起動を余儀なくされる事に陥っているため宜しくお願いいたします。 ちなみにいままでは $excel = $null [GC]::Collect() で処理していました。

  • AccessVBAでExcelシートの削除

    AccessVBAで、Excelのシートを削除したいです。 AccessのクエリをExcelの指定したシートにエクスポートする処理をしたいのですが、 同じ名前のシートが存在すると 「テーブル○○○は既に存在しています」 とゆうエラーになってしまいます。 上書きしてくれれば良いのですが、上書きされないのですよね? いろいろ調べたのですが、ExcelVBAでシートを削除する方法しか見つけることが出来ませんでした。 エクスポートはODAを使用せずに、 SELECT * INTO ~文で実行しています。 初心者です。よろしくお願いいたします。