• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルでのフィルタについて)

エクセルでのフィルタについて

このQ&Aのポイント
  • エクセルの印刷用シートでA1セルの数字によって内容を変更できるようになっています。2枚目以降のシートをフィルタリングすると、印刷用シートの内容が変更されます。
  • フィルタリングのためにマクロを組んでいますが、時間を短縮する方法があれば教えてください。
  • エクセルのフィルタによってシートの内容を動的に変更する方法についてお聞きしたいです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >表記の部分がもう少しコンパクトに記述できたらいいなと思って質問させていただきました。 ご理解していただいてありがとうございます。マクロは、自動実行が可能でエラーが出ないなら、もう、それで十分だと思っていただいてよいのだと思います。まったく出来ない人と比べたら、大したものなのです。掲示板の回答で長く書いていると、質問者さんにトラブルがないように、あれこれ考えを巡らすのですが、それでも、より良いものを望んでいるものは難しいのです。 なお、現在の私が書く場合は、こんなコードにします。参考になるかは分かりません。コーディング・ルールというものもありますが、あまり細かいことは気にしないでよいです。 少し解説すると、 Worksheets(i) というように、シートインデックスは、本来、ルール的には反則ですが、場所が決まっている場合は可能です。左端からインデックスが1~となります。Worksheets("Sheet" & i)のほうが、ベターです。しかし、必ずしも、Sheet2 ~Sheet5 などとなっていない場合を想定して、シートインデックスにしています。Sheets(i) にしないのは、グラフシート、マクロシートも、Sheet のひとつとして数えてしまうので、エラーが発生してしまいます。 検索語は、Sheet1 のA1 に入れています。 このA1 を空にすると、フィルターを解除させます。 Application.ScreenUpdating = False  '画面の動きを停止 Application.Calculation = xlCalculationManual '再計算を止める また、ThisWorkbook と入れるのは、万が一の誤作動による操作を減らすためです。 マクロを遅くしている原因は、おそらく、図のリンク貼り付けが原因のようです。 現在のマクロでは、データがなくオートフィルタにならないことは想定していません。そのチェックは、かなり難しいです。データは、Range("A1").AutoFilter でも可能ですが、あえて、CurrentRegion で範囲を取ることにしました。ここが、現在のマクロの脇の甘いところです。例えば、A1からデータが発生していないなどの問題があるかもしれません。 '------------------------------------------- Sub Test1()   Dim fndTxt As String '検索語   Dim flg As Boolean   Dim i As Integer      fndTxt = ThisWorkbook.Worksheets("Sheet1").Range("A1").Value   If fndTxt = "" Then flg = True      Application.ScreenUpdating = False   Application.Calculation = xlCalculationManual   For i = 2 To ThisWorkbook.Worksheets.Count     With Worksheets(i)       If flg = False Then         .Range("A1").CurrentRegion.AutoFilter _         Field:=1, Criteria1:=fndTxt       Else         .AutoFilterMode = False       End If     End With   Next i   flg = False   Application.Calculation = xlCalculationAutomatic   Application.ScreenUpdating = True End Sub

shinchan_k
質問者

お礼

いろいろありがとうございました。 Application.ScreenUpdating = False は、やっていたんですが再計算を手動にするということには気づいてませんでした。(その部分?!って感じですが・・・(--;) )記述もだいぶんコンパクトになり、将来シートが増えても簡単に対応できそうです。とても参考になりました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 直接の回答ではありません。最近、似たような質問で、ご質問者さんが期待どおりではないとのことで、トラブルが発生したばかりです。現行で完成しているなら、今のままで使っていただきたいのです。 いくら、Application.ScreenUpdating =False ~実行~ Application.ScreenUpdating =Trueで挟んで、また、Selection の曖昧な部分は直せるものの、今回の質問の場合は、図のリンク貼り付けしているわけで、必ず、一度は、シートそれぞれをアクティベートしなければならないはずです。 だから、結果的に遅いというのはある程度は解消されても、最終的には、前のものに対して比較ということですから、個人の感覚に評価をゆだねなくてはなりません。私たちが書けるのは、ミスなく、無駄のないコードであって、速いとかいうのは、その結果です。 この辺りの微妙なところが理解てしていない人なら、「自信あり」でアップロードするかもしれません。しかし、結果として出来たものが、私からすると思ったほどの差はないと思います。例えば、10数分が数秒になるような短縮はされないはずです。ワークシートでセル総なめ制以外のワークシート操作のコードには、それほどの解決策はないのです。

shinchan_k
質問者

補足

ありがとうございます。速い、遅いというのは個人的な感覚でもあり、使用するマシンの性能にもよるものなので時間を短縮できるような記述というのは、主観的ですね。すみません。表記の部分がもう少しコンパクトに記述できたらいいなと思って質問させていただきました。確かに動いてはいるのでこれでもいいのですが、何かよい知恵があれば参考にさせていただきたいです。

関連するQ&A