Hallo Mase,
ja du hast Recht. Ich sollte mal die komplette Verarbeitung hochladen. Vielleicht wird es dann besser ersichtlich. Das beiden Tabellen sind sehr umfangreich (eine knapp über 1.000 Zeilen, die andere ca 12.000) daher wäre eine Anonymisierung entsprechend aufwendig. Wir versuchen es mal so, falls wir gar nicht weiterkommen, überlege ich mir was, wie ich es doch hochladen kann. Ich habe außerdem mal ein anonymisiertes Schema von den Links, die verglichen werden sollen, angefügt (Länge und Aufbau stimmen exakt mit den Original-Links überein).
Sub Tabellen_zusammenfuehren()
Dim rngCsM As Excel.Range 'Spalten in Master
Dim rngCM As Excel.Range 'Spalte in Master
Dim rngCS As Excel.Range 'Spalte in Quelle
Dim lngOffset As Long
Dim feed, feedsheet As Worksheet
Dim zielSheet As Worksheet
Dim w, x, y, z As Long
Dim linkTarget, linkFeed As String
Dim main_link_target, image, beschreibung, g_d_preis, price, main_link_source, image_source, description, preis, link_2 As Integer
Dim Zeile As Long
Dim ZeileMax As Long
lngOffset = 1
Set zielSheet = Worksheets("Main")
With Worksheets("Main")
Set rngCsM = .Range("A1", .Cells(1, .Columns.Count).End(xlToLeft))
End With
For Each wks In ActiveWorkbook.Worksheets
If Not wks.Name = "Main" Then
With wks
For Each rngCM In rngCsM.Cells
'Spalte (anhand Beschriftung) suchen
Set rngCS = .Rows(1).Find(What:=rngCM, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
If Not rngCS Is Nothing Then
Debug.Print "Spalte '"; CStr(rngCM); "' gefunden"
'Datenbereich der Spalte ref.
Set rngCS = .Range(rngCS.Offset(1), .Cells(.Rows.Count, rngCS.Column).End(xlUp))
anzahluebertragenezeilen = rngCS.Rows.Count
'Werte übertragen
rngCM.Offset(lngOffset).Resize(rngCS.Rows.Count).Value = rngCS.Value
Else
Debug.Print "Spalte '"; CStr(rngCM); "' nicht gefunden"
End If
Next
lngOffset = lngOffset + anzahluebertragenezeilen
End With
End If
Next
' Abgleich mit dem Feed zum Einfuegen von Links, Preis, Bilder, Beschreibung
feed = Application.GetOpenFilename
If feed <> False Then
Set feedsheet = Workbooks.Open(feed).Sheets(1)
Else
Exit Sub
End If
For z = 1 To feedsheet.Cells(1, 256).End(xlToLeft).Column
Select Case feedsheet.Cells(1, z)
Case "link_2"
link_2= z
Case "main_link_source"
main_link_source = z
Case "image_source"
image_source = z
Case "description"
description = z
Case "Preis"
preis = z
End Select
Next z
With zielSheet
For y = 1 To rngCsM.Columns.Count
Select Case .Cells(1, y)
Case "N_Link_1"
N_Link_1 = y
Case "main_link_target"
main_link_target = y
Case "Product"
Product = y
Case "Image"
image = y
Case "Beschreibung"
beschreibung = y
Case "G_D_Preis"
g_d_preis = y
Case "Price"
price = y
End Select
Next y
ZeileMax = .UsedRange.Rows.Count
For Zeile = ZeileMax To 1 Step -1
If Trim(.Cells(Zeile, 1).Value) = "" Then
.Rows(Zeile).Delete
End If
Next Zeile
For x = 2 To .UsedRange.SpecialCells(xlCellTypeLastCell).Row
If .Cells(x, 1).Value <> "" Then
linkTarget = LTrim(.Cells(x, N_Link_1).Value2)
For w = 2 To feedsheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
linkFeed = LTrim(feedsheet.Cells(w, link_2).Value2)
Debug.Print linkTarget
Debug.Print linkFeed & " =" & linkTarget = linkFeed
If linkFeed = linkTarget Then
.Cells(x, main_link_target) = feedsheet.Cells(w, main_link_source)
.Cells(x, image) = feedsheet.Cells(w, image_source)
.Cells(x, beschreibung) = feedsheet.Cells(w, description)
.Cells(x, g_d_preis) = feedsheet.Cells(w, preis)
.Cells(x, price) = feedsheet.Cells(w, preis)
End If
Next w
End If
Next x
End With
End Sub
Ich hoffe es ist nicht zu unübersichtlich. Zur Erläuterung: Die Links die abgeglichen werden sind nicht die, die ich letztendlich in meiner Tabelle haben möchte. Abgeglichen werden N_Link_1 und link_2. Bei einem Match wird dann main_link_target mit main_link_source befüllt.
Ich arbeite zusammen mit Tobi an diesem "Projekt", um für den Verien diverse Material- und Bestelllisten zusammenzubringen. Deswegen ist der nachfolgende Teil obsolet, wenn die Löschung der leeren Zeilen in Tobi's vorhergehendem Schritt funktioniert. Und demenstprechend funktioniert die Abfrage, ob die Zeile leer ist auch hier nicht zuverlässig. Der Programmdurchlauf hängt sich an den leeren Zeilen insbesondere auf, da aus irgendeinem Grund dort ein Abgleich statfindet und er dann wohl alle 12.000 Zeilen des Feeds auf ein Match durchsucht.
ZeileMax = .UsedRange.Rows.Count
For Zeile = ZeileMax To 1 Step -1
If Trim(.Cells(Zeile, 1).Value) = "" Then
.Rows(Zeile).Delete
End If
Next Zeile
Und hier noch das Schema eines Links, der verglichen wird. Vielleicht findet sich ja hierbei ein Hinweis, warum es nicht funktioniert.
http://xxx.main.de/index.php?redirect=https%3A%2F%2Fwww.ziel-seite.de%2Fxxxxx-xxxxxx-6-9-x0048692%3Fsize%3D1%26varid%3D375608%26bcc=12345&ab=012345678902345678911&bm=100&bmcl=0123456789012345678901234&cp_nnnn=Ovpe&ag_name=feed&bk=default
Vielen Dank nochmal für die stets schnellen und hilfreichen Antworten Mase :)
Grüße
Wolfgang
|