Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datenabgleich unter VBA mit dopp. Werten

Datenabgleich unter VBA mit dopp. Werten
05.06.2019 15:24:20
Georg
Liebe Mitglieder, folgende Datei:
https://www.herber.de/bbs/user/130218.xlsx
Der Code funktioniert prima auch dank eurer Hilfe. Es gibt allerdings eine Hürde, die ich nicht hinkriege: relevant ab dem Teil With TB1
Im Blatt Zeiten wird abgefragt, wenn zu einem Datum (Zeile 1) die Zelle mit Wahr zu einem bestimmten Standort steht, dann prüf, ob der Standort als Datensatz mit diesem Datum im Blatt "Daten" vorhanden, wenn nicht gib die Info im Blatt Fehlzeiten aus.
Es ist allerdings so, dass an Samstagen, Sonntagen das Datum zweimal erscheint und WENN 2x wahr für dieses Datum angegeben ist, müssen im Blatt Daten auch ZWEI Datensätze vorhanden sein.
Leider deckt der Code dies nicht ab, da er ja das (erste) Datum findet und somit scheinbar alles in Ordnung ist.
Als Beispiel ist Standort 1 angegeben und als Datum 13.04 (alle relevanten Zellen sind gelb markiert).
Wie schaff ich es, dass bei 2x WAHR mit einem Datum überprüft werden kann, dass dann zwei Datensätze vorhanden sein müssen (wenn nicht wie oben: Ausgabe in Fehlzeiten)
Vielen Dank!!!
Sub TeilB()
'Fehlende Zeiten im Blatt Daten werden ermittelt
Dim TB1, TB2, TB3, Z1 As Integer, S1 As Integer, LR As Long, LC As Integer
Dim i As Long, j As Integer, Sp1 As Integer
Dim FSt2 As Integer, FDat2 As Integer, WF, z As Long
Set TB1 = Sheets("Zeiten") 'wann ist eine Bpx offen
Set TB2 = Sheets("Daten") 'die SQL Daten aus EQlab
Set TB3 = Sheets("Fehlzeiten") 'dahin werden die Fehlzeiten geschrieben.
Set WF = WorksheetFunction
Z1 = 3 'ab Zeile 3
Sp1 = 4 'Standorte stehen in Spalte D
S1 = 6 'Datum ab F
FSt2 = 1 'FindeStandorte in Spalte A
FDat2 = 5 'FindeDatum in Spalte H
LR = TB1.Cells(TB1.Rows.Count, Sp1).End(xlUp).Row 'letzte Zeile der Spalte D
LC = TB1.Cells(1, TB1.Columns.Count).End(xlToLeft).Column 'letzte Spalte einer Zeile 1
'reset
TB3.UsedRange.ClearContents
With TB1
For i = Z1 To LR ' Durchlaufe alle Zeilen in 'Zeiten von Zeile 3 bis L(ast)R(ow):-)'
For j = S1 To LC 'Durchlaufe alle Spalten mit Datum von Spalte H bis L(ast)C(olumn)' _
_
If .Cells(i, j) Then ' Hier wird die WAHR, FALSCH Bedingung geprüft, wenn wahr   _
_
dann
'Zählenwenns()
'wenn Daten 1, Zelle 3 bis Letzte, Spalte F;
If WF.CountIfs(TB2.Columns(FSt2), .Cells(i, Sp1), TB2.Columns(FDat2), . _
Cells(1, j)) = 0 Then
TB3.Cells(z + 1, 1) = .Cells(i, Sp1)
TB3.Cells(z + 1, 2) = format(.Cells(1, j), "DD.MM.YYYY")
z = z + 1
End If
End If
Next j
Next i
End With
TB3.Columns.AutoFit
Dim y As Long
Dim lastRow As Long
lastRow = TB3.Cells(Rows.Count, 1).End(xlUp).Row
'Datum erzeugen
For y = 1 To lastRow
With TB3
.Cells(y, 2) = CDate(.Cells(y, 2))
.Cells(y, 3).Value = .Cells(y, 2).Value
.Cells(y, 3).NumberFormat = "dddd"
End With
Next y
'Überschriften
With TB3
.Rows(1).Insert xlShiftUp
.Cells(1, 1).Value = "BPx Standort"
.Cells(1, 2).Value = "Datum"
.Cells(1, 3).Value = "Wochentag"
End With
MsgBox "Fertig" & vbLf & z & " Termine fehlen"
End Sub

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Solltest du nicht die Mappe...
05.06.2019 16:03:57
Beverly
Hi Georg,
...mit dem Code und allen VBA-relevanten Teilen hochladen?


