Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Infofeld wenn man mit Maus über Button fährt
#1
Hallo zusammen,

vor einiger Zeit habe ich mal eine Userform gebaut. 
Wenn man mit der Maus über einen Button gefahren ist den man anklicken konnte ging ein kleines Infofenster auf in dem zusätzliche Erklärungen standen. 

Kann man sowas auch außerhalb einer Userform bauen? Also bei einem normalen ActiveX Steuerelement das direkt auf einem Arbeitsblatt liegt?
Antworten Top
#2
Hi,

die ActiveX-Elemente haben keine ControlTipText-Eigenschaft. Möglicherweise kann man das MouseMove-Ereignis (zusammen mit ein paar APIs) nutzen, um es "nachzubauen" - fachlich bin ich da aber raus.
Antworten Top
#3
Hallo Marie, 

anknüpfend an Boris' Ausführungen hier mal eine Idee als Anregung, wie man das machen könnte.

Man kann sich über die API selbst kleine Textboxen programmieren oder aber, wie in diesem Fall, einfach eine Textbox einfügen und mit Bordmitteln so gestalten, wie es gewünscht ist.
Mit dem ersten Mousemove (Event) auf dem betroffenen Button wird die gewünschte Textbox erstellt und nach Verlassen des Buttons wieder gelöscht. Da es für das Verlassen des Buttons keinen passenden Event gibt, setzen wir einfach einen Timer, in dessen TimerProc das Verlassen des Buttons geprüft wird. Anschließend wird Timer und Textbox wieder ausgeschaltet.
PS: Der Timer muss auf jeden Fall ausgeschaltet werden, deshalb bitte auch bei Verlassen der Tabelle und ggf. beim Schließen der Mappe dieses sicher stellen. (KillTimer)

Die Positionierung der Notiztextbox habe ich jetzt in der Butttonprozedur "hart" verdrahtet. Mit dieser Methode kannst Du jetzt beliebig viele Buttons mit so einer Notizbox erstellen.

Probiere es einfach mal aus und gestalte es in Deinem Sinne.

Code:

'###### In ein Codemodul #####
Option Explicit

Private Declare PtrSafe Function SetTimer Lib "user32" ( _
        ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" ( _
        ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" ( _
        lpPoint As POINTAPI) As Long

Private Type POINTAPI
    X      As Long
    Y      As Long
End Type
Dim Pt     As POINTAPI

Private hTimer As LongPtr

Sub Timer_Tick()
 Dim oCurObj As Object
 
 DoEvents
 GetCursorPos Pt                                    ' Mausposition holen
 On Error Resume Next
 Set oCurObj = Application.Windows(1).RangeFromPoint(Pt.X, Pt.Y)
 If Err <> 0 Then Err.Clear: Exit Sub               ' Fehler => raus

 If TypeName(oCurObj) <> "OLEObject" Then
    If hTimer <> 0 Then
       KillTimer 0&, hTimer: hTimer = 0
       ActiveSheet.Shapes.Range("Notiz").Delete
    End If
 End If
 
End Sub


Sub CreateNotiz(sText As String, X As Long, Y As Long, B As Integer, H As Integer)
' Hier das Objekt formatieren
  Dim Obj As Object
  
  If hTimer <> 0 Then Exit Sub
  
  Set Obj = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, X, Y, B, H)
  Obj.Name = "Notiz"
  With Obj.TextFrame2.TextRange.Characters
       .Font.Size = 9
       .Font.Name = "Arial"
       .Text = sText
  End With
  With Obj.Fill
       .Visible = msoTrue
       .ForeColor.RGB = RGB(255, 255, 240)
       .Transparency = 0
       .Solid
  End With
  hTimer = SetTimer(0&, 0&, 25, AddressOf Timer_Tick)
End Sub


'###### In das Tabellenmodul #####
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Erstellt eine Notiz
  CreateNotiz "Mein kleiner Test", 510, 25, 100, 20
End Sub

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Erstellt eine Notiz
  CreateNotiz "Und noch eine Notiz", 510, 75, 100, 20
End Sub

Private Sub Worksheet_Deactivate()
   KillTimer 0&, hTimer: hTimer = 0
End Sub

_________
viele Grüße
Karl-Heinz
[-] Folgende(r) 3 Nutzer sagen Danke an volti für diesen Beitrag:
  • {Boris}, DieMarie, d'r Bastler
Antworten Top
#4
Hi Karl-Heinz,

danke erstmal für`s "Ball aufnehmen"  Thumbsupsmileyanim
Bin mal wieder begeistert von dem Zeugs, das Du da rauchst Wink
Habe nun wieder eine Mustermappe mehr im Ordner "Volti" Wink
Antworten Top
#5
Super, danke @Volti
Ich muss mal schauen ob ich das bei mir adaptiert bekomme.
Antworten Top
#6
Moin!

Und meiner einer hätte dann wieder dümmlich vorgschlagen: Mach doch 'ne Userform!

Geiler Code und echt was für's Album, volti! Danke!!

Gruß

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
Antworten Top
#7
Vielen Dank Euch,

für die positiven Rückmeldungen.

Habe das Thema noch ein wenig weiter ausgebaut. Findet man bei den Komplettlösungen....

Gruß
Karl-Heinz
Antworten Top
#8
Hallo,

die Lösung von Volti finde ich prima und habe sie gleich gespeichert.

Da ich mit API's einige Probleme habe, versuchte ich eine einfachere Variante:

Der Code schreibt die Adresse der selektierten Zelle in den "StatusBar", wenn für jede relevate Zelle eine Text hinterlegt wird, könnte es die Frage auch einigermaßen beantworten:

Code:
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
    x As Long
    y As Long
End Type


Sub T_1()
Dim MPos As POINTAPI
Dim WS As Worksheet
Dim c As Range
Set WS = ActiveSheet

RetVal = GetCursorPos(MPos)
Set c = ActiveWindow.RangeFromPoint(MPos.x, MPos.y)
Debug.Print c.Address
c.Interior.Color = vbYellow
Application.StatusBar = c.Address
End Sub

In der Beispiel-Datei wird der Code durch ein "Sheet_SelectionChange()" aufgerufen.

mfg

PS: Für Excel 32-bit einfach das "PtrSafe" löschen


Angehängte Dateien
.xlsm   MouseOver PtrSafe.xlsm (Größe: 15,18 KB / Downloads: 4)
Antworten Top
#9
Moin,

Zitat:PS: Für Excel 32-bit einfach das "PtrSafe" löschen

nee, muss nicht. Ganz im Gegenteil, bitte drin lassen. PtrSafe müsste nur bei einer Excel-Version < Excel 2010 entfernt
oder per bedingter Kompilierung umgangen werden, weil die alten Versionen PtrSafe nicht kennen.

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Antworten Top
#10
Hallöchen,

hier mal noch 'ne Variante, gleiche Basis. Hab heute nur das ptrsafe und longptr eingefügt, dank an Karl Heinz, Smile, der code stammte noch aus alten Zeiten ...


Angehängte Dateien
.xlsm   MouseOverForm.xlsm (Größe: 23,03 KB / Downloads: 2)
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • DieMarie
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste