2016-07-25 8 views
0

Ich habe ein einfaches Makro erstellt, um Daten zu filtern und zu einem bestimmten Blatt [ISRisks] nach der letzten Zeile hinzuzufügen. Mir ist jedoch klar, dass ich nicht sicher bin, wie überprüft werden kann, ob die Daten bereits im [ISRisks] -Blatt vorhanden sind! Bitte könnte jemand helfen - Spalte a in [ISRisks] enthält das einzigartige RISKID-Feld zur Überprüfung. Das ist, was ich habe, so weit:Kopieren von Daten in ein neues Blatt nur, wenn keine Daten mit einem Makro vorhanden sind

Sub ISRISKCOPY() 
     ' 
     Dim lMaxRows As Long 
     Dim ws As Worksheet 
     Dim rng As Range 
     Dim LR As Long 
     Dim rTable As Range 

    For Each ws In ActiveWorkbook.Worksheets 
       If (ws.Name <> "ISRisks") And (ws.Name <> "Closed Risks") And (ws.Name <> "Risk Grading Matrix ") And (ws.Name <> "Sheet1") And (ws.Name <> "Sheet2") Then 
      Application.DisplayAlerts = False 

      With ws 

      If .FilterMode Then .AutoFilterMode = False 
      Sheets(ws.Name).Range("$A$2:$W$2").AutoFilter Field:=5, Criteria1:=Array("IS", "IS - Information Security"), Operator:=xlFilterValues 
      Set rTable = Sheets(ws.Name).AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible) 
      rTable.Copy 
      lMaxRows = Sheets("ISRisks").Cells(Rows.Count, "a").End(xlUp).Row 

      Range("a" & lMaxRows + 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

      End With 

      Else 
       End If 

      Next ws 

      'sorting unique id column 
      Sheets("ISRisks").Range("A1").Select 
      ActiveWorkbook.Worksheets("ISRisks").Sort.SortFields.Clear 
      ActiveWorkbook.Worksheets("ISRisks").Sort.SortFields.Add Key:=Range("A1"), _ 
      SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
      With ActiveWorkbook.Worksheets("ISRisks").Sort 
      .SetRange Range("A2:A10000") 
      .Header = xlNo 

.MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

Application.DisplayAlerts = True 
    End Sub 
+0

Sie gefunden Sie überprüfen möchten, ob es * keine * Daten gibt oder bestimmte Daten? Außerdem schlage ich *** *** vor, durchzulesen und anzuwenden, [wie man die Verwendung von '.Select' /' .Activate' vermeidet (https://stackoverflow.com/questions/10714251/how-to-avoid) -using-select-in-excel-vba-macros) – BruceWayne

+0

Hallo @BruceWayne - danke, ich bin nicht so vertraut mit VBA, aber werde das berücksichtigen. Sehr geschätzt – AJCT

+0

Sie können 'Range (" A3 ") ersetzen. Wählen Sie Range (Auswahl, Selection.End (xlToRight)). Wählen Sie Range (Auswahl, Selection.End (xlDown)). Wählen Sie Selection.Copy' mit diesem Zeile, um dasselbe zu tun, ohne Select zu verwenden - 'Bereich (" A3 ", Zellen (Bereich (" A3 "). Ende (xlDown) .Row, Bereich (" A3 "). Ende (xlToRight) .Column)) ' – tjb1

Antwort

0

Sie diesen Code verwenden können, um einen Bereich zu suchen und bestimmen, ob der Wert ist.

With Sheets("Sheet1").Range("A:A") 
    Set Rng = .Find(What:=FindString, _ 
        After:=.Cells(.Cells.Count), _ 
        LookIn:=xlValues, _ 
        LookAt:=xlWhole, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlNext, _ 
        MatchCase:=False) 
    If Not Rng Is Nothing Then 
     'Do This If Found 
    Else 
     'Do This If Not Found 
    End If 
End With 

Sie müssen das Blatt, das Sie verwenden möchten, setzen, den Bereich, den Sie suchen möchten, und ersetzen FindString mit der Variable, die Sie für die Überprüfung sind. In den Abschnitten in der if-Anweisung können Sie Aktionen ausführen, die darauf basieren, ob Sie suchen oder nicht finden (Einfügen, falls nicht gefunden). Das kann auch wiederholt werden, um es zu verkürzen, wenn Sie keine Aktion ausführen müssen, wenn sie gefunden wird.

wurde Das obige Beispiel here.

+0

Danke @ tjb1 - Ich poste meinen endgültigen Code, wenn ich es funktioniere - ich bin sehr dankbar für Ihre Hilfe. – AJCT