AW: Datenabgleich unter VBA mit dopp. Werten
05.06.2019 16:55:29
UweD
Hallo
unabhängig vom Problem war ein Vorbelegungsfehler enthalten
FDat2 = 5 'FindeDatum in Spalte H
Muss 8 sein


versuch es mal so.
Sub TeilB()
'Fehlende Zeiten im Blatt Daten werden ermittelt 

    Dim TB1, TB2, TB3, Z1 As Integer, S1 As Integer, LR As Long, LC As Integer
    Dim i As Long, j As Integer, k As Integer, Sp1 As Integer
    Dim FSt2 As Integer, FDat2 As Integer, WF, z As Long, Anz1 As Integer, Anz2 As Integer
    Set TB1 = Sheets("Zeiten") 'wann ist eine Bpx offen 
    Set TB2 = Sheets("Daten") 'die SQL Daten aus EQlab 
    Set TB3 = Sheets("Fehlzeiten") 'dahin werden die Fehlzeiten geschrieben. 
    Set WF = WorksheetFunction
    
    Z1 = 3 'ab Zeile 3 
    Sp1 = 4 'Standorte stehen in Spalte D 
    S1 = 6 'Datum ab F 
    
    FSt2 = 1 'FindeStandorte in Spalte A 
    FDat2 = 8 'FindeDatum in Spalte H 
    
    LR = TB1.Cells(TB1.Rows.Count, Sp1).End(xlUp).Row 'letzte Zeile der Spalte D 
    LC = TB1.Cells(1, TB1.Columns.Count).End(xlToLeft).Column 'letzte Spalte einer Zeile 1 
    
    'reset 
    TB3.UsedRange.ClearContents
    
    With TB1
        For i = Z1 To LR ' Durchlaufe alle Zeilen in 'Zeiten von Zeile 3 bis L(ast)R(ow):-)' 
        
            For j = S1 To LC 'Durchlaufe alle Spalten mit Datum von Spalte H bis L(ast)C(olumn)' 
            
                If .Cells(i, j) Then ' Hier wird die WAHR, FALSCH Bedingung geprüft, wenn wahr dann 
                
                    'Anzahl ermitteln mit Zählenwenns() 
                    Anz1 = WF.CountIfs(.Rows(1), .Cells(1, j), .Rows(3), True)
                    
                    Anz2 = WF.CountIfs(TB2.Columns(FSt2), .Cells(i, Sp1), TB2.Columns(FDat2), .Cells(1, j))
                    
                    If Anz1 <> Anz2 Then
                        For k = 1 To Anz1 - Anz2 'wenn Vorkommen unterschiedlich oft 
                            
                            'Wiederholung berücksichtigen 
                            If WF.CountIfs(TB3.Columns(1), .Cells(i, Sp1), TB3.Columns(2), CStr(.Cells(1, j))) < Anz1 - Anz2 Then
                                
                                TB3.Cells(z + 1, 1) = .Cells(i, Sp1)
                                TB3.Cells(z + 1, 2) = .Cells(1, j)
                            
                                z = z + 1
                            End If
                        Next k
                        
                    End If
                End If
            Next j
        Next i
    End With

    
    With TB3
        .Columns.AutoFit
        
        'Datum formatieren 
        .Columns(2).NumberFormat = "DD.MM.YYYY  DDDD"
        .Columns(2).HorizontalAlignment = xlLeft
            
        'Überschriften 
        .Rows(1).Insert xlShiftUp
        .Cells(1, 1).Value = "BPx Standort"
        .Cells(1, 2).Value = "Datum   Wochentag"
    End With
    
    MsgBox "Fertig" & vbLf & z & " Termine fehlen"

End Sub

