PDA

Vollständige Version anzeigen : Tabellenzeilen nach Begriffen durchsuchen und darunterliegende Spalten einfügen??


Mose.P
03.06.2003, 08:55
Hallo liebes Forum,

ich sitze hier verzweifelt vor meinem PC und suche nach einer Lösung. Wahrscheinlich ist es mal wieder ganz einfach, nur ich komme nicht drauf...

Es geht um folgendes:
Ich habe eine Excel-Tabelle (z. B. Artikelumsatz pro Jahr), die ich mittels "TabellenTransponieren"-Funktion (hier aus dem Forum) importiere. Hintergrund ist, dass in der Excel-Tabelle die Jahre als Spalten und die Artikel als Zeilen drinstehen, ich in Access aber natürlich die Artikel als Felder (also Spalten) habe und die Jahre dann die Datensätze (Zeilen) sind.

Wenn ich die importierte und transponierte Tabelle ansehe, haben die Spalten die Bezeichnungen 1 bis ... (z.B. 80) und die Zeilen F1 bis ... (z.B. F8). Nun gibt es verschiedene Grundtabellen, deshalb kann ich nicht einfach davon ausgehen, dass der Artikel "Heizöl" immer in Spalte 11 und das Jahr 1997 immer in Zeile F6 stehen.

Die Lösung habe ich mir so vorgestellt:
Zuerst ermittle ich die in der Tabelle vorhandenen Jahreszahlen (z.B. 1997 bis 2002). Dann suche ich in der Tabelle nach den Schlüsselwörtern (z. B. "Heizöl") und nehme dann einfach die in der Spalte darunterliegenden Werte als Verbrauchswerte zu den vorher ermittelten Jahreszahlen.

Aber wie?

Ich habe bei der Suche hier im Forum schon die Idee mit zwei miteinander verknüpften Abfrage gesehen. Da ging es um Artikelnummern, die in einer anderen Tabelle als EAN-Nummern eingetragen waren. Aber das trifft nciht genau mein Problem, denn dort waren die EAN-Nummern immer in derselben Spalte.

Hat jemand von Euch eine Idee?
Ich kann Euch auch mal eine Beispieltabelle reinstellen, wenn das was hilft.

Danke schonmal!!!!!!!

Arne Dieckmann
03.06.2003, 08:57
Eine Beispieltabelle/-datenbank und das gewünschte Ergebnis wären nicht schlecht.

Mose.P
03.06.2003, 12:47
OK, ich habe hier mal zwei Beispiele in die Datei gepackt.
Das eine ist eine der möglichen Excel-Tabellen im Grundzustand (so wie ich sie bekomme). Und das andere ist dann eine Beispieldatenbank mit den Ergebnissen des Imports und der Transponierung sowie den dazugehörigen Modulen.

Wie man sieht sind die Feldbezeichnungen nun einfache Zahlen von 1 bis ...
Die Tabellen können vom Aufbau her etwas unterschiedlich sein. Das heisst, es fehlen in der Excel-Tabelle zum Beispiel die ersten drei Spalten (die könnte ich zur Not auch noch selber bei den anderen löschen).

Viel "schlimmer" ist eher, dass manchmal zusätzliche Zeilen eingefügt werden (zum Beispiel wenn jemand seine Materialien detaillierter aufschlüsseln will).

Das einzige, was mit ziemlicher Sicherheit konstant bleibt (von den beiden Sprachversionen Deutsch und Englisch mal abgesehen) sind die Bezeichnungen, zumindest der Anfang. Also "Electricity" wird auch immer "Electricity" bleiben, die einzige Möglichkeit ist (neben "Strom"), dass jemand daraus "Electricity - electricitee" gemacht hat.

Fällt dazu jemandem was ein, wie ich die Daten in meine Access-DB bekomme?
In der MDB-Datei ist die auch Struktur meiner Tabelle "Imput" zu sehen.

Danke schonmal!

Mose.P
04.06.2003, 09:37
Hallo Leute,

ich hab gesehen dass sich schon zwei Leute meine Beispiele angesehen haben. Fällt Euch beiden da was ein?

Ich habe mir überlegt, dass es ja auch anders geht, ohne transponieren. Wenn ich eh die Felder durchgehen muss, könnte ich die Tabelle ja auch einfach so importieren und dann die Felder absuchen.

Was meint Ihr? Hat jemand eine passende Idee?

Arne Dieckmann
04.06.2003, 09:44
Ich habe mir gestern die Datenbank runtergeladen und bin daraus nicht ganz schlau geworden - dafür ist/war es hier viel zu heiss. :eek:
Aber vielleicht fällt jemand anderes noch etwas dazu ein.

Mose.P
04.06.2003, 10:39
Hallo Arne, hallo alle anderen,

