dehein2
Goto Top

Excel Zellen zusammenfügen und formatieren

Hallo,
ich habe folgendes vor und habe mich gefragt ob ich das einfach mit Excel hinbekommen kann, und wenn ja, wie? Smile
Ich habe die angehängte Tablle (Auszug) mit einigen Spalten, diese Spalten haben Überschriften. Nicht in jeder Zeile ist in jeder Spalte etwas eingetragen.
Das Ziel ist es alle Spalten einer Zeile in einer Zelle zu verknüpfen, also so etwas wie Text A1 + B1 + C1, diesen dabei aber zu formatieren, also mit html Tags zu versehen. Diese Tags sollen abhängig von der Überschriften Spalte sein.

Also z.B für A1: A1<br> + B1 <br> .... der htmlcode soll natürlich nicht erscheinen, wenn C1 z.b. leer ist. Welcher Code eingefügt werden soll hängt von der Überschirft der Zeile ab, beinhaltet diese z.B. "Def" solles ein <b> sein, beinhaltet dieses ein Example soll am Ende ein <br> und am Anfang ein - erscheinen.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt ;) Ich habe zur Verdeutlichung noch eine Bsp. Tabelle angehängt.
Leider habe ich mit VBA keine Erfahrung, daher meine Frage.. geht das? und ist es ihne Vorkenntnisse relativ einfach zu bewerkstelligen? ;)

http://www.dehein.de/files/Bsp.xls


Vielen Dank
Dennis

Content-Key: 188429

Url: https://administrator.de/contentid/188429

Printed on: April 26, 2024 at 11:04 o'clock

Member: bastla
bastla Jul 22, 2012 updated at 18:08:10 (UTC)
Goto Top
Hallo dehein2!

Was noch nicht klar aus Deiner Beschreibung hervorgeht: Soll es für jede nicht leere Zelle einen "<br>"-Tag geben, und was ist bei Spalten, in deren Überschrift sowohl "Def" als auch "Example" enthalten sind, gewünscht?

Schließlich: Wohin soll der entstehende String geschrieben werden?

Wie sähe denn zB für eine Zeile Deiner Beispieldatei das Ergebnis aus?
Unabhängig von den fehlenden Details könnte das schematisch etwa so aussehen:
Sub MakeHTML()
UeberZeile = 1 'Zeile mit Überschriften  
UeberAbSpalte = 1 '= A; Spalte mit erster Überschrift  

Dim Pre, Post
UeberSpalteMax = Cells(UeberZeile, UeberAbSpalte).End(xlToRight).Column
ReDim Pre(UeberSpalteMax), Post(UeberSpalteMax)
For Spalte = UeberAbSpalte To UeberSpalteMax
    Post(Spalte) = "<br>" 'nach jedem nicht leeren Wert  
    If InStr(Cells(UeberZeile, Spalte).Value, "Example") > 0 Then 'wenn Überschrift "Example" enthält  
        Pre(Spalte) = "- " 'vor dem Wert einzufügen  
        Post(Spalte) = Post(Spalte) & "<br>" 'nach dem Wert zusätzlich einzufügen  
    End If
    If Cells(UeberZeile, Spalte).Value Like "Def*" Then 'wenn Überschrift mit "Def" beginnt  
        Pre(Spalte) = "<b>" 'vor dem Wert einzufügen  
        Post(Spalte) = "</b>" & Post(Spalte) 'nach dem Wert einzufügen  
    End If
Next

Zeile = UeberZeile + 1
HTML = ""  
Do While Cells(Zeile, UeberAbSpalte).Value <> 0 'alle Zeilen bearbeiten, in denen in der ersten Spalte ein Wert steht  
    For Spalte = UeberAbSpalte To UeberSpalteMax
        Inhalt = Cells(Zeile, Spalte).Value
        If Inhalt <> "" Then HTML = HTML & Pre(Spalte) & Inhalt & Post(Spalte) 'HTML-Code um Wert + Präfix + Postfix ergänzen  
    Next
    HTML = HTML & "<br><br>" 'am Ende jeder Zeile hinzufügen  
    Cells(Zeile, Spalte).Value = HTML 'HTML-Code in die erste Spalte, die keine Überschrift hat, eintragen  
    Zeile = Zeile + 1
Loop
End Sub
Grüße
bastla
Member: dehein2
dehein2 Jul 22, 2012 updated at 18:09:06 (UTC)
Goto Top
Hallo,
also wenn nichts in der Spalte steht soll auch nichts in der Ausgabe stehen, also auch kein <br>.
Die Spalten mit Def Exmaple sind eigentlich nur Example, das könnte ich entsprechend umbennenen, sind also eigenständig.
Es sollen quasi alle "Def i" i=1-? eine Formatiereung haben und alle "Def Example i" i=1-? eine andere.

Der entstehende String sollte einfach in irgendeiner Spalte stehen, ich kann ihn ja später hinkopieren wo ich möchte ;)

Für die erste Zeile stelle ich mir das so vor: (habe es mal mit Zeilenumbruch aufgeschrieben)

<b>abandon</b> - verb<br>
<a href="xyz.com">abandon</a>  
<p> <b> - to leave somebody, especially somebody you are responsible for, with no intention of returning</b> <br>
--The baby had been abandoned by its mother.<br>
--People often simply abandon their pets when they go abroad.<br>
--The study showed a deep fear among the elderly of being abandoned to the care of strangers.<br>

<p><b> - to leave a thing or place, especially because it is impossible or dangerous to stay Synonym leave</b><br>
-- Snow forced many drivers to abandon their vehicles. <br>

usw.....
wie ganz genau ich die html Sachen mache habe ich mir noch nicht überlegt, muss ich dann einmal sehen wie es aussieht. Das ganze ist für ein Flashcard Programm auf dem iPad, welches html versteht.

Vielen Dank
Dennis
Member: bastla
bastla Jul 22, 2012, updated at Jul 23, 2012 at 06:37:05 (UTC)
Goto Top
Hallo dehein2!

Angepasst sähe das dann so aus:
Sub MakeHTML()
UeberZeile = 1 'Zeile mit Überschriften  
UeberAbSpalte = 1 '= A; Spalte mit erster Überschrift  

Dim Pre, Post
UeberSpalteMax = Cells(UeberZeile, UeberAbSpalte).End(xlToRight).Column
ReDim Pre(UeberSpalteMax), Post(UeberSpalteMax)
For Spalte = UeberAbSpalte To UeberSpalteMax
    UeberText = Cells(UeberZeile, Spalte).Value

    Select Case UeberText 'für alle Fälle, in denen die Überschrift genau angegeben werden kann  
        Case "Type"  
            Post(Spalte) = "<br>"  
        Case "Url"  
            Pre(Spalte) = "<a href="""  
            Post(Spalte) = """>"  
        Case "Vocab"  
            Post(Spalte) = "</a>"  
    End Select
    
    If UeberText Like "Def*" Then 'wenn Überschrift mit "Def" beginnt  
        Pre(Spalte) = "<p> <b>- " 'vor dem Wert einzufügen  
        Post(Spalte) = "</b> <br>" & Post(Spalte) 'nach dem Wert einzufügen  
    End If
    
    If UeberText Like "*Example*" Then 'wenn Überschrift "Example" enthält  
        Pre(Spalte) = "--" 'vor dem Wert einzufügen  
        Post(Spalte) = Post(Spalte) & "<br>" 'nach dem Wert einzufügen  
    End If
Next

Zeile = UeberZeile + 1
Do While Cells(Zeile, UeberAbSpalte).Value <> 0 'alle Zeilen bearbeiten, in denen in der ersten Spalte ein Wert steht  
    HTML = "<b>" & Cells(Zeile, UeberAbSpalte + 2).Value & "</b> - " 'jede Zeile mit diesem Code beginnen  

    For Spalte = UeberAbSpalte To UeberSpalteMax 'alle Spalten der Reihe nach durchgehen  
        Inhalt = Cells(Zeile, Spalte).Value
        If Inhalt <> "" Then HTML = HTML & Pre(Spalte) & Inhalt & Post(Spalte) 'HTML-Code um Wert + Präfix + Postfix ergänzen  
    Next

    HTML = HTML & "<br><br>" 'am Ende jeder Zeile hinzufügen  
    Cells(Zeile, Spalte).Value = HTML 'HTML-Code in die erste Spalte, die keine Überschrift hat, eintragen  
    Zeile = Zeile + 1
Loop
End Sub
wobei die Stuktur der Tabelle noch nicht optimal ist - der obige Code setzt daher voraus, dass die Spaltenreihenfolge
"Type" - "Url" - "Vocab" - Rest wie bisher
lautet.

Grüße
bastla
Member: dehein2
dehein2 Jul 23, 2012 at 05:45:15 (UTC)
Goto Top
Wow. VIELEN DANK. Das klappt ja super, leider verstehe ich es auf den ersten Blick noch nicht komplett ;) aber es funktioniert ja ^^.
Eine kleine Frage daher noch, das habe ich oben leider vergessen. Am Ende folgen ja noch die Spalten "Usage Note Head" und mehrere "Usage Note Ex i".. wie würde ich jetzt weitere Spalten einbauen?

nochmal vielen, vielen Dank
Member: bastla
bastla Jul 23, 2012 at 06:45:50 (UTC)
Goto Top
Hallo dehein2!
wie würde ich jetzt weitere Spalten einbauen?
Einfach hinzufügen - es werden alle zusammenhängenden Spalten, für die es eine Überschrift in der in Zeile 2 des Codes festgelegten Überschriftenzeile gibt, verarbeitet ...
leider verstehe ich es auf den ersten Blick noch nicht komplett ;)
Riskiere einfach noch ein paar weitere Blicke ... face-wink

Grundsätzlich wird in den Zeilen 11 bis 29 für jede Spalte ermittelt, ob vor oder nach dem Wert dieser Spalte noch ein Eintrag erfolgen muss (stehen dann in Pre() und Post()) - in den ersten Fällen ("Type", "Url", "Vocab") wird exakt mit der Spaltenüberschrift verglichen und bei Übereinstimmung jeweils der "Vorspann" und "Nachspann" festgelegt; die Zeilen 21 - 24 stehen für die Variante "Beginn der Überschrift prüfen" und 26 - 29 (habe ich noch etwas leichter nachvollziehbar geschrieben) sind ein Beispiel für die Fragestellung "Enthält die Überschrift den Suchbegriff?").

Hinsichtlich der einzufüenden Tags / Zeichen ist eigentlich nur eine Besonderheit zu beachten: Enthält der String ein Anführungszeichen, so muss dieses verdoppelt werden (siehe Zeilen 15 und 16).

Bei der Zuweisung kann entweder die Schreibweise
Post(Spalte) = ...
verwendet werden, um nur diesen Eintrag für diese Spalte zu verwenden, oder
Post(Spalte) = Post(Spalte) & ...
um zusätzlich zu einem schon vorher gesetzten "Nachspann" noch mehr anzufügen (falls eine Spalte in mehrere Kategorien fallen könnte, was nach derzeitigem Stand aber eher nicht zutreffen solle - ich hab's aber mal für die "Example"-Spalten so eingetragen).

Die Zeilen 34 und 41 definieren jeweils Beginn und Ende der HTML-Zeile - so wird in Zeile 34 zunächst schon mal der Wert aus der dritten Datenspalte (UeberAbSpalte + 2) mit der entsprechenden Formatierung an den Anfang der Zeile gestellt und in Zeile 41 an das Ende der Zeile noch "<br><br>" geschrieben.

Grüße
bastla
Member: dehein2
dehein2 Jul 23, 2012 at 10:18:56 (UTC)
Goto Top
ich glaube, ich habe es hinbekommen... nochmals vielen Dank