Supportnet / Forum / Tabellenkalkulation
Oracle-Tabelle in Excel transponieren !!!!!
Frage
Hallo Leute,
ich habe ein großes Problem.
Ich muss eine Artikelverbrauchstabelle (3,5 mio Datensätze mit 5 Spalten) aus Oracle nach Excel transponieren.
Die Oracle-Tabelle sieht wie folgt aus:
ARTIKEL, JAHR, MONAT, TAG, VERBRAUCH
Je Artikel wird in Oracle der Tagesverbrauch 1.1. -31.7. untereinander angezeigt. Das Ganze muss jetzt in Excel 2003 tranponiert dargestellt werden. Ich benötige für jeden Datensatz in Excel 190 Spalten.
Hat jemand schnell eine Lösung?
Gruß
IKOS
Antwort 1 von coros
Hallo Ikos,
die Menge an Daten, die Du da schreibst, kannst Du nicht auf einem Tabellenblatt darstellen. Die müssen auf mehrere Tabellenblätter aufgeteilt werden. Ich habe mal vor einiger Zeit für jemanden ein Makro geschrieben, das ebenfalls mehr als 65536 Datenzeilen einließt. Als Trennzeichen wird in dem Makro das Semikolon ( ; ) benutzt. Dieses Makro habe ich mal etwas eingekürzt, so dass es auch bei Dir funktionieren sollte. Kopiere es in ein StandardModul und starte es über eine Befehlsschaltfläche.
Bei dem Makro wird zunächst ein Dialogfenster zur Auswahl der einzulesenden Datei geöffnet. Danach werden die Datensätze bis zur Zeile 65535 eingelesen und bei mehr als einer Spalte wird bei dem Trennzeichen "Semikolon" ( ; ) die Datensätze in Spalten aufgeteilt. Danach wird das nächste Blatt erstellt und die nächsten Datensätze eingelesen und getrennt. Das ganze wird soweit durchgeführt, bis alle Datensätze eingelesen wurden.
Ich hoffe, Du kommst klar. Bei Fragen melde Dich bitte.
Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
die Menge an Daten, die Du da schreibst, kannst Du nicht auf einem Tabellenblatt darstellen. Die müssen auf mehrere Tabellenblätter aufgeteilt werden. Ich habe mal vor einiger Zeit für jemanden ein Makro geschrieben, das ebenfalls mehr als 65536 Datenzeilen einließt. Als Trennzeichen wird in dem Makro das Semikolon ( ; ) benutzt. Dieses Makro habe ich mal etwas eingekürzt, so dass es auch bei Dir funktionieren sollte. Kopiere es in ein StandardModul und starte es über eine Befehlsschaltfläche.
Option Explicit
Sub Datei_einlesen()
Dim Text1 As String, firstRow As Integer
Dim txtlines As Long, i As Long, Zähler As Long
Dim WorkbookName As Workbook, ActiveSheetName As String
Rem: Für Office97 muss das Array TextArr als String definiert werden
Dim textArr As Variant, Verein As String
Dim dataFitting, ReadFile As String
Rem: Dialog öffnen auf Basis von *.dat Files
ReadFile = Application.GetOpenFilename("Alle Dateien (*.*),")
Rem: Wenn Abbruchtraste beatätigt wurde
On Error GoTo Weiter
If ReadFile = False Then Exit Sub
Weiter:
Application.ScreenUpdating = False
Rem: Leerblatt einfügen
Sheets.Add Before:=Sheets(1)
Sheets(1).Name = "Auswertung von Zeile 1"
Rem: Schliessen einer geöffneten Datei
Close #1
Rem: 1. Öffnen der Datei
Open ReadFile For Input As #1
Rem: Die Anzahl ist nötig um die Grösse des Arrays zu deklarieren
Rem: Zähler auf 0 setzen
txtlines = 0
Rem: Schleife bis Dateiende.
Do While Not EOF(1)
Rem: Hilfsvariable zum einlesen verwenden
Line Input #1, Text1
Rem: Zähler hochzählen
txtlines = txtlines + 1
Loop
Rem: Schliessen der Datei weil Dateiende erreicht wurde
Close #1
Rem: Erneutes Öffnen um zum Dateianfang zu kommen
Open ReadFile For Input As #1
Rem: Array neu auf die Anzahl der Linien initialisieren
ReDim textArr(txtlines)
Rem: Einlesen der Dateien in das Array
For i = 0 To txtlines - 1
Line Input #1, textArr(i)
Next i
Close #1
Rem: Namen vergeben
ActiveSheetName = Worksheets(1).Name
Rem: Daten in aktuelles Sheet schreiben
Zähler = 1
For i = 1 To txtlines
Application.StatusBar = "Datensatz " & i & " von " & txtlines & " wird eingelesen"
Rem: Neue Tabelle anlegen wenn Zelle 65536 erreicht wurde
If Zähler Mod 65536 = 0 Then
Rem: Aufsplitten der bisher eingelesenen Daten
Rem: Indem die Trennung anhand von der Semikolons vorgenommen wird
Application.StatusBar = "Datentrennung wird vorgenommen"
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1)
Range("A1").Select
dataFitting = False
Worksheets.Add After:=ActiveSheet
ActiveSheet.Name = "Auswertung von Zeile " & i
ActiveSheetName = ActiveSheet.Name
Zähler = Sheets("Auswertung von Zeile " & i).Range("A65536").End(xlUp).Offset(1, 0).Row
End If
Worksheets(ActiveSheetName).Cells(Zähler, 1) = textArr(i)
Zähler = Zähler + 1
Next i
End Sub
Bei dem Makro wird zunächst ein Dialogfenster zur Auswahl der einzulesenden Datei geöffnet. Danach werden die Datensätze bis zur Zeile 65535 eingelesen und bei mehr als einer Spalte wird bei dem Trennzeichen "Semikolon" ( ; ) die Datensätze in Spalten aufgeteilt. Danach wird das nächste Blatt erstellt und die nächsten Datensätze eingelesen und getrennt. Das ganze wird soweit durchgeführt, bis alle Datensätze eingelesen wurden.
Ich hoffe, Du kommst klar. Bei Fragen melde Dich bitte.
Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von ikos
super!
erst einmal vielen dank für schnelle beantwortung meines problems.
ich werde mir das script ansehen und es testen. vielleicht habe ich ja schon alle probleme damit beseitigt.
gruß
IKOS
erst einmal vielen dank für schnelle beantwortung meines problems.
ich werde mir das script ansehen und es testen. vielleicht habe ich ja schon alle probleme damit beseitigt.
gruß
IKOS
Antwort 3 von ikos
hi,
habe das script ausprobiert. daten werden zwar eingelesen, aber das trennzeichen (;) wird ignoriert. jeder datesatz wird als fester datensatz in ein feld eingelesen.
Dürfen "-zeichen als textbegrenzungszeichen enthalten sein? ich habe beides ausprobiert.
kennst du auch ein makro, das die transformation ausführt? ich muss
hier ein bsp, wie die daten aussehen. selbstverständlich haben alle artikel für jeden tag im monat eine mengenangabe:
ARTNR;TAG;MONAT;JAHR;VERBRAUCH
10-1010;01;01;2006;125
10-1010;02;01;2006;110
10-1010;03;01;2006;145
10-1010;04;01;2006;020
10-1010;05;01;2006;112
10-1010;06;01;2006;120
10-1010;07;01;2006;140
40-1040;01;01;2006;140
40-1040;02;01;2006;140
40-1040;03;01;2006;134
40-1040;04;01;2006;098
40-1040;05;01;2006;076
66-1040;01;01;2006;009
66-1040;02;01;2006;200
habe das script ausprobiert. daten werden zwar eingelesen, aber das trennzeichen (;) wird ignoriert. jeder datesatz wird als fester datensatz in ein feld eingelesen.
Dürfen "-zeichen als textbegrenzungszeichen enthalten sein? ich habe beides ausprobiert.
kennst du auch ein makro, das die transformation ausführt? ich muss
hier ein bsp, wie die daten aussehen. selbstverständlich haben alle artikel für jeden tag im monat eine mengenangabe:
ARTNR;TAG;MONAT;JAHR;VERBRAUCH
10-1010;01;01;2006;125
10-1010;02;01;2006;110
10-1010;03;01;2006;145
10-1010;04;01;2006;020
10-1010;05;01;2006;112
10-1010;06;01;2006;120
10-1010;07;01;2006;140
40-1040;01;01;2006;140
40-1040;02;01;2006;140
40-1040;03;01;2006;134
40-1040;04;01;2006;098
40-1040;05;01;2006;076
66-1040;01;01;2006;009
66-1040;02;01;2006;200
Antwort 4 von ikos
es hat alles geklappt. ich hatte einen formatierungsfeherl in meiner importdatei gehabt.
super, danke, schnelle und kompetenete hilfe !!!!
super, danke, schnelle und kompetenete hilfe !!!!

