Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Eine Abfrage die auf eine DB-Tabelle und eine Excel-Tabell/(Datei) zugreift

Begonnen von Kloso, Oktober 23, 2016, 13:15:50

⏪ vorheriges - nächstes ⏩

Kloso

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?
Viele Grüße Kloso

DF6GL

Hallo,

importiere die Excel-Sheet -Daten in eine Access-Tabelle und benutze SQL, um die nunmehr zwei Access-Tabellen entspr. zu vergleichen.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MaggieMay

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. ;-)
Freundliche Grüße
MaggieMay

Kloso

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.

Viele Grüße Kloso

Beaker s.a.

Hallo Kloso,
Verknüpfungen zu externen Daten erstellt man über "Externe Daten" > Excel (in deinem
Fall).
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Kloso

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?

Viele Grüße Kloso

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Kloso

Hallo, es kann sein dass ich es verwirrend formuliert hatte am Anfang. Habe nun versucht mein Ziel im Paint nachzubauen:





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.



Also funktioniert auch nur wenn man ein Bestimmtes Feld in der Excel Tabelle angibt, nicht aber wenn man alle Spalte mit .* angibt.
Viele Grüße Kloso

DF6GL

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
.
.
.
.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Kloso

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)
Viele Grüße Kloso

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

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 
.
.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Kloso

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
Viele Grüße Kloso