Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : その他)
デバッグインしないとエラー検知できない場合(ピボットテーブルのデータソースがAccessの場合)
投稿日時: 23/05/12 18:53:28
投稿者: Alice

Microsoft Excel for Microsoft 365 MSOを使用しています。
 
ピボットテーブルのデータソースをAccessから取得しているExcelがあり、ピボットテーブル更新時に「データソースの選択」(※)が表示されて止まる為、下記のコードを作成しました。
(変数:NG_shは、処理終了後にエラー発生シート名を表示させたい為のもの)
 
ですが、通しで実行するとエラーの認知がされず、F8キーを押して一行ずつ実行すると「データソースの選択」が表示され、その画面でキャンセルをクリックするとデバッグ画面に戻りエラー検知できる状態です。
 
ユーザーがExcelに不慣れな為、正常動作しない場合は、その作業はとばしてどこで発生したのかの情報だけ得られる動きにしたいのですが、このようなケースはどう対処すれば良いでしょうか?
 
ご教示いただけると有難いです。
宜しくお願い致します。
 
On Error Resume Next
  With ActiveSheet
      .PivotTables(1).PivotCache.Refresh
                     
           If Err.Number <> 0 Then
                If NG_sh = "" Then
                             
                     NG_sh = ActiveSheet.Name
                      
                 Else
                
                    NG_sh = NG_sh & vbCrLf & ActiveSheet.Name
                             
                  End If
                             
                       Err.Clear
                        GoTo Yaranai
                         
            End If
   End With
On Error GoTo 0
 
※該当画面が掲載されているURL
http://vertica-tech.ashisuto.co.jp/ms_excel/
 
「CAccessからの接続確認」の項の3にある画面です。

回答
投稿日時: 23/05/14 18:07:32
投稿者: simple

そちらでお使いのツールは使ったことがないので、的はずれなコメントになるかと
思いますが、回答がつかないようなので、前座としてコメントします。
 
ピボットテーブルの更新処理を行っただけでエラーが出るのですか?
作業のためのインストラクション(指示)ではなく、どんなことをすると、
どんなエラーが表示されるのでしょうか。
 
On Error Resume Nextはいったん削除して、どんなエラーメッセージが出力されたのか、
それを示して下さい。
自前でエラーメッセージを書くとしたら、Err.Descriptionのほかに、
どんなことを書いたり、どんな処理にしようとしているのでしょうか。
 
ピボットテーブルの更新なら、私はエラーで止めて問題ないようにも思います。
普通に標準的なエラーを発生して、それに従った対応をユーザーがやり直せばよいのではと思います。
中途半端にOn Error Resume Nextとすることで事態が改善するようには思えません。
そんな印象を受けました。
 
エラー処理について
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_error.html
が参考になりませんか?

回答
投稿日時: 23/05/15 08:46:52
投稿者: Suzu

ピボットテーブルの更新時に、ダイアログの選択されるとの事ですが
ダイアログが表示される事自体は エラーではありません。
 
ダイアログ選択でキャンセルを行ったり、
選択したデータソースに対しピボットテーブルのソースを取得できなければ
エラーになります。
 
ダイアログが止まる事を検知する為にエラートラップを行っているのであれば無意味です。
先にも述べていますが、キャンセル時にエラーになるだけです。
 
ダイアログは表示されないのが正常と思われます
なぜ、ダイアログが表示されるのか を確認した方が良いでしょう

投稿日時: 23/05/17 15:34:55
投稿者: Alice

simple様
Suzu様
コメントありがとうございます。
 
一つのExcelファイルにピボットテーブルがある数十のシート(※)に対してピボットテーブルの更新を「ActiveSheet.PivotTables(1).PivotCache.Refresh」で行うと、不特定に「データソースの選択」ウィンドウが出ます。(正常に処理が終了することもあり。)
 
※1シートにピボットテーブルは一つ。
 
発生場所で手動でピボットテーブルの更新をしたところ下記メッセージが表示され、このメッセージの後にもう一つメッセージが表示された後、「データソースの選択」が表示されたので、下記メッセージの原因をを解消すれば解決できそうと考えております。
 
[Microsoft] [ODBC Microsoft Access Driver] クライアントタスク が多すぎます
 
