Zum Inhalt springen

VBA Excel97 Programmierproblem


Martex

Empfohlene Beiträge

Moin Jungs,

mein chef hat mich mit einer Aufgabe betraut, die ich als nicht-programmierer sehr schwer finde.

Folgendes Problem:

Ich habe eine Textdatei, die aus unserem Datenbankprogramm (baan, falls das einer kennt) heraus erzeugt wurde und auf unix abgespeichert wird (diese Datei ist quasi das Ergebnis eines Queries), per samba hol ich mir die in Exel rein und formatier die so ein bisschen, damit ich nachher eine richtige Exceltabelle mit überschriften habe. (z.b. Kundennummer, Artikel etc....)

Jetzt wirds schwer:

Die Datei, die aus baan heraus erzeugt wird, hat meinetwegen 10 Spalten. Chef will, wenn er in baan eine zusätzliche spalte bzw ein Feld einfügt (die dann natürlich auch in der erzeugten Datei auftaucht), dass das Makro dann klug genug ist, zu merken, dass die datei eine Spalte mehr hat, sie an der korrekten Stelle (also nicht z.b immer hintendran gehangen) einzufügen und die korrekte überschrift zu setzen.

Er hat mir den tip gegeben, die zeilen und spalten zu zählen, und den wert in zwei variablen zu schreiben.

Aber was mach ich dann damit??

Wäre super, wenn mir da einer helfen könnte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

nee, nicht wirklich. Hier mal der Anfang des Makros:

Problem ist immer noch: Wenn in der Quelldatei Spalten dazukommen, soll das Makro es merken, in der zu erstellenden exceltabelle an der richtigen stelle eine spalte einfügen, datumsformat setzen etc etc (die formatierungen sind nicht so wichtig, hauptsache, ich kapiere die logik .

'*Datei öffnen und formatieren z.B.: Trennzeichen, Array(Nummerierung, option 1:standard 4:datum

Workbooks.OpenText FileName:="Z:\auswertungen\gesamt_teil2", Origin:= _

xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _

xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _

, Comma:=False, Space:=False, Other:=True, OtherChar:="|", FieldInfo _

:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _

Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _

), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 4), Array _

(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _

Array(27, 1))

'*Alles selektieren, sortieren nach spalte A, B und C

Cells.Select

Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, _

Key2:=Range("B1"), Order2:=xlAscending, _

Key3:=Range("C1"), Order2:=xlAscending, _

Header:=xlGuess

'*Alles zählen, um Datenmenge klein zu halten, Anzahl der Daten in Spalte A in

Variable-> Anzahl *

Range("AB1").Formula = "=COUNT(A:A)"

ANZAHL = Range("AB1").Value + 1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiss natürlich nicht ob ich die Aufgabe richtig begriffen hab.

Beziehst du die Spaltenüberschriften auch aus der Textdatei?

Ich mach mal 'nen Versuch.

Der enfachste Ansatz könnte so aussehen:

In einer Schleife bis Dateiende

-- Schleife bis zum Zeilenumbruch

---- Zeichenkette bis zum nächsten Separator ( oder Zeilenumbruch) lesen

---- Gelesenes in das nächste Excel-Feld schreiben

-- Schleife Ende

-- Nächste Zeile in Excel

Schleife Ende

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tut mir leid, das verstehe ich nicht.

So sieht die Datei aus, die von baan erzeugt wird und unter unix abgelegt wird, die ich mir dann in Excel reinhole.

VK |Pos|PA-Best|Kunde |Pr|Di|AA|A|S|Wert-E|PAS|VK-Liefd|PA-Liefd|Start-AG|End-AG |End-Abt |DruckDat|

xxxxxx| 50| 0 |geheimxx|xx|mr|Di|F| | x xxxx| 0|xx.xx.xx| | | | | |

Der header wird mit eingelesen (siehe Makrotext oben)

Der wird halt zu den Überschriften.

Ich habe mir überlegt, dass das Makro links anfängt zu gucken, ob die Spalte 1 in excel die überschrift "VK" hat, dann auf Spalte zwei schwenkt, guckt, ob "Pos" da ist... usw, bis mal eine sache nicht stimmt, dann an der stelle eine neue spalte einfügt, also die, die in der unix datei neu dazugekommen ist. dann die neue spalte einliest..... geht das??? Problem ist dann wohl nur, wenn ich mal eine Spalte aus der quelldatei herausnehme, bricht er wahrscheinlich ins essen... glaub ich..

Ihr seht, ich bin da nicht so versiert. Bitte helft mir, mein Chef guckt schon so komisch...

Grüße,

M

Link zu diesem Kommentar
Auf anderen Seiten teilen

hi,

ok, zum mitdenken für mich:

soll die excel-tabelle erweitert werden, oder mit jeder datei eine neue tabelle erstellt werden?

bei neuen tabellen funktioniert der ansatz (s. link oben) ganz gut.

wenn die bestehende excel-tabelle erweitert werden soll, müsste man die spaltenüberschriften abgleichen und erst die tabelle erweitern / reduzieren um danach den ansatz von oben durchexerzieren. allerdings darf man dann nicht mit der zelle A1 beginnen sondern mit der zelle in der ersten spalte in der letzten+1 spalte zeile.

hoffe, das war versändlich, ansonsten fragen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Peregrin

hi,

ok, zum mitdenken für mich:

soll die excel-tabelle erweitert werden, oder mit jeder datei eine neue tabelle erstellt werden?

-Ersteres ist der Fall-

bei neuen tabellen funktioniert der ansatz (s. link oben) ganz gut.

wenn die bestehende excel-tabelle erweitert werden soll, müsste man die spaltenüberschriften abgleichen -mit was ?- und erst die tabelle erweitern / reduzieren um danach den ansatz -welchen jetzt?- von oben durchexerzieren. allerdings darf man dann nicht mit der zelle A1 beginnen sondern mit der zelle in der ersten spalte in der letzten+1 spalte zeile.

-Ich glaube so langsam, ich bin zu dumm dafür... zum Glück bin ich kein AE geworden.

Mal im Ernst: Erklär es mal für ganz doofe (ok, du bist dau abwimmler, aber mach bitte ne ausnahme)

So nach dem Motto,

- Lese die Datei ein und formatiere sie,

- zähle die zeile und schreibe sie in die variable anzahl

- ...

Danke!

M

hoffe, das war versändlich, ansonsten fragen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine Vorgehensweise um die Überschriften in die richtige Reihenfolge zu bringen:

 Option Explicit
Dim strTxtUeberschriften(100) As String
Dim strExcelUeberschriften(100) As String
Dim strResUeberschriften(100) As String

Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim g As Integer
Dim iSpaltenIndex As Integer
Dim bGefunden As Boolean

iSpaltenIndex = 0
strTxtUeberschriften(0) = "eins": strTxtUeberschriften(1) = "zwei"
strTxtUeberschriften(2) = "drei": strTxtUeberschriften(3) = "vier"
strTxtUeberschriften(4) = "fuenf"

strExcelUeberschriften(0) = "null": strExcelUeberschriften(1) = "eins"
strExcelUeberschriften(2) = "drei": strExcelUeberschriften(3) = "vier"
strExcelUeberschriften(4) = "sechs"

For i = LBound(strResUeberschriften) To UBound(strResUeberschriften)
If strTxtUeberschriften(i) = "" Then Exit For

bGefunden = False
For j = LBound(strExcelUeberschriften) To UBound(strExcelUeberschriften)
If strExcelUeberschriften(j) = "" Then Exit For
If strTxtUeberschriften(i) = strExcelUeberschriften(j) Then
' An dieser Stelle müssen alle Excel-Überschriften, die noch nicht in'
' strResUeberschriften übernommen wurden und vor der gefundenen stehen,'
' behandelt werden.'
' Schon ausgewertete Überschriften werden mit "#####" überschrieben'
For g = 0 To j - 1
If strExcelUeberschriften(g) <> "#####" Then
strResUeberschriften(iSpaltenIndex) = strExcelUeberschriften(g)
Debug.Print iSpaltenIndex, strResUeberschriften(iSpaltenIndex)
iSpaltenIndex = iSpaltenIndex + 1
strExcelUeberschriften(g) = "#####"
End If
Next
strResUeberschriften(iSpaltenIndex) = strExcelUeberschriften(j)
strExcelUeberschriften(j) = "#####"
Debug.Print iSpaltenIndex, strResUeberschriften(iSpaltenIndex)
iSpaltenIndex = iSpaltenIndex + 1
bGefunden = True
Exit For
End If
Next
If Not bGefunden Then
strResUeberschriften(iSpaltenIndex) = strTxtUeberschriften(i)
Debug.Print iSpaltenIndex, strResUeberschriften(iSpaltenIndex)
' An dieser Stelle neue Spalte ins Excel-Sheet einfügen'
iSpaltenIndex = iSpaltenIndex + 1
End If

Next

'Zum Schluss die Excel-Überschriften hinter der letzten txt-Überschrift.'
i = 0
While strExcelUeberschriften(i) <> ""
If strExcelUeberschriften(i) <> "#####" Then
strResUeberschriften(iSpaltenIndex) = strExcelUeberschriften(i)
Debug.Print iSpaltenIndex, strResUeberschriften(iSpaltenIndex)
iSpaltenIndex = iSpaltenIndex + 1
End If
i = i + 1
Wend


End Sub
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...