Spaltenausgabe

Mimas

Grünschnabel
Hallo zusammen,

wie ich schon in meinem letzten Post gesagt habe bin ich noch ein blutiger Anfänger auf dem Gebiet VB(A).

Folgendes Problem.

Meine Eingabe ist beispielsweise "aaa;bbb;ggg;ccc;""Hallo zusammen;daraus würde ich gerne eine Spalte;machen!""", ";")

Die Suche nach dem Delimiter war nicht ganz so schwer und das habe ich glaube ich auch ganz gut hinbekommen.. nur wie mache ich aus diesem Beispiel eine Spalte, sprich wenn Anführungszeichen erscheinen darf das Programm keine Rücksicht mehr auf die Delimiter machen..

Hier mein Code:

Code:
unction TextCleft(iSpaltenNr As Integer, sTextInhalt As String, sTrenner As String)


Dim idelimPos As Integer
Dim iSonderzeichen As Integer
Dim iSonderStartPos As Integer
Dim iSonderEndPos As Integer
Dim iStartPos As Integer
Dim iEndPos As Integer
Dim iZähler As Integer
Dim iEingabe As Integer
Dim sTrennZeichen As String
Dim sAnfzeichen As String
Dim sAusgabe As String
Dim sSpaltenInhalt As String

sAnfzeichen = """"


sTrennZeichen = sTrenner

iEingabe = iSpaltenNr
iStartPos = 1
iZähler = 0


sSpaltenInhalt = sTextInhalt


' wenn Anführungszeichen vorkommen, Inhalt bis zum nächsten als eine Spalte ausgeben
' deaktivierung


'finde gewünschte Spalte
Do While iZähler < iSpaltenNr - 1
    
    'Position des ersten Delimiter bestimmen
    idelimPos = InStr(iStartPos, sTextInhalt, sTrennZeichen)
    'Position des ersten " bestimmen
    iSonderzeichen = InStr(iStartPos, sTextInhalt, sAnfzeichen)
    
    If idelimPos = sSonderzeichen - 1 Then
        iSonderStartPos = iSonderzeichen
    End If
    'Überprüfen ob es sich um eine gültige Spalte handelt
    If idelimPos > 0 Then
        iZähler = iZähler + 1
        iStartPos = idelimPos + 1
    Else
        MsgBox ("Ungültige Spalte!")
        End
    End If
Loop

If iStartPos = "" Then
        

    
iSonderStartPos = iSonderStartPos + 1
 ' neue Endposition bestimmen
iEndPos = InStr(iStartPos, sTextInhalt, sTrennZeichen)
iSonderEndPos = InStr(iSonderStartPos, sTextInhalt, sAnfzeichen)
    

sAusgabe = Mid(sTextInhalt, iSonderStartPos, iSonderEndPos - iSonderStartPos)
'MsgBox (iAusgabe)

If iEndPos > 0 Then
    ' einlesen der ersten bis zur vorletzten Spalte
    sAusgabe = Mid(sTextInhalt, iStartPos, iEndPos - iStartPos)
Else
    ' einlesen der letzten Spalte
    iEndPos = Len(sTextInhalt)
    sAusgabe = Mid(sTextInhalt, iStartPos, iEndPos - iStartPos + 1)
End If
  
   'Rückgabewert
TextCleft = sAusgabe
    
End Function

Freue mich über jede Hilfe..

Viele Grüße
Mimas
 
Hallo Mimas,
ich frage mich gerade wieso du eigentlich einen so komplizierten Weg gehst? Du willst doch sicherlich eine Textdatei auslesen oder irgendwie importieren. (So wie es aussieht sogar in Excel) Reichen Dir die "normalen" Routinen nicht?

Naja wie dem auch sei sobald du ein "gefunden hast must du mit deinem Algorithmus warten und solange ein Zeichen weiterspringen bis du das nächste " gefunden hast.

Grüsse bb
 
hallo Brainbyte, vielen Dank für deine Antowrt.

Würde gerne einen simpleren Weg gehen, doch meine Aufgabe besteht daraus eine Funktion in Excel zu schreiben die genau eben das macht.

der Ablauf ist mir ungefähr klar, nur die Einbindung in VB ist mir noch unschlüssig. ich weis einfach nicht wie ich das Codetechnisch lösen muss..

Vielleicht hast du dahingehend einen kleinen Tip für mich?

Viele Grüße
Mimas
 
Also du könntest es ja auch mit der Excelimport funktion machen etwa so
Visual Basic:
Workbooks.OpenText Filename:= _
        "c:\Dateiname.txt", Origin:=1250, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, 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, 1), Array(20, 1), Array(21, 1), Array(22, 1), _
        Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _
        29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), _
        Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), Array(40, 1), Array(41, 1), Array( _
        42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array(46, 1), Array(47, 1), Array(48, 1)) _
        , TrailingMinusNumbers:=True

hierbei musst du nur wissen wieviele spalten es gibt ;-)

sonst würde ich das so machen

Visual Basic:
strDel = ";"
strSond = """"
stext = Zeilezulesen
while not  Len(ZeileZulesen) 
      if not blnSonderFound then
       if mid(Zeilezulesen,1,1) = strdel then
            debug.print spalte
            ' hier müsste dann die eigentliche Spaltenzuweisung rein
             zeilezulesen = Mid(Zeilezulesen,2) 
       else 
          if mid(Zeilezulesen,1,1) =strSond  then blnsonderfound = true 
          spalte = spalte +mid(Zeilezulesen,1,1)
          zeilezulesen = Mid(Zeilezulesen,2) 
       end if 
     else 
          if mid(Zeilezulesen,1,1) =strSond  then blnsonderfound = false
          spalte = spalte +mid(Zeilezulesen,1,1)
          zeilezulesen = Mid(Zeilezulesen,2) 
          end  if
     end if

Grüsse bb

PS: Mir war dein Code zu lang um es dort einzubauen deswegen habe ich das mal schnell neu geschrieben. Ist nicht getestet sollte aber laufen
 
Hallo bb,

super vielen dank dafür.. werde es austesten.. sieht zwar noch ein wenig verwirrend aus, aber ich hoffe das ich da schon durchsteigen werde...

mfg
Mimas
 
Zurück