Hallo Freunde,
habe mir folgendes vorgenommen:
- Ich möchte ein Query erstellen, der die Felder einer bestimmten Spalte in einer DB-Tabelle mit den Feldern einer bestimmten Excel-Tabelle vergleicht und mir dann nur die Zeilen anzeigt wo er Übereinstimmungen findet.
Bsp.: - Excel Tabelle mit einem riesigen Inhalt von A1:Y1000. Query greift auf die DB-Tabelle, sieht dass in der "SpalteX" die Zeilen mit "TextBeispiel1" und "TextBeispiel100" und etc. auch in der Excel-Tabelle genau so zu finden sind. Also zeigt er sie mir an. Den Rest, der nicht genau so in der Excel-Tabelle zu finden ist, nicht.
Frage: - Ist es einfacher die Excel-Tabell in Access einzubinden und dann den SQL zu machen, oder ist es besser es mit VBA zu programmieren und die Excel-Tabelle einfach mit der AccessDB in einem Ordner abzulegen? Wie wäre es am sinnvollsten vorzugehen?
Hallo,
importiere die Excel-Sheet -Daten in eine Access-Tabelle und benutze SQL, um die nunmehr zwei Access-Tabellen entspr. zu vergleichen.
Hallo,
je nachdem was du vorhast und wie es damit weitergeht, käme natürlich auch eine
Verknüpfung zur Excel-Tabelle infrage, mit der gleichermaßen wie mit einer importierten Tabelle umgegangen werden kann.
ZitatExcel Tabelle mit einem riesigen Inhalt von A1:Y1000
Aus Access-Sicht ist eine Tabelle mit 25 Spalten und 1000 Zeilen nicht "riesig" - eigentlich auch nicht aus Excel-Sicht. ;-)
MaggieMay
wäre die Verknüpfung mit SQL möglich oder bräuchte man dann eher einen VBA?
Ich versuche jetzt erstmal die Tabelle in Access zu importieren hoffe das Weitere klappt dann von alleine.
Hallo Kloso,
Verknüpfungen zu externen Daten erstellt man über "Externe Daten" > Excel (in deinem
Fall).
gruss ekkehard
Hallo,
also ich habe rumgebastelt und rumprobiert. Funktioniert. Aber nur teils.
Dieser Query funktioniert, vergleicht aber nur mit dieser Spalte: Field1
SELECT DBfürTestBlatt.*
FROM DBfürTestBlatt
WHERE search_term IN (SELECT Field1 From Testblatt);
da ich aber mit allen Spalten vergleichen will, habe ich diesen Code probiert:
SELECT DBfürTestBlatt.*
FROM DBfürTestBlatt
WHERE search_term IN (SELECT * From Testblatt);
dieser funktioniert aber leider nicht.
Gibt es da einen Trick?
PS: Es ist ja im Prinzip eine SELECT Unterabfrage, und bei Unterabfragen mit SELECT darf man nicht "*" verwenden.
Also müsste man es auf EXISTS umschreiben. Oder?
Hallo,
anfänglich schreibst Du aber von nur einer Spalte......
siehe hier:
http://www.donkarl.com/?FAQ3.16
in dem Beispiel wird ein ID-Feld für den Join benutzt. Da Du aber keinen Primärschlüssel hast, müssen im Abfrageentwurf alle Felder, die eine "Zeile" eindeutig machen, miteinander verknüpft werden.
Hallo, es kann sein dass ich es verwirrend formuliert hatte am Anfang. Habe nun versucht mein Ziel im Paint nachzubauen:
(http://up.picr.de/27238187mr.jpg)
Ich würde es schon gerne so lösen, dass man es mit dem SQL Code schafft, nur wie kann ich die WHERE Bedienung so formulieren, dass sie auf alle Spalten der ExcelTabelle schaut und es mit "Search_term" vergleicht und nicht wie im Bsp nur auf Field2
DF6GL, ich habe mir den Link angeschaut, aber ich glaube dort geht es nur wenn ich jeweils die kompletten Tabellen vergleichen möchte. Oder?
____________________________________
PS:
Habe jetzt probiert die im Link gegebene Information nachzubauen, da kommt es aber aufs selbe raus leider.
(http://up.picr.de/27238273cs.jpg)
Also funktioniert auch nur wenn man ein Bestimmtes Feld in der Excel Tabelle angibt, nicht aber wenn man alle Spalte mit .* angibt.
Hallo,
es könnten die einzelnen Spalten der Excel-Liste nacheinander mit entspr. angepassten Abfragen verglichen und in einer UNION-Abfrage zusammengefasst werden:
Select from Datenbank Where search_term in (select Field1 from ImportierteExceltabelle)
Union
Select from Datenbank Where search_term in (select Field2 from ImportierteExceltabelle)
Union
........
Union
.
.
.
.
Hallo DF6GL,
habe das gestern auch genau so gestartet, da hat es auch funktioniert. Auch mit einer verschachtelten Iff Anweisung. Jedoch bei meiner Test Tabelle ist das noch übersichtlich. Bei meiner richtigen Tabelle sind es zig Tausende Spalten, also werde ich es wohl verallgemeinern müssen.
Wenn mann es eventuell so formulieren könnte:
Prüfe ob in Spalte1 wenn ja - zeige, und gehe dann in Spalte1 + 1Spalte nach rechts und prüfe dasselbe und gehe wieder 1Spalte weiter... und dann am Ende zeige mir alle an die gefunden worden sind.
(an der Formulierung des Satzes merkt man das ich noch kein richtiger programmierer bin)
Hallo Kloso,
ZitatBei meiner richtigen Tabelle sind es zig Tausende Spalten, also werde ich es wohl verallgemeinern müssen.
In Access ist bei 255 Spalten/Feldern Schluss.
Da wirst du den Import wohl auch noch aufteilen müssen.
gruss ekkehard
Hallo,
es wird nicht zu umgehen sein, die Excel-Tabelle zu normalisieren:
Mittels Schleife die Felder durchfahren und bei jedem Durchgang die Werte und den Spaltennamen (der später als Primärschlüssel dient) "vertikal" (mit einer Anfügeabfrage) in eine weitere Tabelle schreiben (Tabelle transponieren)
Field1 1
Field1 a
Field1 11
Field1 k
Field2 2
Field2 b
Field2 12
Field2 l
.
.
Habe es eben folgendermaßen geschafft. Unzwar:
Ich habe die ExcelTabelle in Excel mit diesem VBA normalisiert:
Sub AllesInEineSpalte()
Dim i As Long, j As Long, k As Long
Dim vnArrQ As Variant, vnArrZ As Variant
vnArrQ = Rows(1).CurrentRegion.Value
ReDim vnArrZ(1 To UBound(vnArrQ, 1) * UBound(vnArrQ, 2), 1 To 1)
For i = 1 To UBound(vnArrQ, 1)
For j = 1 To UBound(vnArrQ, 2)
k = k + 1
vnArrZ(k, 1) = vnArrQ(i, j)
Next j
Next i
Cells(1).CurrentRegion = ""
Cells(1).Resize(k).Value = vnArrZ
End Sub
Es tut einfach alle Spalten in eine Spalte umschreiben. Dann tue ich diese neue ExcelTabelle als eine neue Datei speichern, tue sie dann erst in Access importieren und dann meinen am Anfang gebastelten Code ausführen:
SELECT DBfürTestBlatt.*
FROM DBfürTestBlatt
WHERE search_term IN (SELECT Field1 From Testblatt);
Ist halt recht kompliziert aber ich komme wenigstens zu dem gewünschten Ergebnis.
Gibt es vielleicht doch eine Möglichkeit den Subquery mit dem * (Alle Spalten) irgendwie auszuführen? Dann wäre nämlich alles so viel viel einfacher. :D