こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルのマクロ(オートフィルタとテーブル)

こんにちは!
エクセル2016を使用しています。
下記のようなマクロを書いたのですが、長くて不細工ですよね。
もう少し簡単にする方法ってありますでしょうか?
それと動作がちょっと遅いので、動作も早くなれば助かります。

Sheet1に下記のマクロを
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$G$5:$H$5" Then
 Else: Call 処理1
 End If
 
 If Target.Address = "$G$73:$H$73" Then
 Else: Call 処理2
 End If
 
 If Target.Address = "$G$141:$H$141" Then
 Else: Call 処理3
 End If
。。。処理48までつづく
 End Sub

Module1に下記のマクロを書いてます。
 Sub 処理1()
 ActiveSheet.ListObjects("テーブル1").AutoFilter.ApplyFilter
 End Sub

 Sub 処理2()
 ActiveSheet.ListObjects("テーブル2").AutoFilter.ApplyFilter
 End Sub

 Sub 処理3()
 ActiveSheet.ListObjects("テーブル3").AutoFilter.ApplyFilter
 End Sub
。。。処理48までつづく

投稿日時 - 2018-03-08 16:49:52

QNo.9471008

困ってます

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

私に誤解があるようです。 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

投稿日時 - 2018-03-09 13:06:22

お礼

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

投稿日時 - 2018-03-09 14:01:41

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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
こんな感じになるでしょうね。

投稿日時 - 2018-03-09 13:28:21

お礼

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

投稿日時 - 2018-03-09 14:01:30

ANo.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

投稿日時 - 2018-03-08 21:44:07

補足

素早い回答ありがとうございます、試してみます。

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

投稿日時 - 2018-03-09 11:51:53