このメッセージが表示されると、その後に作業するピボットテーブルの更新も正常になされないので、引き続き回答待ちしようと思います。
(先述のメッセージを元に、解決方法を検索しているところでもあります。)
 
つたない説明で申し訳ないですが、宜しくお願い致します。

回答
投稿日時: 23/05/17 17:10:11
投稿者: Suzu

引用:
一つのExcelファイルにピボットテーブルがある数十のシート(※)に対してピボットテーブルの更新を「ActiveSheet.PivotTables(1).PivotCache.Refresh」で行うと、不特定に「データソースの選択」ウィンドウが出ます。(正常に処理が終了することもあり。)
  
※1シートにピボットテーブルは一つ。

 
これは、
・1ファイルに、複数シートがある。
・1シートには、1ピボットテーブル 存在する
 
と言う事でしょいでしょうか?
 
その上で
引用:
発生場所で手動でピボットテーブルの更新をした

引用:
[Microsoft] [ODBC Microsoft Access Driver] クライアントタスク が多すぎます
 
このメッセージが表示されると、その後に作業するピボットテーブルの更新も正常になされないので、引き続き回答待ちしようと思います。
(先述のメッセージを元に、解決方法を検索しているところでもあります。)

 
このを鑑みると、一度に更新しようとしているピボットテーブルの数が多すぎるのだと思われます。
 
手動で行っても、瞬時に ピボットテーブルの更新が行われる訳ではありません。
更新中 であるにも関わらず、他のシートに移動し、そのシートでも更新を行っているのではありませんか?
 
VBAでも同様に、次々と更新しているのではありませんか?

投稿日時: 23/05/18 06:42:55
投稿者: Alice

Suzu様
 

引用:
これは、
・1ファイルに、複数シートがある。
・1シートには、1ピボットテーブル 存在する
  
と言う事でしょいでしょうか?

 
→その通りです。
 
引用:
更新中 であるにも関わらず、他のシートに移動し、そのシートでも更新を行っているのではありませんか?
  
VBAでも同様に、次々と更新しているのではありませんか?

 
→こちらもその通りです。多数のシートのピボットテーブルを次々と更新しています。
 
(シート名に「実績」と含むシートに対して該当シートを選択後、「ActiveSheet.PivotTables(1).PivotCache.Refresh」の実行をブック内で繰り返しています。)
 

回答
投稿日時: 23/05/18 08:42:35
投稿者: Suzu

メッセージ(ダイアログ)が表示される原因は明らかです。
 
手動でも、同様になっていますから、ピボットテーブル ひとつひとつ 続けて更新しようとする限り
VBAでどうこうできる事ではありません。
 
ひとつひとつのピボットを更新するのではなく、「全て更新」してはどうでしょうか。
Workbook.RefreshAll メソッド
https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbook.refreshall
 
どうしてもひとつひとつ更新するのではれば
更新が終わった事を検知する事が必要ですが、当方はその方法を知りません。
私なら
次の更新開始を行うまでにインターバルを設ける くらいの対応でしょう。

投稿日時: 23/05/18 12:12:59
投稿者: Alice

Suzu様
 
コメントありがとうございます。
私も追記しながら、下記の点について同様に考えていました。
 

引用:
ひとつひとつのピボットを更新するのではなく、「全て更新」してはどうでしょうか。

 
引用:
次の更新開始を行うまでにインターバルを設ける くらいの対応でしょう。

 
「全て更新」にすると、更新不要のピボットテーブルまで更新されて処理が更に長くなりそうと躊躇していましたが、この手段の方が処理がシンプルでメンテナンスしやすいので、「全て更新」に変更しようかと考えています。[/quote]

投稿日時: 23/05/23 09:57:46
投稿者: Alice

該当Excelに取り込むデータ量を減らせば、ピボットテーブルの更新も早まるかとも考え、「データソースの変更」を下記のように変更しました。
 
「データソースの変更」→「接続のプロパティ」→「定義」タブ→「コマンド文字列」
 
SELECT *
FROM ●●● WHERE 年月 >= '202004'
 
(注)上記の「●●●」はAccessのテーブル名
 
なにぶん、現象が発生したりしなかったりなので、これで様子見をしようと思います。
 
simple様
Suzu様
アドバイスありがとうございました。
違った視点や、状況の見方が大変参考になり助かりました。