2017-02-03 9 views
1

VBAを使用してExcelで予定リストを自動化しようとしていますが、Eisenhower matrixを作成しています。タスクリストからアイゼンハワーマトリックスを自動的に作成する

私は次のように私のto-doリストを構築しています

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

私は緊急性とimportancyの両方で私のタスクリストをフィルタリングして、「完了」と表示された行を除外することができています。

私はそれがこのようになりますように、私のマトリックスを作成したい:

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

私はそれが私のフィルター行を選択するように、私のVBAをコーディングする方法がわからない、どのように判断し行列が大きくなり、それに応じて行列が作成されます。

ExcelのVBAでrange.count()プロパティを使用して行の数をカウントしようとしていますが、T2とT4を揃えられません。また、毎回 'task'ヘッダーもコピーします。次のように

私がこれまで持っているコードは次のとおりです。

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の

を更新OPのコードの後に​​編集

+1

を試すことができますどのようなあなたを追加してください。これまで行ったことがあります。また、行を数えようとするならば、 'Range.Rows.Count'を使うべきです! ;) – R3uK

答えて

0

あなたはこの

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 
関連する問題