In deinem unteren Teil hab ich die Schleife für die Formatierung eliminiert.
LG UweD
Anzeige
AW: Datenabgleich ...ich probier es morgen..
05.06.2019 18:02:45
Georg
..aus vielen Dank erstmal G
AW: Datenabgleich ...noch eine Frage dazu..
06.06.2019 09:05:37
Georg
Hallo Uwe,
die Anpassung ist prima, ich habe eine Beispielsdatei nochmals hochgeladen,
https://www.herber.de/bbs/user/130237.xlsx
Sie wurde aus Originaldaten erstellt, im Umfang aber auf einen Standort reduziert.
Was aufffällt - und hier setzt meine Frage an - z. B. am 22.04 ist im Blatt "Zeiten" für dieses Datum zweimal ein WAHR ausgewiesen, für das Datum 22.04 ist im Blatt "Daten" nur ein Datensatz vorhanden. Der Code erkennt dies korrekterweise, schreibt aber in "Fehlzeiten" diesen fehlenden Datensatz zweimal rein.
Ist es möglich, dass bei einer Doppelung des Datums mit jeweils WAHR
a) wenn nur ein Datensatz vorhanden, einer fehlt ---> nur ein Datensatz in Fehlzeiten ausgewiesen wird
b) wenn beide Datensätze fehlen, auch beide in Fehlzeiten reingeschrieben werden.
Punkt a) wäre prima, da die Datei i.d. R mehrere 1000 Datensätze hat, so dass viel manuelle Nachbearbeitung erforderlich wäre, Punkt b) nice to have - aber es langt bei b) auch wenn der nur 1x geschrieben wird.
Vielen Dank.!!!!
Hier der Code nochmals für die Beispielsdatei:
Sub TeilB()
'Fehlende Zeiten im Blatt Daten werden ermittelt
Dim TB1, TB2, TB3, Z1 As Integer, S1 As Integer, LR As Long, LC As Integer
Dim i As Long, j As Integer, k As Integer, Sp1 As Integer
Dim FSt2 As Integer, FDat2 As Integer, WF, z As Long, Anz1 As Integer, Anz2 As Integer
Set TB1 = Sheets("Zeiten") 'wann ist eine Bpx offen
Set TB2 = Sheets("Daten") 'die SQL Daten aus EQlab
Set TB3 = Sheets("Fehlzeiten") 'dahin werden die Fehlzeiten geschrieben.
Set WF = WorksheetFunction
Z1 = 3 'ab Zeile 3
Sp1 = 4 'Standorte stehen in Spalte D
S1 = 6 'Datum ab F
FSt2 = 1 'FindeStandorte in Spalte A
FDat2 = 5 'FindeDatum in Spalte E
LR = TB1.Cells(TB1.Rows.Count, Sp1).End(xlUp).Row 'letzte Zeile der Spalte D
LC = TB1.Cells(1, TB1.Columns.Count).End(xlToLeft).Column 'letzte Spalte einer Zeile 1
'reset
TB3.UsedRange.ClearContents
With TB1
For i = Z1 To LR ' Durchlaufe alle Zeilen in 'Zeiten von Zeile 3 bis L(ast)R(ow):-)'
For j = S1 To LC 'Durchlaufe alle Spalten mit Datum von Spalte F bis L(ast)C(olumn)' _
If .Cells(i, j) Then ' Hier wird die WAHR, FALSCH Bedingung geprüft, wenn wahr  _
dann
'----------------------------------------------------------------------------------------------- _
'Anzahl ermitteln mit Zählenwenns()
'Kriterienbereich = Blatt "ZEITEN" Reihe 1, Zähle wenn Zeile 1 und Reihe 3   _
wahr
'ergibt für Agatharied: 40
Anz1 = WF.CountIfs(.Rows(1), .Cells(1, j), .Rows(3), True)
'----------------------------------------------------------------------------------------------- _
'Blatt "DATEN" Kriterienbereich 1 die Standorte stehen in ("A"), --> Blatt " _
ZEITEN" Kriterium 1 Standort aus Spalte D
'Blatt "DATEN" Kriterienbereich  2 die Datumswerte stehen in ("E"), -->  _
Blatt "ZEITEN Kriterium 2 Datum aus Reihe 1 ab Spalte F
'wenn im "Blatt DATEN" ein Datum fehlt, ergibt sich logischerweise eine  _
Differez
'für Agatharied = 34
Anz2 = WF.CountIfs(TB2.Columns(FSt2), .Cells(i, Sp1), TB2.Columns(FDat2) _
, .Cells(1, j))
'----------------------------------------------------------------------------------------------- _
If Anz1  Anz2 Then
For k = 1 To Anz1 - Anz2 'wenn Vorkommen unterschiedlich oft
'Wiederholung berücksichtigen
If WF.CountIfs(TB3.Columns(1), .Cells(i, Sp1), TB3.Columns(2), CStr( _
.Cells(1, j))) 

Anzeige
AW: Datenabgleich ...noch eine Frage dazu..
06.06.2019 11:35:12
UweD
Hallo
Zu deinen eingetragenen Kommentaren
ergibt für Agatharied: 40
...
'für Agatharied = 34

