Shapes.TextFrame.Characters.Text bearbeiten ohne ...
-
- Beiträge: 52
- Registriert: 30. Mai 2024, 19:42
- Hat sich bedankt: 5 Mal
- Danksagung erhalten: 52 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Hi ihr Beiden. Ich nochmal.
Hier eine Idee von meiner Seite:
Ich würde hier jedem Hauptshape, das einen Buchstaben enthalten soll über OnAction das gleiche Makro zuweisen, in dem der Name des Shapes in eine Globale Variable gespeichert wird und danach eine beliebige Zelle angewählt wird. (Ende des ersten Makros!)
Nun kannst du in einem zweiten Schritt auf Application.OnKey reagieren und den Buchstaben der gedrückten Taste direkt in das Shape schreiben dessen Namen du aus der Variablen ausliest.
Die Codierung wird ein bisschen Tipparbeit. aber auf die Mini-Userforms kannst du damit verzichten. und die Eingabe ist eleganter.
Fall dus noch eleganter willst könntest du in Version2 dann noch als Verbesserung in einem zweidimensionalen Array alles Shapenamen zeilen- und spaltenweise hinterlegen, und so später ermitteln welcher Shapename als nächstes rechts vom aktiven Shape liegt. Beim Tastendruck auf einen Buchstaben wird so das jeweils nächste Shape angewählt und der Buchstabe dort eingetragen.
Soweit meine Idee. Coden musst du das selbst. Ich bin sicher das kriegst du hin. Ansonsten melde dich.
Gruß Mr. K.
Hier eine Idee von meiner Seite:
Ich würde hier jedem Hauptshape, das einen Buchstaben enthalten soll über OnAction das gleiche Makro zuweisen, in dem der Name des Shapes in eine Globale Variable gespeichert wird und danach eine beliebige Zelle angewählt wird. (Ende des ersten Makros!)
Nun kannst du in einem zweiten Schritt auf Application.OnKey reagieren und den Buchstaben der gedrückten Taste direkt in das Shape schreiben dessen Namen du aus der Variablen ausliest.
Die Codierung wird ein bisschen Tipparbeit. aber auf die Mini-Userforms kannst du damit verzichten. und die Eingabe ist eleganter.
Fall dus noch eleganter willst könntest du in Version2 dann noch als Verbesserung in einem zweidimensionalen Array alles Shapenamen zeilen- und spaltenweise hinterlegen, und so später ermitteln welcher Shapename als nächstes rechts vom aktiven Shape liegt. Beim Tastendruck auf einen Buchstaben wird so das jeweils nächste Shape angewählt und der Buchstabe dort eingetragen.
Soweit meine Idee. Coden musst du das selbst. Ich bin sicher das kriegst du hin. Ansonsten melde dich.
Gruß Mr. K.
- Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
- d'r Bastler
- d'r Bastler
- Beiträge: 832
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 224 Mal
- Danksagung erhalten: 118 Mal
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Moin Mr. K.
die Idee, einen kleinen Umweg über eine Zelle zu machen (so habe ich es verstanden) finde ich hervorzüglich! Auch der Ansatz, eine frisch belegte Zelle als Ausgangspunkt für die nächste Eingabe zu nutzen, gefällt mir gut. Mit meiner Mini-USF hatte ich das zumindest für Zeilen (waagerecht) auch schon realisiert.
Allerdings nur in Anlehnung an die Fragenr. Die kann Startpunkt für Zeilen aber auch Spalten (senkrecht) sein. Ist sie bidirektional belegt, habe ich auf den Automatismus verzichtet, weil ich kein Kriterium mehr hatte.
Meine Zellen sind von 1 bis 72 durchnummeriert. Was die Möglichkeit eröffnet, für zumindest die meisten Zellen ohne Fragenr. die Richtung des nächsten Eintrags zu definieren. Das als erstes Kriterium. Danach könnten leere/belegte Zellen die Richtung weisen. Mit USF hatte ich schon an vier kleine CommandButtons gedacht, die zum nächsten Shape führen, ohne die USF zu schließen. [Giraffe mit Rollschuhen und Küchenschürze
]
Ich sehe schon: Hatte ich vor, mir ein Tool zu bauen, mit dem man Rätsel erstellen kann, habe ich mir selbst ein Rätsel gebaut. Winterzeit ist Schmalzzeit! Da werde ich wohl noch einiges an Hirnschmalz investieren müssen
Gecoded sollte ich das tatsächlich bekommen. Vielen Dank für Dein Vertrauen in meine VBAstelkünste
Schöne Grüße und besten Dank!!
heb
die Idee, einen kleinen Umweg über eine Zelle zu machen (so habe ich es verstanden) finde ich hervorzüglich! Auch der Ansatz, eine frisch belegte Zelle als Ausgangspunkt für die nächste Eingabe zu nutzen, gefällt mir gut. Mit meiner Mini-USF hatte ich das zumindest für Zeilen (waagerecht) auch schon realisiert.
Allerdings nur in Anlehnung an die Fragenr. Die kann Startpunkt für Zeilen aber auch Spalten (senkrecht) sein. Ist sie bidirektional belegt, habe ich auf den Automatismus verzichtet, weil ich kein Kriterium mehr hatte.
Meine Zellen sind von 1 bis 72 durchnummeriert. Was die Möglichkeit eröffnet, für zumindest die meisten Zellen ohne Fragenr. die Richtung des nächsten Eintrags zu definieren. Das als erstes Kriterium. Danach könnten leere/belegte Zellen die Richtung weisen. Mit USF hatte ich schon an vier kleine CommandButtons gedacht, die zum nächsten Shape führen, ohne die USF zu schließen. [Giraffe mit Rollschuhen und Küchenschürze

Ich sehe schon: Hatte ich vor, mir ein Tool zu bauen, mit dem man Rätsel erstellen kann, habe ich mir selbst ein Rätsel gebaut. Winterzeit ist Schmalzzeit! Da werde ich wohl noch einiges an Hirnschmalz investieren müssen


Schöne Grüße und besten Dank!!
heb
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
- theos
- Beiträge: 51
- Registriert: 15. Sep 2022, 21:48
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 35 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Die Richtung und Eingabereihenfolge sind mir gestern auch durch den Kopf gegangen.
Bei den ActiveX Dingern kann man die Tabreihenfolge einstellen, bzw stellt sich selbst auf die Zahl, wann sie zeitlich eingefügt wurde. Das kannst du ja ausnützen indem du die erste Form anklicken lässt, deren Tabreihenfolge ausliest und dann auf die nächste springst. Da gibt's auch diverse Ereignisse zum programmieren. Makro der bei Änderung ausgeführt wird, oder beim Verlassen.
Du könntest aber, ganz banal, einfach große Zellen benutzen, Gitter ausblenden und die zu bearbeitenden mit Rahmen versehen. Eine Beschränkung auf Buchstaben mit Länge 1 ist ganz easy zu kriegen.
Bei den ActiveX Dingern kann man die Tabreihenfolge einstellen, bzw stellt sich selbst auf die Zahl, wann sie zeitlich eingefügt wurde. Das kannst du ja ausnützen indem du die erste Form anklicken lässt, deren Tabreihenfolge ausliest und dann auf die nächste springst. Da gibt's auch diverse Ereignisse zum programmieren. Makro der bei Änderung ausgeführt wird, oder beim Verlassen.
Du könntest aber, ganz banal, einfach große Zellen benutzen, Gitter ausblenden und die zu bearbeitenden mit Rahmen versehen. Eine Beschränkung auf Buchstaben mit Länge 1 ist ganz easy zu kriegen.
- d'r Bastler
- Beiträge: 832
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 224 Mal
- Danksagung erhalten: 118 Mal
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
'n Amnd zusammen!
Was mit Um-die-Ecke-denken anfing, hat nun noch eine neue Dimension: Über-den-Tellerrand-hinaus ... Und siehe da: Wenn man pro Klick eine USF mit nicht nur einer TBX öffnet, sondern gleich die komplette Länge des Suchwortes anbietet, ist das Ganze erheblich komfortabler. Per Tab von TBX zu TBX zu CMD. Eine Lösung, wie die USF auf Klicks an beliebiger Stelle richtig reagiert, habe ich auch schon. Bei Nrn., die waage- & senkrecht befüllt werden sollen, kann ich die in der USF per DblClk abfangen. Eine -wie ich finde- angenehme Lösung für die Nutzer.
D.h. erst einmal, dass ich bei meiner USF-Version bleibe, aber die beiden Vorschläge (Zelle und ActiveX) trotzdem noch ausführlich inspizieren werde.
Was mit bei der USF definitiv nicht gefällt, ist die Tatsache, dass es diese Minimalbreite von 102 Pkt. gibt. Eine USF ist eine Klasse. Kann man so etwas durch eine selbst-erstellte Alternative lösen? Ich natürlich nicht - aber vielleicht kann mir da jemand etwas Nachhilfe geben.
Lieben Dank vorab!
Können soll das Dingen "nur": mehrere TBX und einen CMD mit TabIndex, keine Caption, keine Linien, Hintergrundfarbe weiß.
Schöne Grüße!
Was mit Um-die-Ecke-denken anfing, hat nun noch eine neue Dimension: Über-den-Tellerrand-hinaus ... Und siehe da: Wenn man pro Klick eine USF mit nicht nur einer TBX öffnet, sondern gleich die komplette Länge des Suchwortes anbietet, ist das Ganze erheblich komfortabler. Per Tab von TBX zu TBX zu CMD. Eine Lösung, wie die USF auf Klicks an beliebiger Stelle richtig reagiert, habe ich auch schon. Bei Nrn., die waage- & senkrecht befüllt werden sollen, kann ich die in der USF per DblClk abfangen. Eine -wie ich finde- angenehme Lösung für die Nutzer.
D.h. erst einmal, dass ich bei meiner USF-Version bleibe, aber die beiden Vorschläge (Zelle und ActiveX) trotzdem noch ausführlich inspizieren werde.
Was mit bei der USF definitiv nicht gefällt, ist die Tatsache, dass es diese Minimalbreite von 102 Pkt. gibt. Eine USF ist eine Klasse. Kann man so etwas durch eine selbst-erstellte Alternative lösen? Ich natürlich nicht - aber vielleicht kann mir da jemand etwas Nachhilfe geben.

Können soll das Dingen "nur": mehrere TBX und einen CMD mit TabIndex, keine Caption, keine Linien, Hintergrundfarbe weiß.
Schöne Grüße!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
- theos
- Beiträge: 51
- Registriert: 15. Sep 2022, 21:48
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 35 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Ufos gehen nicht kleiner. Das isso.
Ich hab dir mal eine kleine Mappe gebastelt mit 2 Fragen drin. Schau dir das einfach mal an.
Braucht ein wenig, bis sie offen ist, die Mappe, da ich die Lösch und Prüfgeschichte noch ein wenig umständlich gemacht hab ( mir ist auf die Schnelle grad nichts effektiveres eingefallen) aber es funktioniert, wie ich mir ein Kreuzworträtsel vorstelle.
Ich hab dir mal eine kleine Mappe gebastelt mit 2 Fragen drin. Schau dir das einfach mal an.
Braucht ein wenig, bis sie offen ist, die Mappe, da ich die Lösch und Prüfgeschichte noch ein wenig umständlich gemacht hab ( mir ist auf die Schnelle grad nichts effektiveres eingefallen) aber es funktioniert, wie ich mir ein Kreuzworträtsel vorstelle.

Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- Folgende Benutzer bedankten sich beim Autor theos für den Beitrag:
- d'r Bastler
-
- Beiträge: 52
- Registriert: 30. Mai 2024, 19:42
- Hat sich bedankt: 5 Mal
- Danksagung erhalten: 52 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Hi Bastler,
Du könntest auch nur Eine Textbox im Userform nutzen dann die Buchstaben einzeln mit der MID-Funktion auslesen. Wäre vielleicht noch ein wenig eleganter.
Wenn du das Userform kleiner haben willst, musst du auf API zurückgreifen. Das geht mit SetWindowPos. Hier ein kleiner Code mit dem man ein Userform an die (in meinem Fall nur eine) Textbox anpassen kann.
Statt Textbox1.Widht bzw. .Height gibst du halt deine gewünschte Breite und Höhe in Pixeln an.
Bei so kleinen Forms ohne Titelzeile muss man dann einen anderen Weg finden, wie man das Form schließen kann. Ich nutze hier z.B. die Esc-Taste in der noch leeren Textbox. Ist die Textbox befüllt muss man halt 2x Escape drücken um abzubrechen.
Gruß Mr. K.
Du könntest auch nur Eine Textbox im Userform nutzen dann die Buchstaben einzeln mit der MID-Funktion auslesen. Wäre vielleicht noch ein wenig eleganter.
Wenn du das Userform kleiner haben willst, musst du auf API zurückgreifen. Das geht mit SetWindowPos. Hier ein kleiner Code mit dem man ein Userform an die (in meinem Fall nur eine) Textbox anpassen kann.
Code: Alles auswählen
Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr) As LongPtr
Private Declare PtrSafe Function ShowWindow Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Private Const GWL_STYLE = -16 ' Ermittelt die StandardFensterstyles
Private Const WS_CAPTION = &HC00000 'hat Titelleiste (Standard bei Userform)
Private Const WS_THICKFRAME = &H40000
Private Const WS_POPUP = &H80000000
Private Const WS_BORDER = &H800000
Private Const WS_DLGFRAME = &H400000
Private Const WS_EX_CLIENTEDGE = &H200 'gesunkener Rand
Private Const WS_EX_WINDOWEDGE = &H100 'erhöhter Rand
Private Const HWND_TOPMOST = -1
Private Const SWP_SHOWWINDOW As Long = &H40
Dim Loaded As Boolean
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = vbKeyEscape Then Unload Me
End Sub
Private Sub UserForm_Activate()
Dim TmpStyles As LongPtr, TmpStyles2 As LongPtr
Dim hwnd As LongPtr, Pos As RECT
If Loaded = False Then Loaded = True Else Exit Sub 'Nur ausführen wenn erstmalig Activated
With TextBox1
.SpecialEffect = fmSpecialEffectFlat
.SelectionMargin = False
.top = 0
.left = 0
End With
hwnd = FindWindow("ThunderDFrame", Me.Caption) 'Handle ermitteln
Call ShowWindow(hwnd, SW_HIDE) 'Fenster kurz ausblenden
TmpStyles = GetWindowLong(hwnd, GWL_STYLE) 'Aktuelle Fensterstile bekommen
TmpStyles = TmpStyles Xor WS_CAPTION 'Neuen Fensterstil ohne Titelleiste festlegen
Call SetWindowLong(hwnd, GWL_STYLE, TmpStyles) 'Neuen Fensterstil setzen
Call GetWindowRect(hwnd, Pos) 'Fensterposition ermitteln
Call SetWindowPos(hwnd, HWND_TOPMOST, Pos.left, Pos.top, TextBox1.Width / 0.75 + 2, TextBox1.Height / 0.75 + 2, SWP_SHOWWINDOW) 'Fenstergröße an Textbox anpassen.
End Sub
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = vbKeyEscape Then Unload Me
End Sub
Bei so kleinen Forms ohne Titelzeile muss man dann einen anderen Weg finden, wie man das Form schließen kann. Ich nutze hier z.B. die Esc-Taste in der noch leeren Textbox. Ist die Textbox befüllt muss man halt 2x Escape drücken um abzubrechen.
Gruß Mr. K.
- Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
- d'r Bastler
- theos
- Beiträge: 51
- Registriert: 15. Sep 2022, 21:48
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 35 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
@mr. K
Wollte deinen Code testen, aber leider bekomme ich bei der Zeile hier schon eine Meldung, die es mir unmöglich machte.
Edit:
hat es.
musste nur den ganz Ptr rausnehmen und es funktionierte.
Coole Idee.
Wollte deinen Code testen, aber leider bekomme ich bei der Zeile hier schon eine Meldung, die es mir unmöglich machte.
Code: Alles auswählen
P
TmpStyles = GetWindowLong(hwnd, GWL_STYLE) 'Aktuelle Fensterstile bekommen
TmpStyles = TmpStyles Xor WS_CAPTION 'Neuen Fensterstil ohne Titelleiste festlegen
Vermute mal, das liegt an Version 2016 32Bit?DLL-Einsprungpunkt GetWindowLongPtrA in user32.dll nicht gefunden
Edit:
hat es.
musste nur den ganz Ptr rausnehmen und es funktionierte.
Coole Idee.
- d'r Bastler
- Beiträge: 832
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 224 Mal
- Danksagung erhalten: 118 Mal
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Liebe Forumskollegen und Freunde der gepflegten VBAstelei!
Man mag es kaum glauben, aber mit einem einfachen Trick lässt sich ein Shape völlig ungeohrt nutzen!
Zum Beispiel ein so hochkomplexes wie dieses hier:
(sic!)
lg
Man mag es kaum glauben, aber mit einem einfachen Trick lässt sich ein Shape völlig ungeohrt nutzen!
Man verpasse dem Förmchen einfach sofort ein Makro

Zum Beispiel ein so hochkomplexes wie dieses hier:
Code: Alles auswählen
Option Explicit
Sub Shape()
End Sub
lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
- theos
- Beiträge: 51
- Registriert: 15. Sep 2022, 21:48
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 35 Mal
- Kontaktdaten:
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Nun ja, das hatte ich dir auch schon vorgeschlagen, allerdings kannst du die Form dann auch nicht mehr anklicken um was rein zu schreiben.
Dazu gibbet es ja die Textboxen. (o:
Hast du dir mal mein Beispiel angeschaut? Ist übrigens komplett anonym.
Dazu gibbet es ja die Textboxen. (o:
Hast du dir mal mein Beispiel angeschaut? Ist übrigens komplett anonym.
- d'r Bastler
- Beiträge: 832
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 224 Mal
- Danksagung erhalten: 118 Mal
Re: Shapes.TextFrame.Characters.Text bearbeiten ohne ...
Moin Theo,
als notorischer Sturkopf habe ich Deinen nervigen Beitrag natürlich neugierig beäugt
und hatte meinen Spaß
! Bist Du eigentlich Singular oder Plural?
Deine Idee ist natürlich sinnvoll und gut, würde aber für meine VBAstelei bedeuten, dass ich bei absolut Null anfangen müsste. Ich hatte bisher nicht alle gewünschten Optionen für das Projekt erwähnt, daher fasse ich hier mal kurz zusammen:
Setup eines Rätsel-Blocks mit 8 x 9 Feldern
Adressieren jedes Felds mit einr Frage-Nummer
Setzen der Begrenzer verti/horizontal anhand der in einer Tabelle geführten Worte
Reduzieren der Frage-Nummern auf die tatsächlich relevanten
Letztlich will ich ein Tool bauen, das nicht nur ein Kreuzworträtsel zur Lösung anbietet (mit Rückmeldung, ob ein Buchstabe richtig ist), sondern auch eine Umgebung, mit der man die Rätsel erstellen kann. Die dazu notwendigen Vorab-Routinen funktionieren schon.
Was nach dem Klick auf das Ohren-lose Shape möglich ist, hängt dann vom aufgerufenen Makro ab.
lg
als notorischer Sturkopf habe ich Deinen nervigen Beitrag natürlich neugierig beäugt


Deine Idee ist natürlich sinnvoll und gut, würde aber für meine VBAstelei bedeuten, dass ich bei absolut Null anfangen müsste. Ich hatte bisher nicht alle gewünschten Optionen für das Projekt erwähnt, daher fasse ich hier mal kurz zusammen:
Setup eines Rätsel-Blocks mit 8 x 9 Feldern

Adressieren jedes Felds mit einr Frage-Nummer

Setzen der Begrenzer verti/horizontal anhand der in einer Tabelle geführten Worte

Reduzieren der Frage-Nummern auf die tatsächlich relevanten

Letztlich will ich ein Tool bauen, das nicht nur ein Kreuzworträtsel zur Lösung anbietet (mit Rückmeldung, ob ein Buchstabe richtig ist), sondern auch eine Umgebung, mit der man die Rätsel erstellen kann. Die dazu notwendigen Vorab-Routinen funktionieren schon.

Was nach dem Klick auf das Ohren-lose Shape möglich ist, hängt dann vom aufgerufenen Makro ab.
lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste