Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1604to1608
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

Makro für Tabellenvergleich

Makro für Tabellenvergleich
01.02.2018 11:31:30
Tim
Hallo, ich bin auf der Suche nach einem Makro was folgendes abbilden kann:
1. geh in den Netzwerkordner "C...."
2. öffne darin beide vorhandenen Tabellen
3. such in beiden Tabellen die Spalten mit folgender Überschrift "SN, SN2, Serial Nbr., IMEI" unabhängig in welcher Zeile sich die Überschrift befindet
4. Die Werte die unter den Spalten "SN & SN2" und "Serial Nbr.& IMEI" stehen miteinander vergleichen
5. sind die Werte aus Tabelle x mit den Spalten "SN & SN2" mit den Werten aus Tabelle y mit den Spalten "Serial Nbr.& IMEI" identisch dann mache nichts, sind sie jedoch abweichend, dann gib mir die Werte mit der jeweiligen Überschrift wo die Werte gefunden wurden, in die Tabelle mit diesem Makro.
Wer hat dazu eine Idee!?
Im Moment greife ich die Daten aufwendig mit einem einem Sverweis ab.

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro für Tabellenvergleich
01.02.2018 12:54:54
Herbert
Hallo Tim,
das wird wohl daran scheitern, dass hier niemand bereit ist, Deine 3 AM nachzubauen. Also pack sie in eine zip-Datei und lade sie hoch, dann klappts auch mit der Hilfe! ;o)=)
Servus
AW: Makro für Tabellenvergleich
01.02.2018 13:49:48
Tim
Hallo Herbert,
vielen Dank für deine Antwort, ich habe mir eben nochmal Gedanken gemacht wie man es leichter machen könnte.
Grundsätzlich will ich ja die Beiden Spalten aus Beiden Tabellen zusammenführen und Dopplungen löschen.
Problem ist das Beide Tabellen unterschiedliche Namen und auch Überschriften der jeweiligen Spalten haben.
AW: Makro für Tabellenvergleich
01.02.2018 15:44:01
Peter(silie)
Hallo,
hier deine Mappe: https://www.herber.de/bbs/user/119474.xlsm
Beim Fettgedruckten musst du noch die Pfade anpassen
Private Sub OpenTables()
Dim p1 As String, p2 As String
    p1 = "Pfad"