so einfach bin ich da nicht vorgegangen.
Ermittelt wird NICHT die Anzahl der 'WAHR' Eintäge insgesamt für den Standort, sondern
für das jeweilige Datum
a) und b) erledigt
Option Explicit
Sub TeilB()
'Fehlende Zeiten im Blatt Daten werden ermittelt 

    Dim TB1, TB2, TB3, Z1 As Integer, S1 As Integer, LR As Long, LC As Integer
    Dim i As Long, j As Integer, k As Integer, Sp1 As Integer
    Dim FSt2 As Integer, FDat2 As Integer, WF, z As Long, Anz1 As Integer, Anz2 As Integer, Anz3 As Integer
    Set TB1 = Sheets("Zeiten") 'wann ist eine Bpx offen 
    Set TB2 = Sheets("Daten") 'die SQL Daten aus EQlab 
    Set TB3 = Sheets("Fehlzeiten") 'dahin werden die Fehlzeiten geschrieben. 
    Set WF = WorksheetFunction
    
    Z1 = 3 'ab Zeile 3 
    Sp1 = 4 'Standorte stehen in Spalte D 
    S1 = 6 'Datum ab F 
    
    FSt2 = 1 'FindeStandorte in Spalte A 
    FDat2 = 5 'FindeDatum in Spalte E 
    
    LR = TB1.Cells(TB1.Rows.Count, Sp1).End(xlUp).Row 'letzte Zeile der Spalte D 
    LC = TB1.Cells(1, TB1.Columns.Count).End(xlToLeft).Column 'letzte Spalte einer Zeile 1 
    
    Application.ScreenUpdating = False
    
    'reset 
    TB3.UsedRange.ClearContents
    
    With TB1
        For i = Z1 To LR ' Durchlaufe alle Zeilen in 'Zeiten von Zeile 3 bis L(ast)R(ow):-)' 
        
            For j = S1 To LC 'Durchlaufe alle Spalten mit Datum von Spalte F bis L(ast)C(olumn)' 

                If .Cells(i, j) Then ' Hier wird die WAHR, FALSCH Bedingung geprüft, wenn wahr dann 

'---------------------------------------- 
                
                    'Anzahl ermitteln mit Zählenwenns() 
                    'Kriterienbereich = Blatt "ZEITEN" Reihe 1, Zähle für jedes Datum in Zeile 1 und Reihe 3 wahr 
                    'ergibt für Agatharied: 1 **** nicht 40 
                    
                    Anz1 = WF.CountIfs(.Rows(1), .Cells(1, j), .Rows(3), True)
'---------------------------------------- 
                    
                    'Blatt "DATEN" Kriterienbereich 1 die Standorte stehen in ("A"), 
                        '--> Blatt " ZEITEN " Kriterium 1 Standort aus Spalte D" 
                    'Blatt "DATEN" Kriterienbereich 2 die Datumswerte stehen in ("E"), 
                        '--> Blatt "ZEITEN Kriterium 2 Datum aus Reihe 1 ab Spalte F" 
                    'wenn im "Blatt DATEN" ein Datum fehlt, ergibt sich logischerweise eine Differez 
                    'für Agatharied = s.o. 
                        
                    Anz2 = WF.CountIfs(TB2.Columns(FSt2), .Cells(i, Sp1), TB2.Columns(FDat2), .Cells(1, j))
'---------------------------------------- 

                    If Anz1 <> Anz2 Then
                        For k = 1 To Anz1 - Anz2 'wenn Vorkommen unterschiedlich oft 
                            
                            'Anzahl in Fehlzeiten berücksichtigen 
                            Anz3 = WF.CountIfs(TB3.Columns(1), .Cells(i, Sp1), TB3.Columns(2), .Cells(1, j))
                            
                            If Anz1 <> Anz2 + Anz3 Then
                                
                                TB3.Cells(z + 1, 1) = .Cells(i, Sp1)
                                TB3.Cells(z + 1, 2) = .Cells(1, j)
                            
                                z = z + 1
                            End If
                        Next k
                        
                    End If
                End If
            Next j
        Next i
    End With

    
    With TB3
        .Columns.AutoFit
        
        'Datum formatieren 
        .Columns(2).NumberFormat = "DD.MM.YYYY  DDDD"
        .Columns(2).HorizontalAlignment = xlLeft
            
        'Überschriften 
        .Rows(1).Insert xlShiftUp
        .Cells(1, 1).Value = "BPx Standort"
        .Cells(1, 2).Value = "Datum   Wochentag"
    End With
    
    MsgBox "Fertig" & vbLf & z & " Termine fehlen"

End Sub

LG UweD
Anzeige
AW: Datenabgleich ...Super!! Ich hätte...
06.06.2019 12:04:03
Georg
..es allein nie hingekriegt, lieber Uwe. Ich habe versucht den Code zu verstehen, aber es gelingt mir nur halb, dafür sind meine VBA Kenntnisse doch zu wenig. Also ich KANN NUR SAGEN DANKE!!!!
gern geschehen owT
06.06.2019 12:28:45
UweD

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige