2016-07-18 14 views
0

スプレッドシートの[データ]タブから特定の不要なデータを削除するマクロがあります。 私はVBAの主要なアマチュアですので、おそらく私のマクロはおそらく良いかもしれませんが、テーブルから3つの基準に基づいて重複を削除し、次に3つのカラムをフィルタリングし、すべてのフィルターが表示され、マクロの実行が完了すると完了したメッセージボックスが表示されます。メッセージボックスは、マクロの終わりに完了したタスクを返しますか?

メッセージボックスに追加する方法や、完了したアクション(削除された重複数、削除された行数など)を返すユーザーフォームを作成する方法はありますか?

データタブから重複削除機能を使用すると、削除された数と残っている行の数が警告されます。

ここは私の初心者スクリプトです。

Sub Del_Dups_and_Remarks() 
' Del_Dups 

Application.ScreenUpdating = False 
Range("DenialsTable1[[#Headers],[Payment Tx ID]]").Select 
Range(Selection, Selection.End(xlToRight)).Select 
Range(Selection, Selection.End(xlDown)).Select 
ActiveSheet.Range("DenialsTable1[#All]").RemoveDuplicates Columns:=Array(2, 6, _ 
     14), Header:=xlYes 

' Remark_Removal 

ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=19, _ 
     Criteria1:="=MEDICAID [239]", Operator:=xlOr 

ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=22, _ 
     Criteria1:="Y" 

ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=9, _ 
     Criteria1:="N598" 
Application.DisplayAlerts = False 
Range("DenialsTable1").Offset(1, 0).Select 
Selection.Delete 
Application.DisplayAlerts = True 

'Clear_Filters 

Range("A6").Select 
ActiveSheet.ShowAllData 
Range("A7").Select 

Application.ScreenUpdating = True 

MsgBox ("Completed") 

End Sub 

ありがとうございます!現状では

+1

からコードを実行して、あなたは変数にActiveSheetを変更するための小さな挑戦であるかもしれませんクイックノート、私は['.Select'の使用を避けることを強くお勧めします(http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) - それは予防に役立ちます頭痛と予想外の行動。 – BruceWayne

+0

ヒントをお寄せいただきありがとうございます。マクロをそのまま使用し続けると、どのような問題にぶつかることがありますか?申し訳ありませんが、これらはダムの質問ですが、私はあなたが与える時間を持って助けていただきありがとうございます! – Awill

答えて

1

は、THERはあまりにも多くのSELECT秒であり、それはあなたがまたOption Explicitが欠落している

最初の行で発生した場合のコードは、必要な基準は削除されません - 将来的に多くの頭痛を軽減する、これを使用して

Option Explicit 

Sub Del_Dups_and_Remarks() 
' Del_Dups 
Dim InitCount as long 
Dim AfterDups as long 
Dim AfterDel as long 

Application.ScreenUpdating = False 

InitCount=Range("DenialsTable1").rows.count 

ActiveSheet.Range("DenialsTable1").RemoveDuplicates Columns:=Array(2, 6, _ 
     14), Header:=xlYes 
AfterDups=Range("DenialsTable1").rows.count 
' Remark_Removal 

ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=19, _ 
     Criteria1:="=MEDICAID [239]", Operator:=xlOr 
ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=22, _ 
     Criteria1:="Y" 
ActiveSheet.ListObjects("DenialsTable1").Range.AutoFilter Field:=9, _ 
     Criteria1:="N598" 

Application.DisplayAlerts = False 
ActiveSheet.Range("DenialsTable1").SpecialCells _ 
     (xlCellTypeVisible).Delete 
Application.DisplayAlerts = True 

AfterDel=Range("DenialsTable1").rows.count 
'Clear_Filters 

ActiveSheet.ListObjects("DenialsTable1").autofilter.ShowAlldata 

Application.ScreenUpdating = True 

MsgBox "Completed" & vbCrLf & "Initial Rows:" & InitCount & vbcrlf _ 
    & "Deduplicated " & InitCount - AfterDups & vbCrLf _ 
    & "Deleted " & AfterDups - AfterDel & vbCrLf _ 
    & "FinalCount " & AfterDel 

End Sub 

としてはBruceWayneが指摘し、それがどのようなシートから動作するように、それはあなたが

+1

ワークシートの変数を設定するためのメモを追加するので、変更があった場合には 'ActiveSheet'を使用しないでください。 – BruceWayne

+0

これは素晴らしいことですが、私が変更した唯一のことは、最良の方法ではないかもしれませんが(それは初心者でも)、フィルタリング後に削除する行がないと、 。 また、理由を特定するために行を区切らずに、間違った列をフィルタリングしていた理由がわかりません。 – Awill

+0

@ BruceWayneこのシートをこのシートの最上部にあるボタンに追加して、ユーザーのために簡略化しました。このシートにユーザーがいるときのみマクロが実行され、この場合には 'ActiveSheet'はうまく使用できますか? – Awill

関連する問題