p2 = "Pfad"
If Not FileExists(p1) Or Not FileExists(p2) Then Exit Sub
Dim a As Workbook
Set Db1.BaseObject = Workbooks.Open(p1)
Set Db2.BaseObject = Workbooks.Open(p2)
Set Db1.Table = Db1.BaseObject.Sheets(1)
Set Db2.Table = Db2.BaseObject.Sheets(1)
End Sub
Wenn du alle Werte unter dem Suchbegriff haben willst, dann passe die Variablen in Base und in der Database Klasse an, damit sie ein Array darstellen usw.
Kurz um: Du musst noch Feintuning bei dem Ding machen
Hier nur Code:
Base Modul:
Option Explicit
Public Type db
BaseObject As Workbook
Table As Worksheet
SN_Col As String
SN2_Col As String
SNBR_Col As String
IMEI_Col As String
SN As String
SN2 As String
SNBR As String
IMEI As String
End Type
DB_Operator Modul:
Option Explicit
Private Db1 As Database
Private Db2 As Database
Public Sub CheckMyTables()
Set Db1 = New Database
Set Db2 = New Database
OpenTables
Get_SNBR_IMEI
Get_SN
CheckValues
CloseTables
End Sub
Private Sub OpenTables()
Dim p1 As String, p2 As String
p1 = "Pfad"
p2 = "Pfad"
If Not FileExists(p1) Or Not FileExists(p2) Then Exit Sub
Dim a As Workbook
Set Db1.BaseObject = Workbooks.Open(p1)
Set Db2.BaseObject = Workbooks.Open(p2)
Set Db1.Table = Db1.BaseObject.Sheets(1)
Set Db2.Table = Db2.BaseObject.Sheets(1)
End Sub
Private Sub CloseTables()
If Not Db1.BaseObject Is Nothing Then
Db1.BaseObject.Close False
Set Db1 = Nothing
End If
If Not Db2.BaseObject Is Nothing Then
Db2.BaseObject.Close False
Set Db2 = Nothing
End If
End Sub
Private Function FileExists(ByVal Path_ As String) As Boolean
If Dir(Path_, vbDirectory)  vbNullString Then FileExists = True
End Function
Private Sub Get_SNBR_IMEI()
Dim lRow As Long, lCol As Long
Dim i As Long, area As Variant
Dim j As Long
With Db1.Table
lCol = .UsedRange.Columns.Count
For i = 1 To lCol
lRow = .Cells(.Rows.Count, i).End(xlUp).Row
area = .Range(.Cells(1, i), .Cells(lRow, i)).Value
If Db1.SNBR_Col = vbNullString Then
j = SearchID(area, "Serial Nbr.")
If j > 0 Then
Db1.SNBR = .Cells(j + 1, i)
Db1.SNBR_Col = " Row: " & j & " Column: " & i
End If
End If
If Db1.IMEI_Col = vbNullString Then
j = SearchID(area, "IMEI")
If j > 0 Then
Db1.IMEI = .Cells(j + 1, i)
Db1.IMEI_Col = " Row: " & j & " Column: " & i
End If
End If
If Db1.SNBR_Col  vbNullString And Db1.IMEI_Col  vbNullString Then Exit For
Next i
End With
End Sub
Private Sub Get_SN()
Dim lRow As Long, lCol As Long
Dim i As Long, area As Variant
Dim j As Long
With Db2.Table
lCol = .UsedRange.Columns.Count
For i = 1 To lCol
lRow = .Cells(.Rows.Count, i).End(xlUp).Row
area = .Range(.Cells(1, i), .Cells(lRow, i)).Value
If Db2.SN_Col = vbNullString Then
j = SearchID(area, "SN")
If j > 0 Then
Db2.SN = Cells(j + 1, i).Value
Db2.SN_Col = " Row: " & j & " Column: " & i
End If
End If
If Db2.SN2_Col = vbNullString Then
j = SearchID(area, "SN2")
If j > 0 Then
Db2.SN2 = Cells(j + 1, i).Value
Db2.SN2_Col = " Row: " & j & " Column: " & i
End If
End If
If Db2.SN_Col  vbNullString And Db2.SN2_Col  vbNullString Then Exit For
Next i
End With
End Sub
Private Function SearchID(ByVal SearchArea As Variant, ByVal ValueToFind As String) As Long
If Not VBA.IsError(Application.Match(ValueToFind, SearchArea, 0)) Then
SearchID = Application.Match(ValueToFind, SearchArea, 0)
End If
End Function
Private Sub CheckValues()
If Db1.IMEI  Db1.SN Then MsgBox Db2.IMEI & Db2.IMEI_Col & vbCrLf & Db2.SN & Db2.SN_Col
If Db1.SNBR  Db1.SN2 Then MsgBox Db2.SNBR & Db2.SNBR_Col & vbCrLf & Db2.SN2 & Db2.SN2_Col
End Sub
Database Klasse:
Option Explicit
Private db As Base.db
Public Property Set BaseObject(ByRef this_ As Workbook)
Set db.BaseObject = this_
End Property
Public Property Get BaseObject() As Workbook
Set BaseObject = db.BaseObject
End Property
Public Property Set Table(ByRef this_ As Worksheet)
Set db.Table = this_
End Property
Public Property Get Table() As Worksheet
Set Table = db.Table
End Property
Public Property Let SN_Col(ByVal value_ As String)
db.SN_Col = value_
End Property
Public Property Get SN_Col() As String
SN_Col = db.SN_Col
End Property
Public Property Let SN2_Col(ByVal value_ As String)
db.SN2_Col = value_
End Property
Public Property Get SN2_Col() As String
SN2_Col = db.SN2_Col
End Property
Public Property Let SNBR_Col(ByVal value_ As String)
db.SNBR_Col = value_
End Property
Public Property Get SNBR_Col() As String
SNBR_Col = db.SNBR_Col
End Property
Public Property Let IMEI_Col(ByVal value_ As String)
db.IMEI_Col = value_
End Property
Public Property Get IMEI_Col() As String
IMEI_Col = db.IMEI_Col
End Property
Public Property Get SN() As String
SN = db.SN
End Property
Public Property Get SN2() As String
SN2 = db.SN2
End Property
Public Property Get SNBR() As String
SNBR = db.SNBR
End Property
Public Property Get IMEI() As String
IMEI = db.IMEI
End Property
Public Property Let SN(ByVal value_ As String)
db.SN = value_
End Property
Public Property Let SN2(ByVal value_ As String)
db.SN2 = value_
End Property
Public Property Let SNBR(ByVal value_ As String)
db.SNBR = value_
End Property
Public Property Let IMEI(ByVal value_ As String)
db.IMEI = value_
End Property

Anzeige
AW: Makro für Tabellenvergleich
01.02.2018 16:52:55
Tim
auf den ersten Blick "wow" ich probiere es morgen aus und gebe anschließend Feedback, vielen Dank erstmal!
AW: Makro für Tabellenvergleich
02.02.2018 08:16:45
Tim
Guten Morgen,
sobald ich den Pfad entsprechend anpasse, scheitert das Makro bei "FileExists". Woran kann das liegen?
AW: Makro für Tabellenvergleich
02.02.2018 08:25:59
Rainer
Hallo Tim,
Hat die Pfadangabe ein "\" am Ende?
Gruß,
Rainer
AW: Makro für Tabellenvergleich
02.02.2018 08:43:24
Herbert
Du musst auch den Dateinamen beim Pfad mit angeben!
Servus
AW: Makro für Tabellenvergleich
02.02.2018 12:39:16
Tim
Pfad funktioniert, jedoch scheiter er jetzt bei " lCol = .UsedRange.Columns.Count"
AW: Makro für Tabellenvergleich
02.02.2018 15:58:39
Peter(silie)
Hallo,
das wird dann wohl daran liegen dass eine der Mappen nicht geöffnet wurden,
da es die datei wie du sie angegeben hast nicht gibt.
Änder in OpenTables mal:
If Not FileExists(p1) Or Not FileExists(p2) Then Exit Sub
in folgendes ab:
If Not FileExists(p1) Or Not FileExists(p2) Then End
Durchlauf das ganze schrittweise mit dem debugger.
wenn er bei der obigen zeile dann das makro einfach beendet, weißt du,
dass dein pfad falsch angegeben ist.
Anzeige
AW: Makro für Tabellenvergleich
05.02.2018 08:23:05
Tim
Guten Morgen zusammen,
das Makro läuft soweit super, vielen Dank an der Stelle.
Jetzt habe ich noch eine Bitte:
besteht die Möglichkeit, alle Zeilen in der Tabelle mit der Spaltenüberschrift "SN" & "SN2" farbig zu markieren wenn diese nicht identisch mit der anderen Tabelle ist?
AW: Makro für Tabellenvergleich
05.02.2018 12:48:08
Tim
Sieht schon fast perfekt aus, jedoch macht er im Moment nur die Überschrift SN & SN2 gelb, woran kann das liegen?
Anzeige
AW: Makro für Tabellenvergleich
05.02.2018 16:48:53
Tim
fast perfekt, er hängt nur noch an dieser Stelle:
If Not Array_IsEmpty(Db1.IMEI) And Not Array_IsEmpty(Db2.SN) Then
arr1 = Db1.IMEI: arr2 = Db2.SN: tmp = Db2.SN_Col
For i = LBound(arr1) To UBound(arr2)
If arr1(i) arr2(i) Then
Db2.Table.Cells(tmp(0) + i, tmp(2)).Interior.Color = vbYellow
End If
Next i
AW: Makro für Tabellenvergleich
05.02.2018 22:22:53
Peter(silie)
Und was sagt er an dieser Stelle...?
Bei mir funzt es mit deinen Bsp. Dateien
AW: Makro für Tabellenvergleich
06.02.2018 16:28:02
Tim
Das Problem liegt darin, dass wenn die Tabelle mit der Spaltenüberschrift "Serial Nbr. & IMEI" nur einen Eintrag hat unter dieser Überschrift hat, er diese Fehlermeldung bringt, sobald mehrere Einträge darunter sind läuft das Makro. Zudem macht er dann alle Einträge "gelb" und nicht die, die abweichend sind.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige