Microsoft Excel

Herbers Excel/VBA-Archiv

Textdarstellung, Zeilenumbruch über mehrere Zellen

Betrifft: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 18.08.2004 09:08:59

Hallo Leute,

ich habe ein Problem, und moechte eigentlich von euch nur die Bestaetigung, dass es dafuer keine Loesung gibt ;-)

Folgendes:
Ich moechte eine Liste erstellen, die einerseits Fliesstext und andererseits Formeln enthaelt.
Nun wird aber gewuenscht, dass ein Zeilenumbruch erfolgt, ohne die Zeile in der Hoehe zu veraendern.
D.h. der Inhalt einer Zelle soll in mehrere Zellen geschrieben werden,
so dass anschliessend weiterhin nur eine Zeile pro Zelle enthalten ist.
Ich hoffe, ich habe mich verstaendlich ausgedrueckt und wuerde mich ueber Antworten sehr freuen...

Gruß,
Andi

  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 18.08.2004 09:12:18

hallo andi

ich habe mühe, die frage zu verstehen.. ein beispiel würde vielleicht helfen.
übrigens, mit vba ist vieles möglich.. :-)

gruss joel


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 18.08.2004 09:22:41

Oh, sorry,

also noch ein Versuch:
ich moechte einen Fliesstext in die Zellen einer Spalte schreiben.
Z.B. einen Arbeitsauftrag mit mehreren Arbeitsschritten.
Nun soll aber nach jedem Arbeitsschritt durch Return in die naechste Zeile gesprungen werden, so dass man den einzelnen Schritten Werte zuordnen kann.
Das Problem kann man manuell loesen, indem man einfach nur soviel in eine Zeile schreibt, wie reinpasst und dann in der naechsten Zeile weiterschreibt, aber das ist ja was fuer Amateure ;-)

Hoffe, das war jetzt verstaendlich, ansonsten starte ich gerne noch einen Versuch...
Vielen Dank schon man, Andi


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 18.08.2004 09:36:00

hallo andi

du hast also eine listbox, aus der du einen eintrag auswählst. dieser soll dann auf mehrere zellen aufgeteilt werden. was sind die kriterien, in die nächste zelle zu springen? sobald eine zelle gefüllt ist, oder sobald eine zahl folgt, ein punkt, etc.???

gruss joel


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 18.08.2004 09:43:24

Oh, da macht mir aber jemand Hoffnung ;-)
Das Kriterium fuer den Sprung in die naechste Zeile sollte die volle Zelle sein.


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 18.08.2004 11:56:22

hallo andi

so, hab da was gebastelt.. musst es evtl. noch ein wenig anpassen, hoffe, das kriegst du hin.

das ganze funzt relativ einfach: er schreibt zeichen für zeichen des textes in die zelle. sobald ein zeilenumbruch folgen würde, wird in die nächste zelle gesprungen

kannst das ganze ausprobieren in einem neuen file, in zelle A1 schreibst du den text, dann TextInZellenSchreiben aufrufen (z.b. mit F5)

'prüfen, ob mit der text nun auf zwei zeilen geschrieben wird
Private Function TextUmbruch(ByVal c As Range) As Boolean
    Dim fHoeheOhneUmbruch As Single
    Dim fHoeheMitUmbruch As Single

    'zeilenhöhe ohne zeilenumbruch
    c.WrapText = False
    c.EntireRow.AutoFit
    fHoeheOhneUmbruch = c.EntireRow.RowHeight
    
    'zeilenhöhe mit zeilenumbruch
    c.WrapText = True
    c.EntireRow.AutoFit
    fHoeheMitUmbruch = c.EntireRow.RowHeight
    
    TextUmbruch = (fHoeheOhneUmbruch < fHoeheMitUmbruch)
End Function


Public Sub TextInZellenSchreiben()

Dim sText As String

Dim lPos As Long 'position in sText
Dim c As Range 'zelle, in die text geschrieben werden soll
Dim s As String 'teil des textes (zeichen 1 bis lPos)

Dim lTextLaenge As Long 'länge des noch zu schreibenden textes

'text auslesen
sText = CStr(Tabelle1.Range("A1").value)

'erste zelle, in die text geschrieben werden soll auslesen
Set c = Tabelle1.Range("A2")

For lPos = 1 To Len(sText)
'nächstes zeichen in zelle schreiben
c.value = c.value & Mid(sText, lPos, 1)

'falls zeilenumbruch erfolgt, letztes zeichen in nächste zelle schreiben
If TextUmbruch(c:=c) = True Then
c.value = Left(c.value, Len(c.value) - 1)
Set c = c.Offset(1, 0)
c.value = Mid(sText, lPos, 1)
End If
Next lPos
End Sub


gruss joel


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 18.08.2004 14:38:33

Super, vielen Dank!
Funktioniert so, wie du das geschrieben hast.
Kann das von der Logik auch sehr schoen nachvollziehen.
Programmieren kann ich auch durchaus ein wenig. Nur leider nicht vba.
Wenn du mir noch sagen koenntest, wie ich als Abbruchkriterium nicht nur die volle Zeile, sondern das letze Wort vor Ende der Zeile einbauen kann, waere ich wunschlos gluecklich :-)
Denn so schneidet er ja jedes Wort am Ende der Zeile ab, was natuerlich nicht so schoen lesbar ist.

Noch mal vielen Dank fuer die prompte und ausfuehrliche Hilfe,
Andi


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 18.08.2004 17:11:02

hallo andi

sorry, dass ich mich erst jetzt wieder melde. hab heut viel um die ohren

Sub TextInZellenSchreiben()

    Dim sText As String
    
    Dim lPos As Long        'position in sText
    Dim c As Range          'zelle, in die text geschrieben werden soll
    
    Dim lTextLaenge As Long 'länge des noch zu schreibenden textes
    
    'text auslesen
    sText = CStr(Tabelle1.Range("A1").Value)
    
    'erste zelle, in die text geschrieben werden soll auslesen und löschen
    Set c = Tabelle1.Range("A2")
    c.ClearContents
    
    For lPos = 1 To Len(sText)
        'nächstes zeichen in zelle schreiben
        c.Value = c.Value & Mid(sText, lPos, 1)
        
        'NEU: falls zeilenumbruch erfolgt, letztes wort in nächste zelle schreiben
        If TextUmbruch(c:=c) = True Then
        
            'inhalt der folgenden zelle löschen
            c.Offset(1, 0).ClearContents
            
            'prüfen, ob ein leerzeichen (oder ähnliches) in der zelle enthalten ist
            If InStr(c.Value, " ") >= 1 Or _
               InStr(c.Value, "-") >= 1 Or _
               InStr(c.Value, "/") >= 1 Then
               
            ' - falls ja: text bis zum letzten leerzeichen (oder ähnliches) in
            '             die nächste zelle schreiben
                Do While (Right(c.Value, 1) Like "[ -/]" = False)
                    c.Offset(1, 0).Value = Right(c.Value, 1) & c.Offset(1, 0).Value
                    c.Value = Left(c.Value, Len(c.Value) - 1)
                Loop
                
            ' - falls nein: nur letztes zeichen in nächste zelle schreiben
            Else
                c.Offset(1, 0).Value = Right(c.Value, 1)
                c.Value = Left(c.Value, Len(c.Value) - 1)
            End If
            
            Set c = c.Offset(1, 0)
        End If
    Next lPos
End Sub



gruss joel


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 19.08.2004 10:25:13

Hi,

auch das klappt wiederum bestens. Lob und Anerkennung fuer die gute Unterstuetzung!
Leider bin ich doch noch nicht so wunschlos gluecklich wie ich dachte.
Mein Problem ist nun naemlich der dynamische Zellbezug.
Man kann doch bestimmt in VBA realisieren, dass das Makro nicht fuer eine feste Zelle ausgefuehrt wird, sondern beispielsweise fuer die Zelle, die markiert ist.
Dachte, ich bekomme das selber hin, aber ich habe leider zu wenige Kenntnisse um das entsprechende Wissen aus dem Forum zu ziehen :-(

Gruß,
Andi


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 19.08.2004 10:45:25

hallo andi

kein problem: selection gibt dir den selektierten bereich zurück. falls nun mehrere zellen selektiert sind, kannst du dies entweder für alle selektierten zellen durchführen (codebeispiel 1) oder aber nur für die erste zelle des selektierten bereichs (codebeispiel 2)

codebeispiel 1:
dim c as range

for each c in selection
'prozedur durchführen mit c
next c

codebeispiel 2:
dim c as range
set c = selection.cells(1,1)
'prozedur durchführen mit c


gruss joel


ps: falls du weitere fragen hast, die sich nicht wirklich auf den ersten titel im thread beziehen, beginne doch bitte neue threads.. die nächsten suchenden werdens dir danken! du kannst ja immer noch einen link zum 'alten' thread reinkopieren


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 19.08.2004 10:48:39

Ich glaube ich habe es nun doch selber hinbekommen.
Habe die absoluten Zellbezuege einfach wie folgt abgeaendert:
...
sText = CStr(Selection.Value)
Setc = Selection
C.Clear Contents
...

Scheint soweit auch zu funktionieren...

Vielen Dank Joel fuer deine Muehe,
Andi


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 19.08.2004 11:27:08

hallo Andi

genau, das klappt so.. falls du mehrere zellen selektierst, liefert dir Selection.value den wert der ersten zelle, also Selection.cells(1,1).value - eine frage der standardeigenschaften und so. für die programmierung ist jedoch die zweite lösung sauberer...

noch etwas:
falls du die prozedur automatisch starten möchtest, sobald du den wert in der listbox änderst, kannst du das mit dem Worksheet_Change - ereignis tun. es liefert dir mit Target die geänderte zelle. nun noch prüfen, ob diese zelle eine liste enthält, falls ja, die prozedur starten.

zum prüfen, ob zelle mit liste:

if Not application.intersect(Target,Tabelle1.cells.specialcells(xlCellTypeValidation) is nothing then
if Target.Validation = xlValidateList then
'prozedur starten
end if
end if

viel spass
gruss joel


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: Andi
Geschrieben am: 19.08.2004 14:16:43

Hm,
nun hast du mich neugierig gemacht.
Klar waere das umso cooler, wenn das automatisch ginge :-)
Aber wie, das verstehe ich noch nicht ganz.
Verstehe das mit dem Worksheet_Change eh noch nicht so ganz.
Das scheint ja praktisch ein vorgebene VBA-Funktion zu sein.
Wieso benutze ich die dann nicht einfach?
Verschatte ich sie stattdessen, da nur der Funktionsrumpf vorgegeben ist?

Falls du dich noch an den restlichen Code erinnerst, wie rufe ich denn meine Prozedur zum Textumbruch genau auf? So geht's jedenfalls nicht:

Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Application.Intersect(Target, Tabelle1.Cells.SpecialCells(xlCellTypeValidation)) Is Nothing Then
If Target.Validation = xlValidateList Then
Target.TextInZellenSchreiben
End If
End If
End Sub


Allerdings verstehe ich eh noch nicht so recht, wie der Zugriff aufeinander erfolgt.
Gehoert das zusammen in ein Modul, oder wie laeuft das? Was sind ueberhaupt Module in VBA?
Langsam wird mir das echt zu kompliziert ;-)

Gruß,
Andreas


  


Betrifft: AW: Textdarstellung, Zeilenumbruch über mehrere Zellen von: joel
Geschrieben am: 19.08.2004 15:06:14

hallo andreas

ok, lass uns das ganze mal ein wenig entwirren...

wenn du bei deinem projekt in den VB-Editor wechselst, siehst du links dein VBA-projekt:

-thisworkbook
-tabelle1
-tabelle2, etc.

dies sind die microsoft excel-objekte. nun gibt es hier noch formulare, module und klassenmodule. du kannst diese u.a. über den menübefehl "einfügen" einfügen.

rechts davon hast du den codebereich (resp. formularlayout-bereich, falls du ein neues formular einfügst, dass ist dann jedoch wieder eine andere sache...)

im codebereich kannst du nun funktionen, prozeduren, variablen, etc. definieren. etwas, was für dich vielleicht neu ist, sind die ereignisse. diese kannst du ebenfalls selbst definieren. VB nimmt dir hier jedoch einiges an arbeit ab und hat die wichtigsten ereignisse bereits definiert:

oben im codebereich hast du eine listbox mit folgenden einträgen:
-(allgemein)
-worksheet

wähle hier worksheet und klicke nun in die rechte listbox. hier siehst du jetzt alle vordefinierten ereignisse für worksheet.

(falls du im projekt-explorer "thisworkbook" doppelklickst, findest du alle ereignisse des workbooks, z.b. Workbook_open, etc...)

du musst jetzt hier also das ereignis Worksheet_Change auswählen.

in diesem ereignis brauchst du nun also nur noch die prozedur mit dem zeilenumbruch aufzurufen.
hier kein durcheinander machen mit den klassen...

dim c as range: c ist also eine instanz der klasse range. die funktion "TextInZellenSchreiben" gehört nicht zu dieser klasse, sie ist ja nicht in der klasse definiert. vielmehr steht die funktion im "objekt" Tabelle1. das heisst, diese funktion, resp. prozedur ist eine methode des objekts tabelle1. sofern diese "public" ist, kannst du sie also über Tabelle1.TextInZellenSchreiben aufrufen (solange du die prozedur aus tabelle1 aufrufst, kannst du tabelle1 weglassen). Die Zelle c kannst du als Argument übergeben, dazu musst du jedoch die Definition der Prozedur anpassen:

Public
Sub TextInZellenSchreiben(byval c as range)
...
End Sub


so, soviel mal fürs erste.. damit solltest du ein wenig klarer sehen..

gruss joel


 

Beiträge aus den Excel-Beispielen zum Thema "Textdarstellung, Zeilenumbruch über mehrere Zellen"