2017-02-03 8 views
1

Ich versuche meine To-Do-Liste in Excel zu automatisieren, indem ich VBA verwende, um eine Eisenhower matrix zu erstellen.Automatisch eine Eisenhower-Matrix aus einer Aufgabenliste erstellen

Ich habe meine To-do-Liste in der folgenden Weise aufgebaut:

Task | Urgent | Important | done 
T1 | x | x  | 
T2 |  | x  | 
T3 | x |   | 
T4 |  |   | 

Ich bin in der Lage sowohl meine Aufgabenliste zu filtern, auf die Dringlichkeit und importancy, und schließen Sie die Zeilen, die als „erledigt“ gekennzeichnet sind.

ich meine Matrix in einer solchen Art und Weise erstellt werden soll, dass es wie folgt aussieht:

__________|IMPORTANT|NOT IMPORTANT 
URGENT | T1 |  T3 
----------|---------|-------------- 
NOT URGENT| T2 |  T4 

Ich weiß nicht, wie so meine VBA codieren, dass es meine gefilterten Zeilen auswählt, bestimmt, wie groß ist die Matrix und füllt sie entsprechend auf.

Ich versuche, die Anzahl der Zeilen mit der Eigenschaft range.count() in Excel VBA zu zählen, aber ich kann nicht T2 und T4 ausgerichtet bekommen. Außerdem kopiert es jedes Mal den Kopf der Aufgabe.

Der Code, den ich bisher habe, ist wie folgt:

Sub populate_matrix() 
Dim i As Integer 

ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=5, Criteria1:="=" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=2, Criteria1:="<>" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=3, Criteria1:="<>" 

Range("A1").Select 
Range(Selection, Selection.End(xlDown)).Select 
i = Range(Selection).Count 
Selection.Copy 
Sheets("work matrix").Select 
Range("B2").Select 
ActiveSheet.Paste 

Sheets("tasks").Select 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=5, Criteria1:="=" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=2, Criteria1:="<>" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=3, Criteria1:="=" 

Range("A1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Sheets("work matrix").Select 
Range("B" & i).Select 
ActiveSheet.Paste 

Sheets("tasks").Select 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=5, Criteria1:="=" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=2, Criteria1:="<>" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=3, Criteria1:="=" 

Range("A1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Sheets("work matrix").Select 
Range("c2").Select 
ActiveSheet.Paste 

Sheets("tasks").Select 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=5, Criteria1:="=" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=2, Criteria1:="=" 
ActiveSheet.Range("$A$1:$E$55").AutoFilter Field:=3, Criteria1:="=" 

Range("A1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Sheets("work matrix").Select 
Range("C" & i).Select 
ActiveSheet.Paste 

End Sub

+1

Bitte fügen Sie, was Sie bin bis jetzt gemacht. Und Sie sollten "Range.Rows.Count" verwenden, wenn Sie versuchen, Zeilen zu zählen! ;) – R3uK

Antwort

0

nach der OP-Code

Aktualisierung bearbeitet haben, können Sie versuchen, diese

Option Explicit 

Sub main2() 
    Dim EisenTable As Range 

    Set EisenTable = Worksheets("work matrix").Range("B2:C3") 
    With Worksheets("tasks") 
     With .Range("D1", .Cells(.Rows.Count, "A").End(xlUp)) 
      EisenTable.Cells(1, 1) = CountX(.Cells, 2, 3, "x", "x") 
      EisenTable.Cells(1, 2) = CountX(.Cells, 2, 3, "x", "<>x") 
      EisenTable.Cells(2, 1) = CountX(.Cells, 2, 3, "<>x", "x") 
      EisenTable.Cells(2, 2) = CountX(.Cells, 2, 3, "<>x", "<>x") 
     End With 
    End With 
End Sub 

Function CountX(rng As Range, col1 As Long, col2 As Long, crit1 As String, crit2 As String) As String 
    Dim cell As Range 
    Dim iVal As Long 

    With rng 
     .AutoFilter Field:=col1, Criteria1:=crit1 
     .AutoFilter Field:=col2, Criteria1:=crit2 
     If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then 
      With .Resize(.Rows.Count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible) 
       ReDim vals(1 To .Count) As String 
       For Each cell In .Cells 
        iVal = iVal + 1 
        vals(iVal) = cell.Value 
       Next 
      End With 
      CountX = Join(vals, ",") 
     End If 
     .Parent.AutoFilterMode = False 
    End With 
End Function 
Verwandte Themen