Clever-Excel-Forum

Normale Version: Markierungsprobleme bei der TextBox1
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebes Forum,

ich habe ein Programm geschrieben, mit dem ich per Doppelklick in einem in einer Textbox stehenden Satz einen Punkt einfügen oder löschen kann. Ist bei der Cursorposition in dem Satz kein Punkt vorhanden,
wird dort einer eingefügt. Ist ein Punkt innerhalb des Satzes vorhanden,  kann der Cursor links oder rechts von diesen Punkt per Doppelklick ihn wieder löschen. Das klappt alles wunderbar.

Leider musste ich in die Userform ein zweites Textfeld TextBox2 einbauen. Diese TextBox2 hat nur die Aufgabe den Focus zu übernehmen, damit in der Textbox1 nach dem Doppelklick die Markierung aufgehoben wird.
Das kann es nicht sein!  Ich will nach dem Doppelklick in der TextBox1 keine Markierung haben. Aber wie bekomme ich das hin?

Zur Veranschaulichung der Problematik habe ich euch mein kleines Programm als Attachment hochgeladen.



Code:
Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim intA As Integer
Dim vbstr As String

With TextBox1
TextBox1.SetFocus
intA = .SelStart
vbstr = .Text
End With

If InStr(Mid(vbstr, intA - 1, 3), ".") = 0 Then
'Punkt setzen
vbstr = Mid(vbstr, 1, intA) & "." & Mid(vbstr, intA + 1, Len(vbstr) - intA + 1)
Else
Debug.Print "Rechts:  " & InStr(Mid(vbstr, intA - 1, 3), ".")
If InStr(Mid(vbstr, intA - 1, 3), ".") = 2 Then
'Punkt löschen rechts vom Cursor
vbstr = Mid(vbstr, 1, intA - 1) & Application.Substitute(Mid(vbstr, intA, 3), ".", "", 1) & Mid(vbstr, intA + 3, Len(vbstr) - intA - 3 + 1)
Else
'Punkt löschen links vom Cursor
vbstr = Mid(vbstr, 1, intA) & Application.Substitute(Mid(vbstr, intA + 1, 3), ".", "", 1) & Mid(vbstr, intA + 4, Len(vbstr) - intA - 4 + 1)
End If
End If
Debug.Print vbstr


'Problemstelle
With TextBox1
.SetFocus
.Text = vbstr
End With

'Markierung Aufheben geht nur mit TextBox2.SetFocus
TextBox2.SetFocus

End Sub

Sub UserForm_Initialize()
Dim vbstr
vbstr = "Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden."
TextBox1 = vbstr
TextBox1.Font.Size = 15
End Sub
Hallo,

im VBA-Editor findest Du, gewöhnlich ist das links unten, ein Eigenschaftenfenster.
Dort kannst Du get Fokus on Klick oder so ähnlich ein oder ausschalten.
Dann kannst Du getrost die zweite Box wieder in Rente schicken.
Also diese Einstellung kann ich leider nirgendwo finden.
Moin!
Mal quick & dirty:
Ich habe die Größe der TextBox2 auf Null gesetzt, Hintergrund transparent und ohne Rahmen.
(manche würden sagen: unsichtbar)
:21:

Gruß Ralf
Hallo Anne,

Zitat:Mal quick & dirty:
Ich habe die Größe der TextBox2 auf Null gesetzt, Hintergrund transparent und ohne Rahmen.
(manche würden sagen: unsichtbar)


Zitat:Also diese Einstellung kann ich leider nirgendwo finden.
... wenn der Ralf das so gemacht hat, dann gehe ich mal getrost davon aus, daß die von mir
vorgeschlagene Möglichkeit bei Textboxen nicht greift weil nicht vorhanden.
Ich konnte das nicht testen, das war also mein Gedankenfehler.

Also gräme Dich nicht mehr. Ich entschuldige mich auch ganz artig bei Dir.
Hallo Leute,
anbei meine eigene (Schnell-) Lösung des Problems zum Download und Ausprobieren. Das Makro funktioniert perfekt, aber gut möglich, dass es Codemäßig  eine bessere Lösung gibt.

Werde mir morgen das Ganze nochmal anschauen.
Moin!
Ist aber mindestens genau so "dreckig" wie meine Lösung.  :19:
Das Problem liegt beim Doppelklick, der Windowskonform eine Markierung auslöst, die hier nicht erwünscht ist.
Viel besser ist hier der einfache Klick.
Sinnvoll in Verbindung mit Umschalt, Strg und/oder Alt.
(ich habe erst mal nur einen einfachen Klick ohne Zusatztaste verwendet)
Das Ereignis findest Du hier erklärt:
https://msdn.microsoft.com/de-de/library...78486.aspx
Dann braucht es auch diese Trickserei nicht mehr.

Ich habe also den CommandButton wieder herausgeworfen,
alles jetzt Überflüssige aus dem Code geworfen,
das Initialize durch manuelles Setzen der Eigenschaften überflüssig gemacht
und unseren Code mal vernünftig strukturiert, damit er auch lesbar ist.  :21:

Der gesamte Code aus UserForm1:
Dialog UserForm1
 
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
On Error Resume Next 
Dim intA As Integer 
Dim vbstr As String 
 
With TextBox1 
   intA = .SelStart 
   vbstr = .Text 
End With 
 
If InStr(Mid(vbstr, intA - 1, 3), ".") = 0 Then 
   'Punkt setzen 
   vbstr = Mid(vbstr, 1, intA) & "." & Mid(vbstr, intA + 1, Len(vbstr) - intA + 1) 
Else 
   If InStr(Mid(vbstr, intA - 1, 3), ".") = 2 Then 
      'Punkt löschen rechts vom Cursor 
      vbstr = Mid(vbstr, 1, intA - 1) & _
         Application.Substitute(Mid(vbstr, intA, 3), ".", "", 1) & _
         Mid(vbstr, intA + 3, Len(vbstr) - intA - 3 + 1) 
   Else 
      'Punkt löschen links vom Cursor 
      vbstr = Mid(vbstr, 1, intA) & _
         Application.Substitute(Mid(vbstr, intA + 1, 3), ".", "", 1) & _
         Mid(vbstr, intA + 4, Len(vbstr) - intA - 4 + 1) 
   End If 
End If 
 
With TextBox1 
   .Text = "" 
   .Text = vbstr 
End With 
End Sub 
 
TypNameEigenschaften
TextBoxTextBox1
AutoWordSelect:Falsch
Height:78
Left:18
TabIndex:0
Text:Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden.
Top:18
Value:Per Doppelklick kann innerhalb dieses Satzes ein Punkt gesetzt oder gelöscht werden.
Width:858
WordWrap:Falsch

Datei im Anhang.

Gruß Ralf
Diese Code reicht:


Code:
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Cancel = True
     
  If Asc(Mid(TextBox1, TextBox1.SelStart, 1)) = 46 Then
    TextBox1 = Left(TextBox1, TextBox1.SelStart - 1) & Mid(TextBox1, TextBox1.SelStart + 1)
  ElseIf Asc(Mid(TextBox1, TextBox1.SelStart + 1, 1)) = 46 Then
    TextBox1 = Left(TextBox1, TextBox1.SelStart) & Mid(TextBox1, TextBox1.SelStart + 2)
  Else
    TextBox1 = Left(TextBox1, TextBox1.SelStart) & "." & Mid(TextBox1, TextBox1.SelStart + 1)
  End If
End Sub
Hallo Ralf,
vielen Dank für deine außerordentlich große Mühe. Auch ich hatte recherchiert und herausgefunden, dass die Markierungen typisches Verhalten der Textboxen sind,
konnte aber keine Microsoftquelle angeben. Inzwischen habe ich den etwas schnell hingeschriebenen Code auch nochmal verbessert. Vor allem bei der Toleranzprogrammierung,
ob der Cursor links oder rechts vom Punkt seht.

Und dann, ach ja SNB...

You've made my day!!! Besser als das Netz.
Im Upload befindet sich auch dein Code, natürlich mit deutlicher Kennzeichnung der Urheberschaft.
Codeverbesserung. Per Doppelklick können der Reihe nach alle vorgegebenen Satzzeichen durch das Arrays vbF  durchgelickt werden. 



Code:
Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
Dim vbF
With TextBox1

vbF = Array(".", "!", "?", ",", ";", "")

For i = 0 To UBound(vbF)
If Not InStr(Mid(.Text, .SelStart - 1, 3), vbF(i)) = 0 Then
i = i + 1
Exit For
End If
Next i

If UBound(vbF) + 1 = i Then
'Punkt setzen
.Text = Mid(.Text, 1, .SelStart) & vbF(0) & Mid(.Text, .SelStart + 1, Len(.Text) - .SelStart + 1)
Else
If Mid(.Text, .SelStart + 1, 1) = vbF(i - 1) Then
.Text = Left(.Text, .SelStart) & Replace(Mid(.Text, .SelStart + 1, 1), vbF(i - 1), vbF(i)) & Right(.Text, Len(.Text) - .SelStart - 1)
Else
.Text = Left(.Text, .SelStart - 1) & Replace(Mid(.Text, .SelStart, 1), vbF(i - 1), vbF(i)) & Right(.Text, Len(.Text) - .SelStart)
End If
End If

End With

End Sub
Sub UserForm_Initialize()
Dim vbstr
vbstr = "Per Doppelklick kann innerhalb dieses Satzes nacheinander verschiedene Satzzeichen gesetzt oder gelöscht werden."
TextBox1 = vbstr
TextBox1.Font.Size = 15
End Sub