ich habe mich jetzt mit einem Kollegen unterhalten und eine neue Idee:
Anstatt die Tabelle zu importieren, dann zu transponieren und dann auch noch zu kontrollieren, wo welche Daten stehen, mache ich es jetzt anders, Prinzip "typisch Zentrale":
Eigentlich gibt es nur zwei Standard-Tabellenvorlagen , nennen wir sie Standard und BUWAL . Diese jeweils noch auf Deutsch und auf Englisch.
Wenn nun jemand meint, er müsste seine Tabelle nochmal ändern, so hat er eben Pech und muss die Tabelle wieder ins Standardformat zurückbringen, bevor er sie importieren kann.

Also habe ich mir diesen Ablauf ausgedacht:[list=1]
Excel-Tabelle mittels Dateidialog auswählen
Excel-Tabelle als Excel.Application mittels .Workbooks.Open öffnen
Tabellenart bestimmen (z. B. über Abfrage vom Inhalt von Zelle D2: "" -> Standard, "Site:..." oder "Standort..." -> BUWAL)
zwei oder drei Tests: einige Tabellenwerte abfragen, um ungültige Tabellen auszusortieren
Einlesen : Standard ab C6, BUWAL ab F2. Als Einleseziel ein Array vom Typ Variant .
Daten aus Array in ein Recordset der Datenbanktabelle eintragen und mittels "Update " übertragen.
[/list=1] Eventuell muss ich noch bei Schritt 5 die Zahlenformate umwandeln, damit sie zu den Formaten der Input-Tabelle in der Datenbank passen (kann man sowas automatisieren, dass automatisch das passende Format der Input-Tabelle draus wird?)

Was haltet Ihr von dieser Idee?
Kann mir jemand Tips zur direkten Datenübernahme aus Excel-Tabellen geben (und zum Eintragen und Umwandeln von Arrays)?

Freue mich auf Eure Meinungen an so einem heißen Tag!

strausto
04.06.2003, 10:47
Kann mir jemand Tips zur direkten Datenübernahme aus Excel-Tabellen geben


ExcelToAccess (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=93534&highlight=exceltoaccess)

Mose.P
04.06.2003, 11:50
Hallo Strausto,

danke für Deinen Hinweis. Ich hatte ganz vergessen zu erwähnen, dass genau diese Datei auch zu dieser Idee geführt hat. :holy:

Ich suche aber auch noch nach einer Erläuterung der Befehle und Möglichkeiten zum Datenzugriff auf Excel.

strausto
04.06.2003, 12:50
@Moses ;)

Vielleicht können wir ein Schritt nach dem anderen machen. Momentan habe ich das Gefühl, dass wir immer wieder von vorne anfangen und sich die Prämissen ständig verändern.

Was willst Du denn nun als erstes machen?

Mose.P
10.06.2003, 16:27
Hallo allerseits,

ich hab's geschafft!
Damit Ihr auch wisst, wie ich das jetzt realisiert habe: Ich habe mich wie gesagt von meinem ersten Gedanken (darunterliegende Spalten importieren) völlig verabschiedet und mache es nun anders.

Die Schritte 1 bis 4 habe ich entsprechend umgesetzt: Eine Tabelle kann ausgewählt werden und es wird automatisch nachgeprüft, welches Format die hat. Das wird dann in einem Formular angezeigt und man kann nun zusätzlich auswählen, welche Datensätze (Jahre) importiert werden sollen.
Transponieren ist ad acta gelegt (weil unnötig).

Nun laufe ich in zwei Select Case (für jedes mögliche Tabellenformat eine) Schleifen mittels For Each... Next durch die Elementauflistung des Listenfeldes mit den Jahren (=y) und importiere dann die Daten in dieses Recordset
Set tbl = DBs.OpenRecordset("Input_Kopie", dbOpenTable)
mit Anweisungen à la
tbl.AddNew
tbl!electricity = .Cells(5, y)
tbl!Gas = .Cells(6, y)
tbl!Oil = .Cells(7, y)
...
tbl!update

Das ist zwar nicht besonders komfortabel (weil es nur noch die vorgegebenen zwei Möglichkeiten gibt mit der Fehlerquelle, dass jemand die Zeilen vertauscht hat), aber es erfüllt seinen Zweck und ist ausreichend schnell.

Die Frage , die jetzt noch bleibt, ist:
Es kann vorkommen, dass Felder in der Excel-Tabelle leer sind. Wie kann ich mit einer einfachen Funktion alle Felder im Recordset (oder meinetwegen auch nach update in der Tabelle Input_Kopie) auf NULL überprüfen und den Wert dann in 0 ändern?

Danke schonmal,
Mose.P

Mose.P
11.06.2003, 17:44
Hallo mal wieder,

auf meine Frage gibt es auch einige Antworten, in einem extra Thread wurden mir gute Tips gegeben:
http://www.ms-office-forum.net/forum/showthread.php?postid=382494

Vielen Dank nochmal! :dance: