• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロ(オートフィルタとテーブル))

エクセルのマクロで処理を簡単に、早くする方法

このQ&Aのポイント
  • エクセルのマクロを使用して処理を自動化する方法について教えてください。
  • また、マクロの実行速度が低下している場合は、改善方法も教えてください。
  • 具体的なマクロの記述例や注意点もお教えいただけると嬉しいです。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

私に誤解があるようです。 m(_ _)m 直してみました。 Private Sub Worksheet_Change(ByVal Target As Range)  Dim JobCount As Integer  For JobCount = 1 To 48   If ((Target.Row <> (JobCount - 1) * 68 + 5) Or _     (Target.Column >= 7) Or _     (Target.Column <= 8)) Then    Call 処理メイン(JobCount)   End If  Next JobCount End Sub Sub 処理メイン(JobNum As Integer)  ActiveSheet.ListObjects("テーブル" & Format(JobNum, "0")).AutoFilter.ApplyFilter End Sub

NOBU_O
質問者

お礼

思い通りの動きになりました、とても嬉しいです。 先に回答してくださったのでベストアンサーとさせていただきます。 本当にありがとうございました。

その他の回答 (2)

回答No.3

直接の回答ではないのですが・・ >  If Target.Address = "$G$5:$H$5" Then >  Else: Call 処理1 >  End If Else で処理1ってことは、 「$G$5:$H$5じゃなかったら」処理1・・ってことでいいんですか? 「だったら」で考えるなら、No1さまと似たような感じですが Private Sub Worksheet_Change(ByVal Target As Range)   If Intersect(Target, Range("G:H")) Is Nothing Then     Exit Sub   ElseIf Target.Row Mod 68 = 5 Then     Call 処理(Int(Selection.Row / 68) + 1)   End If End Sub Sub 処理(myNum As Integer)   ActiveSheet.ListObjects("テーブル" & myNum).AutoFilter.ApplyFilter End Sub こんな書き方もできます。 先に Int するか、後で Format するかの違いくらいですね。 失礼しました。 No1さまは謙遜して早くならないとおっしゃっていますが、 If が48個並んでいるよりは間違いなく早いですよ。 「処理1」が適用されても「処理48」のIf まで律義に見に行きますから。 ま、計測はしていないですけれど。 質問文通りの「じゃなかったら」なのであれば No1さまのご回答を参考に Private Sub Worksheet_Change(ByVal Target As Range)   With Selection     If ((.Row Mod 68 = 5) And ((.Column = 6) Or (.Column = 7))) Then       Exit Sub     Else       Call 処理(Int(.Row / 68) + 1)     End If   End With End Sub こんな感じになるでしょうね。

NOBU_O
質問者

お礼

回答いただきありがとうございます。 HohoPapaさんの回答をベストアンサーにさせていただきましたが tsubu-yukiさんの回答もとても勉強になりました。 本当にありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

Private Sub Worksheet_Change(ByVal Target As Range)  If ((Target.Row Mod 68 = 5) And (Target.Column = 7)) Then   処理メイン (Target.Row \ 68) + 1  End If End Sub Sub 処理メイン(JobNum As Integer)   ActiveSheet.ListObjects("テーブル" & Format(JobNum, "0")).AutoFilter.ApplyFilter End Sub こんな感じに書き換えができます。 ソースコードは少なくなりますが 早くはならないです。 m(_ _)m

NOBU_O
質問者

補足

素早い回答ありがとうございます、試してみます。 すみません、補足します。 処理1~48は順番に行うのではなく 指定のセルを変更したら対応するテーブル内だけ オートフィルタをかけていったん処理を終了し、 また違う指定のセルを変更したら対応するテーブル内の オートフィルタをかけるという感じにしたいのですが どのように書けばよいのかわかりません。 良い方法があれば教えてほしいです、よろしくお願いします。

関連するQ&A