AW: PQ Abfrage aktualisieren wenn Bedingung erfüllt
14.02.2024 13:58:34
Yal
hallo Christian,
es wird nicht zu vermeiden, dass deine Daten(pl. v. Datum) vorher auf einem Standard gebracht werden müssen.
Mache eine Kopie alle Daten in einer separaten Spalte, und sortiere diese.
Es gibt nur 2 Muster: Monat davor, dann als Text, oder Monat in der Mitte, dann entw. Text oder Zahl.
Nach der Sortierung sind alle nach Muster d-m-y oben, m-d-y unten. Mache eine Trennung dazwischen.
Es kommt eine Umwandlung in "richtige" Datum, die Du dann per Sverweis an der richtigen Stelle wieder reinbringen kannst.
Umwandlung Stufe 1: die Monatstext in Zahl: lege folgende UDF in einem Modul
Function MonatZuZahl(Wert) As String
Dim Erg, L, i, Arr
'achtung: bedeutende führende Leerzeichen!
Const cEnFull = " january february march april may june july august september october november december"
Const cEnShort = " jan feb mar apr may jun jul aug sep oct nov dec"
Const cDeFull = " januar februar märz april mai juni juli august september oktober november dezember"
Const CDeShort = " jan feb mrz apr mai jun jul aug sep okt nov dez"
Erg = LCase(Wert)
For Each L In Array(cEnFull, cDeFull, cEnShort, CDeShort) 'Reihenfolge ist relevant
Arr = Split(L)
For i = 1 To 12
If InStr(1, Erg, Arr(i), vbTextCompare) Then Erg = Replace(Erg, Arr(i), i)
Next
Next
MonatZuZahl = Erg
End Function
Dann setze diese Funktion in das Excelblatt neben den sortierten Daten.
Dann werden die Daten geparsed. Neue UDF:
Function DateParse(ByVal DatString As String, Optional Lexer As String = "DMY") As Date
Dim R, S
Set R = CreateObject("VBScript.RegExp")
R.Pattern = "(\d+)\D+(\d+)\D+(\d+)"
Set S = R.Execute(DatString)
DateParse = DateSerial( _
CInt(S(0).SubMatches(InStr(1, Lexer, "Y", 1) - 1)), _
CInt(S(0).SubMatches(InStr(1, Lexer, "M", 1) - 1)), _
CInt(S(0).SubMatches(InStr(1, Lexer, "D", 1) - 1)))
End Function
Hier musst Du achten, dass auf einmal
=DateParse(A1; "dmy")
für d-m-y Datumsmuster (oben) und
=DateParse(A1; "mdy")
für d-m-y Datumsmuster (unten) zu verwenden ist.
Dann hast Du Zahlen, die durch Zahlenformat als Datum darstellen lässt. jetzt wie gesagt: sverweis und kopieren-durch Wert ersetzen.
Jetzt musst du nur noch achten, dass ein richtige Datum eingegeben wird, und eine Ereignisprozedure, die das ListObject (VBA für Tabelle) aktualisiert.
Würde ich aber nicht machen. Lieber Strg+Alt+F5 drücken: es aktualisiert alle Tabellen und Pivot.
Aber wenn schon, sieht es so aus:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then If CDate(Target.Value) (Date - 10957) Then Worksheets("Liste").ListObjects("Tabelle1_1").QueryTable.Refresh BackgroundQuery:=False
End Sub
10957 sind 30 * 365,25
VG
Yal