2017-09-08 6 views
0
Sub Projektlaufzeit() 

Dim Datum1 As Date, msg As String 
Dim Datum2 As Date 
Dim Rest As Long 
Dim Projektname As String 
Dim i As Integer 
Dim c As Integer 
Dim ber As Range 


Projektname = Range("A2") 
Datum1 = Date 
'Datum2 = Tabelle1.Range("C2") 


c = Sheets("tabelle1").UsedRange.SpecialCells(xlCellTypeLastCell).Column 

For i = 2 To c 

Projektname = Cells(i, 1) 
Datum2 = Cells(i, 3) 
Rest = DateDiff("d", Datum1, Datum2) 


    If Rest > 7 And Rest < 30 Then MsgBox "something" 
    If Rest >= 0 And Rest <= 7 Then MsgBox "something" 
    If Rest <= 0 Then MsgBox "something" 

Next i 


Dim FilterArray 
Dim List As Range 
Set List = ActiveSheet.Range("A:A") 

List.AutoFilter 
FilterArray = Array(Projektname) 

List.AutoFilter Field:=1, Criteria1:=Array(FilterArray) 


End Sub 

これまでのところ私のコードです。私はあるプロジェクトがいつ終わるかを教えてくれるLoopを持っています。それはこれまでのところ動作します。 次のステップは、残りの継続時間が<で30日のすべてのプロジェクトをマクロが自動フィルタすることです。Excel VBA、ループからの出力を持つオートフィルタ

私のコードで明らかにループの影響を受けた最後のプロジェクトだけがフィルタリングされます。影響を受けるすべてのプロジェクトで配列を作成することは可能ですか? Excelワークシートのスクリーンショットを添付しました。 ありがとうございます。 Worksheet

+1

は、あなたが 'true'のか、これを算出し、「ヘルパー」列を使用することができます。

Dim List As Range Set List = ActiveSheet.Range("A:A") List.AutoFilter List.AutoFilter field:=1, Criteria1:=Array(varProjects), Operator:=xlFilterValues 

これは次のように、それがどのように見えるべきかであります'FALSE'という結果が出てフィルタはシンプルになりますか? –

+0

が可能でなければなりません。しかし、助けてもらえますか? – StB

答えて

0

あなたはすべてのあなたの日付は数字であり、あなたのターゲットは は、いくつかの条件に対応する、列Aの値の配列を作成することであることを想像した場合、これは可能な入力である:

enter image description here

以下のコードでは、条件は次のように変換されます。 残存期間が2日以下で、今日の日付で終了していないプロジェクト。

Option Explicit 

Sub ProjectTime() 

    Dim lngDateToday   As Long 
    Dim lngRemainingDuration As Long 
    Dim lngLastRow    As Long 
    Dim lngCounter    As Long 
    Dim varProjects()   As Variant 
    Dim blnFirst    As Boolean 

    blnFirst = True 
    lngDateToday = Range("D2") 
    lngRemainingDuration = Range("E2") 
    lngLastRow = 13 
    ReDim varProjects(0) 

    For lngCounter = 2 To lngLastRow 
     If Cells(lngCounter, 3) < (lngDateToday + lngRemainingDuration) And _ 
           Cells(lngCounter, 3) >= lngDateToday Then 

      If Not blnFirst Then 
       ReDim Preserve varProjects(UBound(varProjects) + 1) 
      End If 
      blnFirst = False 
      varProjects(UBound(varProjects)) = Cells(lngCounter, 1) 
     End If 

    Next lngCounter 

    For lngCounter = LBound(varProjects) To UBound(varProjects) 
     Debug.Print varProjects(lngCounter) 
    Next lngCounter 

End Sub 

したがって、Eを投影、G及びI(強調表示)が一致した一つであり、値の配列に加えました。コレクションを使用するのではなく、配列を使用する限り、私はすべてのステップ(最初のものを除いて)をリダイレクトして保存しています。

アレイをフィルタリングするには、配列にパラメータとしてフィルタを追加する必要があります。コードの末尾に以下を追加:

enter image description here

+0

私はソートの仕方を理解していませんか? – StB

+0

@StB - ソートではなく、フィルタリングを意味します。編集を参照してください。 – Vityata

+0

はい、私はフィルタリングを意味しました。ただし、残存期間がpostiveのもののみをフィルタリングします。プロジェクトが「-600日後に終了する」とは、600日前に終了したことを意味します。 – StB

関連する問題