Hallo zusammen,
und zwar stehe ich gerade vor folgender Aufgabe:
- Ich gleiche Maschinendaten aus einer anderen Datei ab und wenn diese in meiner Liste fehlen werden Daten aus der anderen Liste eingetragen.
Mein Problem ist:
- Er fügt immer wieder auch Maschinen ein, welche schon vorhanden sind. Trotz Abfrage von (If IsError(Application.Match(.Cells(lngZeile, 4), _
wksZiel.Columns(2), 0)) Then) als nur wenn die Seriennummer nicht vorhanden ist aus der Quelle Spalte 4 (D) in das Ziel von da aus wo meine Daten sind Spalte 2 (B)
Anbei der Code mit der Hoffnung um Hilfe:
Spoiler anzeigen
und zwar stehe ich gerade vor folgender Aufgabe:
- Ich gleiche Maschinendaten aus einer anderen Datei ab und wenn diese in meiner Liste fehlen werden Daten aus der anderen Liste eingetragen.
Mein Problem ist:
- Er fügt immer wieder auch Maschinen ein, welche schon vorhanden sind. Trotz Abfrage von (If IsError(Application.Match(.Cells(lngZeile, 4), _
wksZiel.Columns(2), 0)) Then) als nur wenn die Seriennummer nicht vorhanden ist aus der Quelle Spalte 4 (D) in das Ziel von da aus wo meine Daten sind Spalte 2 (B)
Anbei der Code mit der Hoffnung um Hilfe:
Visual Basic-Quellcode
- 'Option Explicit
- Const MZ1 = 11 '1.Zeile in Maschinenliste wahlweise 19 oder 22
- Const MLZ1 = 2 '1.Zeile in MASTER Liste wahlweise 19 oder 22
- Private Sub CommandButton1_Click()
- MitKommentar
- End Sub
- Private Sub MitKommentar()
- 'Als erste deklarieren wir unsere Variablen
- 'Den Zähler i für die aktuelle Zeile
- 'Dim i As Long
- 'Die letzte Zeile
- 'Dim lzML As Long
- 'Variablen um die prozentualen Anteil zu ermitteln
- Dim Prozent As Double
- Dim ProzentAktuell As Double
- Dim ProzentLänge As Double
- 'Berechnung Dauer des Vorgangs
- Dim DaZeit As Date
- DaZeit = Time
- 'Die Berechnung
- Dim i As Integer, j As Integer
- Dim lrOV As Long, lrML As Long
- On Error GoTo Fehler
- 'Fehlermeldungssetzung
- AbgDatei = ThisWorkbook.Sheets("Maschinenliste").Range("G8").Value
- Deliver1 = ThisWorkbook.Sheets("Maschinenliste").Range("G9").Value
- 'Ende
- 'Dim Plan As Workbook: Set Plan = Workbooks("MASTER HTIG PRODUCTION 2022.xlsx")
- Dim Plan As Workbook:
- Set Plan = Workbooks(ThisWorkbook.Sheets("Maschinenliste").Range("G8").Value)
- 'MsgBox Plan.Value
- Dim Liste As Workbook:
- Set Liste = Workbooks("QC Maschinenliste.xlsm")
- 'Dim OVSht As Worksheet: Set OVSht = Plan.Sheets("Overview Machines")
- On Error GoTo Fehler
- Dim OVSht As Worksheet
- Set OVSht = Plan.Worksheets(ThisWorkbook.Sheets("Maschinenliste").Range("G9").Value)
- 'Button deaktivieren
- CommandButton1.Enabled = False
- 'Zu Fehler springen wenn Blatt/Datei Falsch
- On Error GoTo Fehler
- 'Set Wb = Workbooks(AbgDatei)
- 'Set DEL = Wb.Worksheets(Deliver1)
- 'lzDV = DEL.Cells(Rows.Count, 1).End(xlUp).Row
- 'Startzeit in Label schreiben
- Me.Label34.Caption = Time
- 'Andere Label leeren
- Me.Label35.Caption = ""
- Me.Label37.Caption = ""
- Me.Label38.Caption = ""
- 'Statusbar alten Text speichern
- OldTxt = Application.StatusBar
- 'Um das ganze ein wenig zu beschleunigen schalten wir vorübergehend
- 'die Bildschirmaktualisierung aus
- Application.ScreenUpdating = False
- 'Als erstes setzen wir die Variable Prozent auf null
- Prozent = 0
- Dim lngZeile As Long
- 'Dim lngLetzteQuelle As Long
- Dim lngLetzteZiel As Long
- 'Dim wksQuelle As Worksheet
- Dim wksZiel As Worksheet
- 'Set wksQuelle = OVSht ' Quelltabelle, Spalte A
- Set wksZiel = Liste.Sheets("Maschinenliste") ' Zieltabelle, Spalte J
- ' bezogen auf Tabelle1
- With OVSht
- ' letzte belegte Zeile in Spalte J
- lngLetzteQuelle = IIf(IsEmpty(.Cells(.Rows.Count, 1)), _
- .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)
- ' Schleife von 2 bis zur letzten belegten Zeile
- For lngZeile = 2 To lngLetzteQuelle
- ' VERGLEICH laufende Zeile Spalte D Quelltabelle mit Spalte B Zieltabelle
- ' Eintrag nicht gefunden
- If IsError(Application.Match(.Cells(lngZeile, 4), _
- wksZiel.Columns(2), 0)) Then
- ' letzte belegte Zeile in Zieltabelle ermitteln
- lngLetzteZiel = IIf(IsEmpty(wksZiel.Cells(wksZiel.Rows.Count, 1)), _
- wksZiel.Cells(wksZiel.Rows.Count, 1).End(xlUp).Row, wksZiel.Rows.Count)
- ' in erste freie Zeile in Zieltabelle eintragen
- If Trim(.Cells(lngZeile, "P")) = Trim("Yes") Then
- If Trim(.Cells(lngZeile, "I")) = Trim("cif Hamburg") Then
- If Trim(.Cells(lngZeile, "Q")) = "HTIG" Then
- wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3) 'Maschinendaten
- wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4) 'Seriennummer
- wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20) ' Auftragsnummer
- wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18) ' Land
- wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 19) 'Kunde
- wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24) ' Prod Fertig
- wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23) ' Abholtermin
- 'Status setzen
- wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
- wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
- ' ElseIf Trim(.Cells(lngZeile, "Q")) = "HMMI" Then
- ' wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3)
- ' wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4)
- ' wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20)
- ' wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18)
- ' wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 19)
- ' wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24)
- ' wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23)
- '
- ' 'Status setzen
- ' wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
- ' wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
- Else
- wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3)
- wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4)
- wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20)
- wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18)
- wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 17)
- wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24)
- wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23)
- 'Status setzen
- wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
- wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
- End If
- End If
- End If
- End If
- 'Da wir die Exceltabelle und die Userform gleichzeitig bearbeitet werden
- ' müssen wir einen eine Aufgabe in den Arbeitsspeicher auslagern.
- 'Ansonsten sehen wir zur Laufzeit keine Veränderungen an der Progressbar.
- 'Um dies zu realisieren übergeben wir die Ermittlung der Wochentage mit
- '"Do Events" an den Arbeitspeicher.
- DoEvents
- 'Um den aktuellen Fortschritt anzeigen zu können ermitteln wir
- 'als nächstes anhand unseres Zählers und der letzten Zeile den
- 'prozentualen Wert. -1 da wir in der 2. Zeile beginnen.
- ProzentAktuell = (lngZeile - MLZ1) / (lngLetzteQuelle - MLZ1) * 100
- 'Unser Prozentlabel hat eine Länge (width) von 500. Wir teilen
- 'diese durch 100 und multiplizieren das Ergebnis mit den zuvor
- 'ermittelten Fortschritt. Anschließend können wir unsere Elemente
- 'mit diesem Ergebnis exakt positionieren.
- ProzentLänge = 500 / 100 * ProzentAktuell
- 'Nun zeigen wir unserem User den aktuellen Fortschritt
- Prozentanzeige.Caption = Format(ProzentAktuell, "##0") & " %"
- 'Außerdem interessiert dem User die aktuelle Position unserer Tabelle
- Zeile.Caption = "Zeile " & lngZeile & " von " & lngLetzteQuelle & " Zeilen bearbeitet "
- 'Die Breite unseres Fortschrittbalkens wird um die Prozentlänge erhöht.
- Fortschritt.Width = ProzentLänge
- 'Hier zeigen wir das aktuelle Datum sowie den ermittelten Tag
- aktuellesDatum.Caption = .Cells(lngZeile, 1) & "/" & .Cells(lngZeile, 2) & " - " & .Cells(lngZeile, 3)
- 'Die linke Position unserer Prozentanzeige, die "Mitfährt", wird durch die
- 'steigende Breite des Fortschrittbalkens nach links verschoben.
- '-47 da dies die Breite des Labels ist.
- Prozentanzeige.Left = Fortschritt.Width - 47
- 'Abhängig vom prozentualen Fortschritt manipulieren wir nun die Farbe unseres
- 'Fortschrittslabels und ändern die Caption unserer Userform entsprechend.
- Select Case ProzentAktuell
- Case Is > 85
- 'Me.Caption = "Ich bin gleich fertig"
- Fortschritt.BackColor = vbGreen
- Case Is < 50
- 'Me.Caption = "Es dauert noch eine Weile"
- Fortschritt.BackColor = vbRed
- Case Is > 49
- Fortschritt.BackColor = vbYellow
- 'Me.Caption = "Mehr als die Hälfte ist geschafft"
- End Select
- Next lngZeile
- End With
- 'Um unser Ergebnis anzuzeigen schalten wir zuletzt die Bildschirmaktualisierung wieder
- 'ein
- Application.ScreenUpdating = True
- 'MsgBox n & " Maschinen aus der Liste sind in den Produktionshallen."
- 'Endzeit in Label schreiben
- Set Plan = Nothing
- Set Liste = Nothing
- Set wksZiel = Nothing
- Me.Label39.Caption = CDate(Time - DaZeit)
- Me.Label35.Caption = Time
- Application.StatusBar = OldTxt
- 'Ergebnis in Labels schreiben
- Me.Label37.Caption = "Alle fehlenden Maschinen wurden hinzugefügt"
- Me.Label38.Caption = "Viel Spaß beim arbeiten :)"
- 'Button deaktivieren
- CommandButton1.Enabled = True
- Exit Sub
- 'Fehler: MsgBox "Unerwarteter Fehler - Richtige Datei mit richtigem Blatt geöffnet ??"
- Fehler: MsgBox " Datei: " & AbgDatei & " - Blatt: " & Deliver1 & Chr(10) & "Datei geöffnet? und/oder Name richtig geschrieben??" & Chr(10), vbOKOnly, " Fehler bitte prüfen " '& Error()
- CommandButton1.Enabled = True
- End Sub
- Private Sub Image1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
- End Sub
- 'Zentrieren auf beiden Bildschirmen des Fenstern
- Private Sub UserForm_Initialize()
- Dim sngTop As Single, sngLeft As Single
- Me.StartUpPosition = 0
- sngLeft = Application.Left + Application.Width / 2 - Me.Width / 2
- sngTop = Application.Top + Application.Height / 2 - Me.Height / 2
- Me.Left = sngLeft
- Me.Top = sngTop
- Label13 = Date
- Label28 = Time
- End Sub
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „UltraTM“ ()