2016-07-18 4 views
0

Ich habe ein Makro, um bestimmte unerwünschte Daten aus meiner Tabs Tabellendaten zu entfernen. Ich bin ein großer Amateur mit VBA, also bin ich mir sicher, dass mein Makro wahrscheinlich besser sein könnte, aber zuerst entfernt es Duplikate basierend auf 3 Kriterien aus der Tabelle, als nächstes filtert es 3 Spalten und löscht jede Datenzeile basierend auf besagten Filtern, löscht Alle Filter und fordert ein abgeschlossenes Meldungsfeld auf, sobald das Makro beendet ist.Nachrichtenbox, die Aufgaben am Ende des Makros zurückgibt?

Gibt es eine Möglichkeit, dem Meldungsfeld hinzuzufügen oder ein Benutzerformular zu erstellen, das die ausgeführten Aktionen zurückgibt (Anzahl der Duplikate entfernt, # Zeilen gelöscht usw.)?

Ich weiß, wenn Sie nur die Funktion zum Entfernen von Duplikaten aus der Registerkarte Daten verwenden, wird es benachrichtigt, wie viele wurden entfernt und wie viele Zeilen bleiben.

Hier ist mein Newbie-Skript;

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 

Vielen Dank im Voraus!

+1

läuft Kurz notiert, ich empfehle dringend [vermeiden mit '. Select '] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) - es wird dazu beitragen, zu verhindern Kopfschmerzen und unerwartetes Verhalten. – BruceWayne

+0

Danke für den Tipp, was ist meine Alternative, .activate? In welche Art von Problem könnte ich geraten, wenn ich mit dem Makro fortfahre? Entschuldigung, wenn das dumme Fragen sind, aber ich schätze jede Hilfe, die Sie Zeit haben zu geben! – Awill

Antwort

1

Wie es aussieht, ther sind zu viele SELECT s, und der Code wird die erforderlichen Kriterien nicht gelöscht werden, wenn sie in der ersten Reihe tritt

Sie auch Option Explicit fehlen - dies mit vielen Kopfschmerzen in der Zukunft lindern

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 

Wie von BruceWayne, könnte es eine kleine Herausforderung für Sie die ActiveSheet auf eine Variable zu ändern, so dass es aus arbeiten, was auch immer Blatt, das Sie den Code aus

+1

Ich würde auch eine Notiz hinzufügen, um eine Variable für das Arbeitsblatt einzurichten, so dass Sie 'ActiveSheet' nicht verwenden, falls sich das ändert. – BruceWayne

+0

Das ist ein fantastisches Dankeschön, das einzige, was ich geändert habe, was vielleicht nicht der beste Weg ist (aber wieder Neuling) war der Löschbefehl zurück zu dem Format, das ich hatte, als es einen Fehler gab, wenn nach dem Filtern keine Zeilen gelöscht werden mussten . Auch ich bin mir nicht sicher, warum, aber ohne die Zeilen für die Filterung der Kriterien zu trennen, wurde die falsche Spalte gefiltert. – Awill

+0

@BruceWayne Ich habe dieses Makro zu einer Schaltfläche am Anfang dieses Arbeitsblatts hinzugefügt, um es für die Benutzer zu vereinfachen. Wenn das Makro nur ausgeführt wird, wenn sich der Benutzer gerade auf diesem Blatt befindet, ist 'ActiveSheet' in Ordnung? – Awill

Verwandte Themen