3日前に仕事で急にVBAを使ってデータの処理をしなければならなくなり、Webでいろいろ調べてデータをフィルターし、ソートをするマクロを作ったのですが、エラーが解決できなくて困っています。
お力を貸してほしいです。(VBA初心者です)
やりたいこと
マクロを設定したボタンを押すと[予定表]シートに設定してある日付でフィルターをかけ、
結果を「抽出」シートに張り付け、時間列で昇順にソートをかける。
その後、「抽出」のデータを[予定表]に時間毎にわけて表示する。
困っていること
現在、困っていることは2つ。
1.AutoFilterを記述しているSchedule1マクロを開始すると、1度目は必ずエラーになる。
エラー内容:番号1004 詳細:RangeクラスのAutoFilterメソッドが失敗しました。 関数:Schedule1
5/20追記
上記のエラーが発生している箇所がわかりました。
以下のコードを実行したところでエラーが発生します。
'セットされた日付でオートフィルをかける Range("A1").AutoFilter field:=13, Criteria1:=Format(second, "m月d日") コード
2.しかし、再度Schedule1マクロを実行すると正常に最後まで処理が終了するが、正常に処理が終了後、再度エラーメッセージが表示される。
エラー内容;番号:0 詳細: 関数FirstDaySort
教えてほしいこと
1.エラーの原因と解決方法を教えてほしい。
2.データ件数が現在2700件ほどあり、処理時間が10秒ほどかかる。これから毎日300件ずつ増える予定なので、少しでも処理時間を短くしたい。短くするにはどうすればよいか。
3.ソートのマクロをソートする列が違っても共有して使えるようにしたいが、どうすれば実現できるか。
ファイルの環境
シート3つ:[予定表][データ一覧][抽出]
Option Explicit Sub Schedule1() 'データを日付でフィルターし、時間列で昇順にソートをかける On Error GoTo Catch Dim day1 As Date, first As String Application.ScreenUpdating = False '画面の表示を止める Sheets("抽出").Select Cells.Clear Sheets("予定表").Select day1 = Range("L2").Value first = CStr(day1) 'Date型を文字列に変更(5/1⇒5月1日でフィルターをかけるため) ' Sheets("データ一覧").Select Range(Range("A2"), Cells(Rows.Count, 1).End(xlDown)).AutoFilter '上から最終行を検索 'セットされた日付でオートフィルをかける(〇月〇日) Range("A1").AutoFilter field:=9, Criteria1:=Format(first, "m月d日") 'オートフィルの結果をコピーする Range("A1", Range("W1").End(xlDown)).SpecialCells(xlCellTypeVisible).Copy '書式と共にコピーする Sheets("抽出").Range("A1").PasteSpecial Paste:=xlPasteAll '予約時間①でソートをかける Sheets("抽出").Select Call FirstDaySort Worksheets("データ一覧").AutoFilterMode = False '念のためフィルタを解除 Application.ScreenUpdating = True '画面を再表示する MsgBox "処理が終了しました" Exit Sub Catch: Call LogErrorMessage("Schedule1") End Sub Sub FirstDaySort() On Error GoTo Catch Range("A1").CurrentRegion.Sort key1:=Range("J1"), Order1:=xlAscending, Header:=xlYes Catch: Call LogErrorMessage("FirstDaySort") End Sub Public Sub LogErrorMessage(ByVal funcName As String) Dim err_mess As String err_mess = err_mess & "番号: " & Err.Number err_mess = err_mess & " 詳細: " & Err.Description err_mess = err_mess & " 関数: " & funcName 'ログやメッセージを出力する Debug.Print (err_mess) Dim r As VbMsgBoxResult r = MsgBox(err_mess, vbOKOnly Or vbCritical) End Sub
以上、ご指導いただけませんか。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー