Excel VBA: Shape Textbox in der Höhe anpassen

… ,aber ind der Breite fixieren

Moin Leute,
ich brauch mal dringend Hilfe!Ich habe bereits das Internet auf den Kopf gestellt, aber nichts brauchbares gefunden.

Beschreibung:
Ich erstelle per VBA ein Textfeld mit
Set shpTxtBox = WorkSheet.Shapes.AddShape(msoTextOrientationHorizontal, iLeft, iTop, iWidth, iHeight)
Wobei iHeight nachher automatisch nachgeregelt werden soll.
Jetzt pack ich unterschiedlich langen Text in die Box und die soll nun in der Höhe der länge des Textes und seinen entsprechenden Umbrüchen angepasst werden!

Mit WordWrap und MultiLine komm ich nicht weiter weil es ein Shape ist und kein Activex Textbox, mit Autosize ändert es mir immer auch die Breite. Wenn ich die Breite hinterher wieder auf mein fixes Mass zurück setze, geht der Text über die Box hinaus. Kann mir bitte jemand einen entscheidenden Tipp geben.
Am liebsten in Form von .irgendwas.AutoHeight = msoTrue :wink:

Gruß
Patrick

Code:

Set shpTxtBox = WorkSheet.Shapes.AddShape(msoTextOrientationHorizontal, iLeft, iTop, iWidth, iHeight)
With shpTxtBox
.AutoShapeType = 153
.TextFrame.Characters.Font.Size = iFontsize1
.TextFrame.HorizontalAlignment = xlCenter
.TextFrame.MarginTop = 30
.Line.Weight = 2#
.Line.DashStyle = msoLineSolid
.Line.ForeColor.RGB = RGB(0, 0, 0)
.Fill.ForeColor.RGB = RGB(250, 250, 250)
.Fill.TwoColorGradient msoGradientHorizontal, 2
.TextFrame.Characters.Text = strEtiquette
.LockAspectRatio = False
.Left = iLeft + 3
.Locked = True
End With

Hallo Patrick,

ist der Code von dir?
Dann zeige bitte mal eigenständig lauffähigen Code.

Gruß
Reinhard

Hier ein eigenständiger Code:

Sub Textbox()

Set shpTxtBox = Tabelle1.Shapes.AddShape(msoTextOrientationHorizontal, 10, 30, 100, 50)

With shpTxtBox
.AutoShapeType = 153
.TextFrame.Characters.Font.Size = 12
.TextFrame.Characters.Font.Color = RGB(0, 0, 0)
.TextFrame.HorizontalAlignment = xlCenter
.TextFrame.VerticalAlignment = xlTop
.TextFrame.MarginTop = 10
.Line.Weight = 2#
.Line.DashStyle = msoLineSolid
.Line.ForeColor.RGB = RGB(0, 0, 0)
.Fill.ForeColor.RGB = RGB(250, 250, 250)
.Fill.TwoColorGradient msoGradientHorizontal, 2
.TextFrame.Characters.Text = „Hier steht das, was in der Textbox angezeigt werden soll“ & _
„aber da so nicht reinpasst!“ 'Tabelle1.Cells(i, 1)
.LockAspectRatio = False
.Left = iLeft + 3
.Locked = True
End With

End Sub

Danke schonmal!
G
lg
Patrick

Hallo Patrick,

dein Textsatz im Code habe ich als ein Satz in A1 geschrieben.
A1 ist formatiert auf Zeilenumbruch und Vertikal=Zentriert.
Ggfs könnte man hier noch die Höhe genauer anpassen mit
.Height = Range(„A1“).Height - 8

Option Explicit

Sub Textbox()
Dim shpTxtBox, iLeft
iLeft = 200
Set shpTxtBox = Tabelle1.Shapes.AddShape(msoTextOrientationHorizontal, 10, 30, 100, 50)
With shpTxtBox
 .AutoShapeType = 153
 .TextFrame.Characters.Font.Size = 12
 .TextFrame.Characters.Font.Color = RGB(0, 0, 0)
 .TextFrame.HorizontalAlignment = xlCenter
 .TextFrame.VerticalAlignment = xlTop
 .TextFrame.MarginTop = 10
 .Line.Weight = 2#
 .Line.DashStyle = msoLineSolid
 .Line.ForeColor.RGB = RGB(0, 0, 0)
 .Fill.ForeColor.RGB = RGB(250, 250, 250)
 .Fill.TwoColorGradient msoGradientHorizontal, 2
 .Height = Range("A1").Height
 .TextFrame.Characters.Text = Range("A1").Value
' .TextFrame.Characters.Text = "Hier steht das, was in der Textbox angezeigt werden soll" & \_
' "aber da so nicht reinpasst!" 'Tabelle1.Cells(i, 1)
 .LockAspectRatio = False
 .Left = iLeft + 3
 .Locked = True
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

vielen Dank erstmal für Dein Interesse!

Leider ist mir mit der Lösung nicht geholfen, da sich mein Text zwar in einer Zelle befindet, die Grösse dieser Zelle aber nix mit der Größe der Textbox zu tun hat!

Ich hab noch eine andere Idee zur Umsetzung in betracht gezogen:
Ich könnte den Text zunächst in eine ActiveX Textbox packen und der über WordWrap und MultiLine die breite verpassen, die entstehende Höhe auslesen und plus einer Konstanten den Wert meiner ShapeTextbox zuweisen, oder?
Ausserdem bin ich verwirrt weil es so viele Möglichkeiten gibt, eine Textbox zu erzeugen: zb. AddShape, AddTextbox, Add(ClassType:=„Forms.TextBox.1“…), AddTextbox(…).OleFormat.Object…da blick ich nicht mehr durch-was nehm ich jetzt?

Hallo Patrick,

Leider ist mir mit der Lösung nicht geholfen, da sich mein
Text zwar in einer Zelle befindet, die Grösse dieser Zelle
aber nix mit der Größe der Textbox zu tun hat!

wieso nicht?
Vielleicht ist es hilfreich du lädst eine Beispielmappe hoch mit diversen langen Texten in A1:A5 und für jede Zelle eine eigene Textbox. Hochladen mit z.B. fileupload, s. FAQ:2606

Ich habe deinen Text in eine Zelle geschrieben ohne manuell da Umbrüche zu setzen.
Umgebrochen, also die Zellhöhe verändert hat dann Excel von sich aus.
Diese Zellenhöhe nahm ich dann als Höhe für die Formular-Textbox.

Ich könnte den Text zunächst in eine ActiveX Textbox packen
und der über WordWrap und MultiLine die breite verpassen, die
entstehende Höhe auslesen und plus einer Konstanten den Wert
meiner ShapeTextbox zuweisen, oder?

Die Idee hatte ich anfangs auch, an gleicher Stelle eine unsichtbare ActiveX-TextBox zu benutzen und dann deren Höhe als Höhe für die Formular-TextBox zu benutzen.
Aber dann dachte ich mir mit einer Zelle geht das doch auch.

Ausserdem bin ich verwirrt weil es so viele Möglichkeiten
gibt, eine Textbox zu erzeugen: zb. AddShape, AddTextbox,
Add(ClassType:=„Forms.TextBox.1“…),
AddTextbox(…).OleFormat.Object…da blick ich nicht mehr
durch-was nehm ich jetzt?

100 %ig sicher kann ich das nicht beantworten.
Ich merk mir da die Syntax nicht. Ich zeichne immer wenn ich so eine Box brauche ein Makro auf.
Das ist dann der Grundgerüstcode den ich dann nach meinen Wünschen anpasse.

Zu den vielen Möglichkeiten, egal welche du benutzt, im Endeffekt
ist das entstandene Objekt dann doch entweder ein Formular-Textfeld oder ein ActiveX-TextBox. Das ist aber wie gesagt nichts was ich ausreichend definitiv weiß.

In theoretischen Dingen bin ich sehr mies.
Was da der Unterschied zwischen Ole-Objekt oder .Opject ist oder gar von dem was ich auch schon sah: .Object.Object, ist mir völlig unklar.

Thomas (Ramel) weiß sowas. Thomas kann dir auch sagen wie sich außer dem was ich sagte da die Objekte die du da bei den Möglichkeiten unterscheiden.

Aber entscheiden ob du nun das Textfeld aus ActiveX oder Formular haben willst mußt du.
Schon drängt sich bei mir die Frage auf, wenn eine ActiveX-TextBox das macht was du willst, warum nimmste die dann nicht?

Gruß
Reinhard

Hallo Reinhard,
also ich hab jetzt ein bisschen rumgespielt und die adäquateste, wenn auch immer noch umständliche, Lösung ist folgende:

Ich speichere den Text, der in die Box soll in einem anderen Blatt in einer anderen Zelle zwischen, welche in Schriftgöße und Spaltenbreite ähnlich der Box ist. Durch den Zeilenumbruch und „Zeilenhöhe automatisch anpassen“ (Autofit) habe ich dann eine variable Zeilenhöhe die sich annähernd dem Inhalt der Zelle anpasst (annährend weil: Autofit funktioniert nicht immer, manchmal ist aus unempfindlichen Gründen ne Zeile zuviel drin) mit der ich dann die Höhe meiner Textbox anpasse.
Erfüllt zumindest seinen Zweck und ist noch ein wenig einfacher als die Anzahl der Zeichen und Worte auszulesen und sich ein Schema für die Umbrüche zu überlegen bzw. zu erkennen.

Vielen Dank für Deine Mühe und den entscheidenden Tip

viele Grüße
Patrick

PS:
Ich glaube, die ActiveX Boxen sind in ihrer Optik nur sehr rudimentär einstellbar. Es soll ein bisschen was fürs Auge sein, also greif ich lieber zu den Shapes.