HIRM
@HIRM (H M)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

VBAからPowerQueryのエラーを判断(取得)したい。

解決したいこと

VBAからPowerQueryのエラーを判断(取得)したい。
どなたか教えてください。

発生している問題・エラー

※現時点、元ファイルはPowerQuery更新するとエラーになるように作成している

開いているファイルに対し、
手動でPowerQuery更新するとエラーメッセージが表示されるが、
マクロからPowerQuery更新するとエラーにならない(正常処理される)

該当するソースコード

言語:ExcelVBA

Dim WB As Workbook
Dim WS As Worksheet

Set WB = Workbooks.Open("C:\売上集計表16.xlsx")
Set WS = WB.Worksheets(1)
ActiveWorkbook.RefreshAll

debug.print err.Number

自分で試したこと

上記VBA実行 エラー発生せず err.number=0

0

3Answer

手動でPowerQuery更新するとエラーメッセージが表示される

どのようなエラーでしょうか?

クエリのプロパティで、「バックグラウンドで更新する」のチェックを外すとどうでしょうか?

s1.png
0Like

@nak435さん
早速ありがとうございます。
ただ既に「バックグラウンドで更新する」は外しています。

状況補足いたします。
・シートにCSVを読み込んでいる
・CSVから意図的に1列(「説明」という項目)削除
(エラー検証したい為削除、項目削除しなければ正常に読み込む)

質問のとおり状況で
手動で更新ボタン押下:添付図の通りエラーメッセージ
VBAから実行:エラー出ない

といった状況です。

キャプチャ.PNG

0Like

Comments

  1. Application.DisplayAlerts = Falseにしていませんよね。trueがデフォルトのはずです。

  2. @HIRM

    Questioner

    はい、何もしていませんが、敢えて
    Application.DisplayAlerts = True
    を記述しても結果は同じ(エラー出ない)でした。

Comments

  1. @HIRM

    Questioner

    折角コメントいただいたのにレス遅くなりすみません。
    明日以降で実行してまた結果報告します、ありがとうございます。

  2. ちなみに、対象のクエリは、

    • "C:\売上集計表16.xlsx"
    • 質問のマクロが書いてあるブック

    どちらにありますか?

    もし、後者でしたら、ActiveWorkbookでなく、ThisWorkbookとしないと更新されないと思います。
    (OpenしたブックがActiveWorkbookになるため)

  3. @HIRM

    Questioner

    ありがとうございます。

    クエリは"C:\売上集計表16.xlsx"にあります。

    念のため、"C:\売上集計表16.xlsx"をマクロファイルして、1ファイルにしてみました。

    「C:\売上集計表16.xlsm」に
    ・PowerQueryでCSVから読み込んだデータ
    ・いただいた情報のモジュールを記載

    実行結果:上手く動作してくれずエラーになります。
    >Set X.qt = ThisWorkbook.Sheets(1).QueryTables(1)
    「インデックスが有効範囲にありません」になり、QueryTablesが無いみたいになります。

    Debug.Print ThisWorkbook.Sheets(1).QueryTables.Count
    を実行したところ「0」になります。

    PowerQueryは扱いがまた違うのでしょうか。
    スキル不足でよくわからない状況です。

  4. イマイチ理解できてないのですが、下記のようにするとうまくいくようです。

    Set X.qt = ThisWorkbook.Sheets(1).ListObjects(1).QueryTable
    
  5. QueryTableの有無を確認するプロシージャです。

    Sub ShowQueryTables()
        Dim ws As Worksheet
        Dim lo As ListObject
        Dim qt As QueryTable
        
        For Each ws In ThisWorkbook.Worksheets
            Debug.Print "Worksheet: " + ws.Name
            
            For Each lo In ws.ListObjects
                Debug.Print "    ListObject: " + lo.Name
                Set qt = lo.QueryTable
                If Not (qt Is Nothing) Then
                    Debug.Print "        QueryTableConnection: " + qt.WorkbookConnection.Name
                End If
            Next
        Next
    End Sub
    
  6. @HIRM

    Questioner

    レス遅くなり大変申し訳ございません。
    アドバイスにて上手いきました、バッチリです!ありがとうございました。

    処理前後で集計結果が全く同じならアラート出すにしようとしていましたが無事解決できました、ありがとうございました。

Your answer might help someone💌