Shapes.TextFrame.Characters.Text bearbeiten ohne ...

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
xlKing
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 ...

#11

Beitrag von xlKing »

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.
Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
d'r Bastler
Benutzeravatar
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 ...

#12

Beitrag von d'r Bastler »

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 :lol: ]

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 :P 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
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
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 ...

#13

Beitrag von theos »

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.
Benutzeravatar
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 ...

#14

Beitrag von d'r Bastler »

'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. :roll: 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!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
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 ...

#15

Beitrag von theos »

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. :)
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
xlKing
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 ...

#16

Beitrag von xlKing »

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.

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

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.
Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
d'r Bastler
Benutzeravatar
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 ...

#17

Beitrag von theos »

@mr. K
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
 
DLL-Einsprungpunkt GetWindowLongPtrA in user32.dll nicht gefunden
Vermute mal, das liegt an Version 2016 32Bit?

Edit:
hat es.
musste nur den ganz Ptr rausnehmen und es funktionierte.
Coole Idee.
Benutzeravatar
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 ...

#18

Beitrag von d'r Bastler »

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!

Man verpasse dem Förmchen einfach sofort ein Makro :mrgreen:


Zum Beispiel ein so hochkomplexes wie dieses hier:

Code: Alles auswählen

Option Explicit

Sub Shape()

End Sub
(sic!)

lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
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 ...

#19

Beitrag von theos »

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.
Benutzeravatar
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 ...

#20

Beitrag von d'r Bastler »

Moin Theo,

als notorischer Sturkopf habe ich Deinen nervigen Beitrag natürlich neugierig beäugt :mrgreen: und hatte meinen Spaß 8-) ! 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 :v:
Adressieren jedes Felds mit einr Frage-Nummer :v:
Setzen der Begrenzer verti/horizontal anhand der in einer Tabelle geführten Worte :v:
Reduzieren der Frage-Nummern auf die tatsächlich relevanten :v:

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. :v:

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
Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 0 Gäste