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

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

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

こんにちは! エクセル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までつづく

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答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% (454/690)
回答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

  • エクセルのシートをコピーしたら、マクロが・・・

    こんにちは。 小さい図書室の運営をしている者です。 前回、こちらに質問を投稿したところ、とても役立つアドバイスを頂き、すぐに解決したので、今回も質問させていただきます。 今、図書の管理をすべてPCで行っています。 エクセルの「貸出管理」と言うブックで図書の貸出管理を行っています。 フィルタを使って図書の検索をした後、次に図書データを入力すべきセルにボタン一つで戻れるようにマクロを登録してあります。 このマクロを同じブック内の他のシートにコピーして使いたいのですが、コピーするとシートのテーブル名が変わってしまうためマクロでエラーが出てしまいます。 同じブック内の複数のシートでこのマクロを使う場合、いちいちシート名を変えなければならないのでしょうか?? もしくは、シートそれぞれに違うマクロを登録しなければならないのでしょうか?? ちなみに、登録されているマクロは次の通りです。 Sub 戻り() ' ' 戻り Macro ' ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=12 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=10 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=9 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=7 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=6 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=4 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=3 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=2 ActiveSheet.ListObjects("テーブル2").Range.AutoFilter Field:=1 Range("テーブル2[貸出日]").Select Selection.End(xlDown).Select Selection.Offset(1, 0).Select End Sub この説明で分かって頂けますでしょうか?! どうか御回答お願いいたします!!

  • Excelマクロでオートフィルターからコピペ

    ファイルのB列の値から0以外の値をオートフィルターで抽出し、値を、別のファイルのD列の一番下に貼りつけるマクロを作っていますがうまくいきません。 今作ったのは Sub macro1() If ActiveSheet.AutoFilterMode = False Then Range("A:G").Select Selection.AutoFilter Else Selection.AutoFilter Range("A:G").Select Selection.AutoFilter End If Selection.AutoFilter Field:=2, Criteria1:="<>0", Operator:=xlAnd Range("A1").Select Range("B2", Range("B2").End(xlDown)).Select Selection.Copy Windows("貼りつけるファイル名").Activate Cells(Rows.Count, 4).End(xlUp).Offset(1).Select ActiveSheet.Paste End Sub です。 フィルターで0以外の値を抽出しコピーまではできていますが、貼りつけるところでエラーがでます。 Microsoft Visual Basic 400 というエラーです。 何が悪いのか分かりません・・・。 分かる方いましたらご教授ください。よろしくお願いします。

  • オートフィルタ マクロについて

    質問です。 オートフィルタで複数列を1つの条件で抽出したいのですが、教えてください。 たとえばA列が納品書No.・B列が受注No.・C列が商品No.なのですがすべて数字の為、出来ればInBox一回でA-C列を検索してほしいです。 指定納品書NO 受注NO 元品番 21812 3252608 77 21880 3307989 32B 22053 3389769 95414A 22050 3389770 67312H 22052 3389771 67312H 22050 3389773 67118H 以下の様なマクロを作ってみましたが、 A-C列全てに一致しないと抽出しないようです。 どなたかご教授いただけないでしょうか? マクロ '条件1 の設定 Dim 検索NO As Variant '抽出キーの入力指示 検索NO = InputBox("検索NOを入力てください。") 'キャンセルした場合の処理 If 検索NO = Empty Then Exit Sub End If 'オートフィルタがかかっていなかったらかける 'かかっていたら念の為一度解除し再設定 If ActiveSheet.AutoFilterMode = False Then Range("A2:O2").Select Selection.AutoFilter Else Selection.AutoFilter Range("A2:O2").Select Selection.AutoFilter End If Selection.AutoFilter Field:=1, _ Criteria1:=">=" & 検索NO, Operator:=xlAnd, Criteria2:=" " & 検索NO Selection.AutoFilter Field:=2, _ Criteria1:=">=" & 検索NO2, Operator:=xlAnd, Criteria2:=" " & 検索NO2 Selection.AutoFilter Field:=3, _ Criteria1:=">=" & 検索NO3, Operator:=xlAnd, Criteria2:=" " & 検索NO3 AutoFilterMode = False Application.ScreenUpdating = True End Sub よろしくお願いいたします。

  • セルをダブルクリックするとフィルタリングしてくれるマクロですが意味を理

    セルをダブルクリックするとフィルタリングしてくれるマクロですが意味を理解しようとしましたが理解できません(>へ<)どなたか意味を教えてください! Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i As Integer For i = 1 To 256 Step 1 If ActiveSheet.Range("a2").Offset(0, i - 1).Value = "" Then Exit For Next If Target.Row > 1 And Target.Column < i Then ActiveSheet.Range("a2").AutoFilter Field:=Target.Column, Criteria1:=Target.Value ActiveSheet.Range("a1").Select Else ActiveSheet.Range("a2").AutoFilter ActiveSheet.Range("a2").AutoFilter ActiveSheet.Range("a1").Select End If End Sub

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • マクロでテーブルの日時のオートフィルターの制御

    テーブルには「1~6時」、「1日中」、「6~8時,21~22時」などいろいろな時間が書いてあるセルがあります。このテーブルにマクロを使って「1時」「2時」...「24時」などのボタンを24個作りオートフィルターの絞り込みをしようとしています。 このままでは使いづらいので検索列というものを作り、「1時,2時,3時,4時,5時,6時」、「1日中」、「6時,7時,8時,21時,22時」と入力しました。 とりあえず「1時」の絞り込みのマクロを作りました。 Option Explicit Sub One_Oclock() With ActiveSheet.ListObjects(1) .Range.AutoFilter .ListColumns("検索列").Index, _ "1時*", xlOr, "1日中" End With End Sub 1時はセルの頭にくるのでこれで11時や21時を除外することはできましたが逆に「1時」のみのセルは除外されてしまいました。 また2時の場合は「"*2時*"」、「"*2時"」「"2時*"」「"1日中"」となりやはりうまくいきません。どうすればいいですか。

  • 【365】フィルタの解除方法

    N3にあいまい検索欄を設定し、入力後に自動的にフィルタリングされるようマクロで設定しました。 ---------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address 'セル色塗り Case "$L$1" If Intersect(Target, Range("L1")) Is Nothing Then Exit Sub Else Call セル色塗り Range("L1").Select End If '会社名検索 Case "$N$3" If Target.Address <> Range("N3").Address Then Exit Sub End If Range("$A$5:$AW$2005").AutoFilter Field:=14, Criteria1:="=*" & Range("N3") & "*" '画面を左上に戻す ActiveWindow.ScrollColumn = 1 ActiveWindow.ScrollRow = 1 End Select End Sub ---------------------------------------------------- N3を消去してもなぜかフィルタがかかったままになってしまいます。 N3が消去された後、N列のみフィルタを解除するマクロをご教示ください。

  • excel2000マクロについて

    下記の様なマクロを書いていますが、別のマクロの記述の仕方で短縮に書くことはできないでしょうか。 Sub 承認捺印() Sheets("実行").Select If Range("E13").Value = "申請者" Then Sheets("ログイン").Select If Range("F11").Value = "a8012661" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 15").Copy Call 申請者捺印 End If If Range("F11").Value = "a6601456" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 16").Copy Call 申請者捺印 End If If Range("F11").Value = "t9907028" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 17").Copy Call 申請者捺印 End If If Range("F11").Value = "a7545410" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 18").Copy Call 申請者捺印 End If If Range("F11").Value = "t9806047" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 19").Copy Call 申請者捺印 End If If Range("F11").Value = "t0206030" Then Sheets("印章").Select ActiveSheet.Shapes("Picture 20").Copy Call 申請者捺印 End If  end if end sub Sub 申請者捺印() Sheets("報告票").Select Range("m3").Select ActiveSheet.Paste Range("a1").Select End Sub

  • エクセルVBAで住所録を作成

    住所録シートに次のようにコードを作っています。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$B$1" Then 顧客名検索 ElseIf Target.Address = "$C$1" Then フリガナ検索 ElseIf Target.Address = "$D$1" Then 住所検索 ElseIf Target.Address = "$E$1" Then 郵便番号検索 ElseIf Target.Address = "$A$1" Then オートフィルタ解除 カナ順に設定 Else Exit Sub End If End Sub そして標準モジュールには Sub 顧客名検索() ans = InputBox("顧客名を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=2, Criteria1:="=*" & ans & "*" '2つ目のフィルターに検索文字 End With End Sub Sub フリガナ検索() ans = InputBox("顧客カナを入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=3, Criteria1:="=*" & ans & "*" '3つ目のフィルターに検索文字 End With End Sub Sub 住所検索() ans = InputBox("住所を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=4, Criteria1:="=*" & ans & "*" '4つ目のフィルターに検索文字 End With End Sub Sub 郵便番号検索() ans = InputBox("郵便番号を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=5, Criteria1:="=*" & ans & "*" '5つ目のフィルターに検索文字 End With End Sub Sub オートフィルタ解除() Application.CutCopyMode = False Selection.AutoFilter Range("A1").Select End Sub Sub カナ順に設定() Range("C1").Select ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Clear ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Add Key:=Range("C1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("住所録").Sort .SetRange Range("A2:IV65536") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select Selection.AutoFilter End Sub と入れています。 VISTAで作ったのですが、このファイルを共有にして使おうとすると、XPのパソコンでは、A1セルをダブルクリックすると、コードが黄色になり、マクロが中断されます。 B1~G1は問題なくマクロが実行されるのに・・・。 もう一台のVISTAでは同じ共有状態で使っても問題ありません。 どうすればXPでも問題なく使えるのでしょう?

  • エクセルマクロのCallとコンパイルエラー

    エクセルマクロのCallとコンパイルエラー よく、教えていただくのですが作ったマクロを呼び出すのに、 ・Call 作成したマクロ とか教えてもらいますが 標準モジュールのツリーには ・Module1 ・Module2 ・オートオープン ・リセット とかがあって ・Call リセット とかにして実行すると ・コンパイルエラー (モジュールではなく、変数またはプロシージャを指定してください) となってしまいます。 Callの後にはどういう風にすればいいのでしょうか? -------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$5" And Len(Range("B5").Value) > 1 Then Call 印刷←印刷はModule2です。 End If End Sub ------------- で印刷のマクロの一部に Call リセット をつけたたしたらなりました。 よろしくお願いします。

専門家に質問してみよう