2012-03-26 10 views
0

wir haben eine interessante Formel, um herauszufinden.Suche nach Kriterien im benannten Bereich, dann verketten Ergebnisse

Zuerst zählen wir Folgendes, wobei MYDATE zwischen den beiden Daten liegen muss. REGISTER.DT und EXIT.DT werden beide als Bereiche A: A und B: B bezeichnet, MYDATE ist ein benannter Bereich, der auf C1 zeigt.

= SUMPRODUCT (- (REGISTER.DT < = MyDate) * (EXIT.DT> = MyDate))

und ein weiteres Beispiel, mit mehreren Kriterien (manchmal bis zu 5 Kriterien)

= SOMPRODUCT (- (AANM.DT> = DT.START) (AANM.DT < = DT.EIND) (TYPE.TXT = I8))

Jetzt für die Frage. Die oben formule Wert 2 (so findet es zwei Termine)

Wir kommen nun finden möchten und zeigen diese Daten in einer verketteten Zeichenfolge

Ich habe mit einer VBA-Funktion StringConcat wurde das Hantieren, die ich online gefunden, aber ich doesnt Überspringt Nullen (konvertiert alle in eine Zeichenkette), versteht aber auch benannte Bereiche.

Wer hat einen Hinweis? oder eine Matrixfunktionssuche, die funktionieren könnte?

vielen Dank

Antwort

3

Hier ist eine benutzerdefinierte Funktion, die auf Ihrem Entwurf basiert arbeiten. Geben Sie zwei übereinstimmende Arrays in die ersten beiden Parameter ein, dann das Schlüsseldatum in das dritte. Sie finden die Liste der REGISTER Daten zurück, die den Anfang des Bereichs (n) halten diesen Stichtag markieren:

Option Explicit 

Function DateCAT(RegisterRng As Range, ExitRng As Range, MyDt As Date) As String 
Dim DtARR As Variant, D As Long 

If RegisterRng.Cells.Count <> ExitRng.Cells.Count Then 
    DateCAT = "date ranges do not match" 
    Exit Function 
End If 

DtARR = Union(RegisterRng, ExitRng) 

For D = LBound(DtARR) To UBound(DtARR) 
    If DtARR(D, 1) <= MyDt And DtARR(D, 2) >= MyDt Then 
     DateCAT = DateCAT & ", " & DtARR(D, 1) 
    End If 
Next D 

If DateCAT = "" Then 
    DateCAT = "none" 
Else 
    DateCAT = Mid(DateCAT, 3, Len(DateCAT)) 
End If 

End Function 

= DATECAT (REGISTER.DT, EXIT.DT, MyDate)

enter image description here

Übrigens sind die Formeln für REGISTER.DT und EXIT.DT dynamisch.

= OFFSET (Sheet1 $ A $ 1 ,,, COUNTA (Sheet1 $ A +! $ A))!

= OFFSET (Sheet1 $ B $ 1 ,,, COUNTA (Sheet1 $ B: $ B),)

============================ Diese Version ist wie COUNTIFS(), Sie Setzen Sie den Bereich, von dem zuerst zurückgekehrt werden soll, und listen Sie dann Wertepaare auf ... einen Bereich, dann einen Test für diesen Bereich, dann einen weiteren optionalen Bereich und einen Test, bis zu insgesamt 5.

= DATECAT (Werte, TstRng1, Test1, OptTstRng2, OptTest2, OptTstRng3, OptTest3)

Option Explicit 

Function DateCAT(RegisterRng As Range, RNG1 As Range, TST1 As String, _ 
    Optional RNG2 As Range, Optional TST2 As String, _ 
    Optional RNG3 As Range, Optional TST3 As String, _ 
    Optional RNG4 As Range, Optional TST4 As String, _ 
    Optional RNG5 As Range, Optional TST5 As String) As String 

Dim D As Long, Bad As Boolean, i As Long 

D = RegisterRng.Cells.Count 

If RNG1.Cells.Count <> D Then Bad = True 
If Not RNG2 Is Nothing Then If RNG2.Cells.Count <> D Then Bad = True 
If Not RNG3 Is Nothing Then If RNG3.Cells.Count <> D Then Bad = True 
If Not RNG4 Is Nothing Then If RNG4.Cells.Count <> D Then Bad = True 
If Not RNG5 Is Nothing Then If RNG5.Cells.Count <> D Then Bad = True 

If Bad Then 
    DateCAT = "data ranges do not match" 
    Exit Function 
End If 

For i = 1 To RNG1.Cells.Count 
    If WorksheetFunction.CountIf(RNG1.Cells(i), TST1) = 0 Then Bad = True 

    If Not RNG2 Is Nothing Then If WorksheetFunction.CountIf(RNG2.Cells(i), TST2) = 0 Then Bad = True 
    If Not RNG3 Is Nothing Then If WorksheetFunction.CountIf(RNG3.Cells(i), TST3) = 0 Then Bad = True 
    If Not RNG4 Is Nothing Then If WorksheetFunction.CountIf(RNG4.Cells(i), TST4) = 0 Then Bad = True 
    If Not RNG5 Is Nothing Then If WorksheetFunction.CountIf(RNG5.Cells(i), TST5) = 0 Then Bad = True 

    If Not Bad Then DateCAT = DateCAT & ", " & RegisterRng.Cells(i).Value 
    Bad = False 
Next i 

If DateCAT = "" Then 
    DateCAT = "none" 
Else 
    DateCAT = Mid(DateCAT, 3, Len(DateCAT)) 
End If 

End Function 

Wichtig: Wenn auf einem benannten Bereich (eine Zelle, mit 1-Wert) Überprüfung müssen Sie eingeben TST1 etc als operater & benannten Bereich: ">"&MYCELL

enter image description here

+0

Dank Jerry. Und das ist bereits vry hilfreich ... ABER was würden wir tun, wenn wir mehrere Variablen haben, um zu überprüfen, einschließlich Daten und Nicht-Daten, und größer als usw. Unsere vollständigen Formeln (zum Zählen sind:> = SOMPRODUCT (- (AANM.DT> = DT.START) * (AANM.DT <= DT.EIND) * (TYPE.TXT = I8)) UND> = SOMPRODUCT (- (AANM.DT> = DT.START) * (AANM. DT <= DT.EIND) * (- (TRIAGE.DT> = DT.START) * (TRIAGE.DT <= DT.EIND))) –

+0

Ich habe festgestellt, dass das Problem in der Array-Formel liegt, die die genannten Bereiche nicht genießt Wie kann ich nun eine einfache Funktion erstellen, die einen benannten Bereich in eine Matrixformel wie –

+0

aktualisiert? Dann kann ich P() um alle benannten Bereiche setzen und fortfahren (vorausgesetzt P ist die Funktion zum Umwandeln des benannten Bereichs) –

Verwandte Themen