Daten aus andere Datei vergleichen und wenn nicht verfügbar in Masterdatei einfügen

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Panter.

    Daten aus andere Datei vergleichen und wenn nicht verfügbar in Masterdatei einfügen

    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

    Visual Basic-Quellcode

    1. 'Option Explicit
    2. Const MZ1 = 11 '1.Zeile in Maschinenliste wahlweise 19 oder 22
    3. Const MLZ1 = 2 '1.Zeile in MASTER Liste wahlweise 19 oder 22
    4. Private Sub CommandButton1_Click()
    5. MitKommentar
    6. End Sub
    7. Private Sub MitKommentar()
    8. 'Als erste deklarieren wir unsere Variablen
    9. 'Den Zähler i für die aktuelle Zeile
    10. 'Dim i As Long
    11. 'Die letzte Zeile
    12. 'Dim lzML As Long
    13. 'Variablen um die prozentualen Anteil zu ermitteln
    14. Dim Prozent As Double
    15. Dim ProzentAktuell As Double
    16. Dim ProzentLänge As Double
    17. 'Berechnung Dauer des Vorgangs
    18. Dim DaZeit As Date
    19. DaZeit = Time
    20. 'Die Berechnung
    21. Dim i As Integer, j As Integer
    22. Dim lrOV As Long, lrML As Long
    23. On Error GoTo Fehler
    24. 'Fehlermeldungssetzung
    25. AbgDatei = ThisWorkbook.Sheets("Maschinenliste").Range("G8").Value
    26. Deliver1 = ThisWorkbook.Sheets("Maschinenliste").Range("G9").Value
    27. 'Ende
    28. 'Dim Plan As Workbook: Set Plan = Workbooks("MASTER HTIG PRODUCTION 2022.xlsx")
    29. Dim Plan As Workbook:
    30. Set Plan = Workbooks(ThisWorkbook.Sheets("Maschinenliste").Range("G8").Value)
    31. 'MsgBox Plan.Value
    32. Dim Liste As Workbook:
    33. Set Liste = Workbooks("QC Maschinenliste.xlsm")
    34. 'Dim OVSht As Worksheet: Set OVSht = Plan.Sheets("Overview Machines")
    35. On Error GoTo Fehler
    36. Dim OVSht As Worksheet
    37. Set OVSht = Plan.Worksheets(ThisWorkbook.Sheets("Maschinenliste").Range("G9").Value)
    38. 'Button deaktivieren
    39. CommandButton1.Enabled = False
    40. 'Zu Fehler springen wenn Blatt/Datei Falsch
    41. On Error GoTo Fehler
    42. 'Set Wb = Workbooks(AbgDatei)
    43. 'Set DEL = Wb.Worksheets(Deliver1)
    44. 'lzDV = DEL.Cells(Rows.Count, 1).End(xlUp).Row
    45. 'Startzeit in Label schreiben
    46. Me.Label34.Caption = Time
    47. 'Andere Label leeren
    48. Me.Label35.Caption = ""
    49. Me.Label37.Caption = ""
    50. Me.Label38.Caption = ""
    51. 'Statusbar alten Text speichern
    52. OldTxt = Application.StatusBar
    53. 'Um das ganze ein wenig zu beschleunigen schalten wir vorübergehend
    54. 'die Bildschirmaktualisierung aus
    55. Application.ScreenUpdating = False
    56. 'Als erstes setzen wir die Variable Prozent auf null
    57. Prozent = 0
    58. Dim lngZeile As Long
    59. 'Dim lngLetzteQuelle As Long
    60. Dim lngLetzteZiel As Long
    61. 'Dim wksQuelle As Worksheet
    62. Dim wksZiel As Worksheet
    63. 'Set wksQuelle = OVSht ' Quelltabelle, Spalte A
    64. Set wksZiel = Liste.Sheets("Maschinenliste") ' Zieltabelle, Spalte J
    65. ' bezogen auf Tabelle1
    66. With OVSht
    67. ' letzte belegte Zeile in Spalte J
    68. lngLetzteQuelle = IIf(IsEmpty(.Cells(.Rows.Count, 1)), _
    69. .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)
    70. ' Schleife von 2 bis zur letzten belegten Zeile
    71. For lngZeile = 2 To lngLetzteQuelle
    72. ' VERGLEICH laufende Zeile Spalte D Quelltabelle mit Spalte B Zieltabelle
    73. ' Eintrag nicht gefunden
    74. If IsError(Application.Match(.Cells(lngZeile, 4), _
    75. wksZiel.Columns(2), 0)) Then
    76. ' letzte belegte Zeile in Zieltabelle ermitteln
    77. lngLetzteZiel = IIf(IsEmpty(wksZiel.Cells(wksZiel.Rows.Count, 1)), _
    78. wksZiel.Cells(wksZiel.Rows.Count, 1).End(xlUp).Row, wksZiel.Rows.Count)
    79. ' in erste freie Zeile in Zieltabelle eintragen
    80. If Trim(.Cells(lngZeile, "P")) = Trim("Yes") Then
    81. If Trim(.Cells(lngZeile, "I")) = Trim("cif Hamburg") Then
    82. If Trim(.Cells(lngZeile, "Q")) = "HTIG" Then
    83. wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3) 'Maschinendaten
    84. wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4) 'Seriennummer
    85. wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20) ' Auftragsnummer
    86. wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18) ' Land
    87. wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 19) 'Kunde
    88. wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24) ' Prod Fertig
    89. wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23) ' Abholtermin
    90. 'Status setzen
    91. wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
    92. wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
    93. ' ElseIf Trim(.Cells(lngZeile, "Q")) = "HMMI" Then
    94. ' wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3)
    95. ' wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4)
    96. ' wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20)
    97. ' wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18)
    98. ' wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 19)
    99. ' wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24)
    100. ' wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23)
    101. '
    102. ' 'Status setzen
    103. ' wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
    104. ' wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
    105. Else
    106. wksZiel.Cells(lngLetzteZiel + 1, 1) = .Cells(lngZeile, 1) & " " & .Cells(lngZeile, 2) & " " & .Cells(lngZeile, 3)
    107. wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4)
    108. wksZiel.Cells(lngLetzteZiel + 1, 3) = .Cells(lngZeile, 20)
    109. wksZiel.Cells(lngLetzteZiel + 1, 4) = .Cells(lngZeile, 18)
    110. wksZiel.Cells(lngLetzteZiel + 1, 6) = .Cells(lngZeile, 17)
    111. wksZiel.Cells(lngLetzteZiel + 1, 7) = .Cells(lngZeile, 24)
    112. wksZiel.Cells(lngLetzteZiel + 1, 8) = .Cells(lngZeile, 23)
    113. 'Status setzen
    114. wksZiel.Cells(lngLetzteZiel + 1, 11) = "0"
    115. wksZiel.Cells(lngLetzteZiel + 1, 16) = "0"
    116. End If
    117. End If
    118. End If
    119. End If
    120. 'Da wir die Exceltabelle und die Userform gleichzeitig bearbeitet werden
    121. ' müssen wir einen eine Aufgabe in den Arbeitsspeicher auslagern.
    122. 'Ansonsten sehen wir zur Laufzeit keine Veränderungen an der Progressbar.
    123. 'Um dies zu realisieren übergeben wir die Ermittlung der Wochentage mit
    124. '"Do Events" an den Arbeitspeicher.
    125. DoEvents
    126. 'Um den aktuellen Fortschritt anzeigen zu können ermitteln wir
    127. 'als nächstes anhand unseres Zählers und der letzten Zeile den
    128. 'prozentualen Wert. -1 da wir in der 2. Zeile beginnen.
    129. ProzentAktuell = (lngZeile - MLZ1) / (lngLetzteQuelle - MLZ1) * 100
    130. 'Unser Prozentlabel hat eine Länge (width) von 500. Wir teilen
    131. 'diese durch 100 und multiplizieren das Ergebnis mit den zuvor
    132. 'ermittelten Fortschritt. Anschließend können wir unsere Elemente
    133. 'mit diesem Ergebnis exakt positionieren.
    134. ProzentLänge = 500 / 100 * ProzentAktuell
    135. 'Nun zeigen wir unserem User den aktuellen Fortschritt
    136. Prozentanzeige.Caption = Format(ProzentAktuell, "##0") & " %"
    137. 'Außerdem interessiert dem User die aktuelle Position unserer Tabelle
    138. Zeile.Caption = "Zeile " & lngZeile & " von " & lngLetzteQuelle & " Zeilen bearbeitet "
    139. 'Die Breite unseres Fortschrittbalkens wird um die Prozentlänge erhöht.
    140. Fortschritt.Width = ProzentLänge
    141. 'Hier zeigen wir das aktuelle Datum sowie den ermittelten Tag
    142. aktuellesDatum.Caption = .Cells(lngZeile, 1) & "/" & .Cells(lngZeile, 2) & " - " & .Cells(lngZeile, 3)
    143. 'Die linke Position unserer Prozentanzeige, die "Mitfährt", wird durch die
    144. 'steigende Breite des Fortschrittbalkens nach links verschoben.
    145. '-47 da dies die Breite des Labels ist.
    146. Prozentanzeige.Left = Fortschritt.Width - 47
    147. 'Abhängig vom prozentualen Fortschritt manipulieren wir nun die Farbe unseres
    148. 'Fortschrittslabels und ändern die Caption unserer Userform entsprechend.
    149. Select Case ProzentAktuell
    150. Case Is > 85
    151. 'Me.Caption = "Ich bin gleich fertig"
    152. Fortschritt.BackColor = vbGreen
    153. Case Is < 50
    154. 'Me.Caption = "Es dauert noch eine Weile"
    155. Fortschritt.BackColor = vbRed
    156. Case Is > 49
    157. Fortschritt.BackColor = vbYellow
    158. 'Me.Caption = "Mehr als die Hälfte ist geschafft"
    159. End Select
    160. Next lngZeile
    161. End With
    162. 'Um unser Ergebnis anzuzeigen schalten wir zuletzt die Bildschirmaktualisierung wieder
    163. 'ein
    164. Application.ScreenUpdating = True
    165. 'MsgBox n & " Maschinen aus der Liste sind in den Produktionshallen."
    166. 'Endzeit in Label schreiben
    167. Set Plan = Nothing
    168. Set Liste = Nothing
    169. Set wksZiel = Nothing
    170. Me.Label39.Caption = CDate(Time - DaZeit)
    171. Me.Label35.Caption = Time
    172. Application.StatusBar = OldTxt
    173. 'Ergebnis in Labels schreiben
    174. Me.Label37.Caption = "Alle fehlenden Maschinen wurden hinzugefügt"
    175. Me.Label38.Caption = "Viel Spaß beim arbeiten :)"
    176. 'Button deaktivieren
    177. CommandButton1.Enabled = True
    178. Exit Sub
    179. 'Fehler: MsgBox "Unerwarteter Fehler - Richtige Datei mit richtigem Blatt geöffnet ??"
    180. Fehler: MsgBox " Datei: " & AbgDatei & " - Blatt: " & Deliver1 & Chr(10) & "Datei geöffnet? und/oder Name richtig geschrieben??" & Chr(10), vbOKOnly, " Fehler bitte prüfen " '& Error()
    181. CommandButton1.Enabled = True
    182. End Sub
    183. 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)
    184. End Sub
    185. 'Zentrieren auf beiden Bildschirmen des Fenstern
    186. Private Sub UserForm_Initialize()
    187. Dim sngTop As Single, sngLeft As Single
    188. Me.StartUpPosition = 0
    189. sngLeft = Application.Left + Application.Width / 2 - Me.Width / 2
    190. sngTop = Application.Top + Application.Height / 2 - Me.Height / 2
    191. Me.Left = sngLeft
    192. Me.Top = sngTop
    193. Label13 = Date
    194. Label28 = Time
    195. End Sub

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „UltraTM“ ()

    Hallo

    Mir ist folgendes aufgefallen:

    Visual Basic-Quellcode

    1. wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4) 'Seriennummer


    mit diesem Hochkomma machst Du ja aus einer Zahl ein Text. Evtl. müsstest Du das weglassen und auch die Tabelle entsprechen von Text in eine Zahl unmwandeln.

    Evtl. könnte man auch die Zahl in einen Text umwandeln...

    Visual Basic-Quellcode

    1. (If IsError(Application.Match(CStr(.Cells(lngZeile, 4)), wksZiel.Columns(2), 0)) Then)

    Panter schrieb:

    Hallo

    Mir ist folgendes aufgefallen:

    Visual Basic-Quellcode

    1. wksZiel.Cells(lngLetzteZiel + 1, 2) = "'" & .Cells(lngZeile, 4) 'Seriennummer


    mit diesem Hochkomma machst Du ja aus einer Zahl ein Text. Evtl. müsstest Du das weglassen und auch die Tabelle entsprechen von Text in eine Zahl unmwandeln.

    Evtl. könnte man auch die Zahl in einen Text umwandeln...

    Visual Basic-Quellcode

    1. (If IsError(Application.Match(CStr(.Cells(lngZeile, 4)), wksZiel.Columns(2), 0)) Then)




    Hallo ja das hatte ich so gemacht im ersten Moment damit er Zahlen richtig darstellt. Leider sind bei unseren Robotern die Seriennummern auch mit Buchstaben versehen. Aber das habe ich auch gelöst bekommen indem ich die Spalte als Zahl formatiere aber beim einfügen über VBA macht er die Seriennummern mit Buchstaben automatisch zum Text das klappt also :)
    Hallo

    Die Serienummern welche immer wieder eingefügt werden, enthalten diese auch Buchstaben?

    Falls nein könnte es eben sein, dass Excel diese nicht richtig vergleicht.

    Vielliecht könnte man das so lösen:

    Visual Basic-Quellcode

    1. Dim SuchTXT
    2. if isNumeric(.Cells(lngZeile, 4) then
    3. SuchTXT = .Cells(lngZeile, 4) * 1
    4. Else
    5. SuchTXT = .Cells(lngZeile, 4)
    6. End If
    7. If IsError(Application.Match(SuchTXT), wksZiel.Columns(2), 0)) Then


    Lg Panter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Panter“ ()