10.02.2022, 16:59 (Dieser Beitrag wurde zuletzt bearbeitet: 10.02.2022, 17:02 von Wanderfalke.)
Hallo,
wie kann ich ein Textfeld so 'fixieren', dass unabhängig vom Scrollen im Tabsheet das Textfeld immer an der gleichen Stelle ist (bspw. immer 1cm vom oberen Rand oder eine Zeile unterhalb des oberen Randes)?
danke für die Info und - leider ist es nicht ganz so simpel ...
Durch das Fenster fixieren werden alle eingeschlossenen Zeilen fixiert. Bei mir geht es darum, nur das Textfeld quasi als 'Overlay' zu fixieren bzw. sichtbar zu halten.
Ich habe mal einen Screenshot angehangen. Wenn ich in diesem Beispiel bis Zeile 99 scrolle, ist das Textfeld nicht mehr sichtbar.
mit einem Textfeld habe ich so etwas noch nicht versucht. Alternativ könnte man das mit einem UserForm machen. Unter Eigenschaften müsste die Option ShowModal auf False gesetzt werden.
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
Moin! Das Textfeld ist 10 Zeilen hoch und Du siehst bei Deiner Auflösung/Zoomfaktor 63 Zeilen. Wäre es so unannehmbar, die Höhe von Zeile 1 auf das 10fache einzustellen und zu fixieren? Schließlich siehst Du dann immer noch 53 Zeilen, mehr, als unser beschränktes Gehirn auf einmal erfassen kann.
Und um sich der konkreten Frage anzunähern: Sowas geht auf einer Website, Excel ist dazu erstmal nicht geeignet. Erstmal deshalb, weil es sicherlich API-Spezis gibt, die Dir für diese Funktionalität 100+ Zeilen Code schreiben.
Ob es das wert ist?
Fragt sich Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Folgenden Ansatz habe ich. Mit Hilfe von bspw. "ActiveSheet.Shapes("TextBox1").Top = Range("Cx").Top" lässt sich die Textbox an Zeile x bewegen.
Nun müsste noch abgefragt werden: Wurde gescrollt und welches ist die oberste sichtbare Zeile. Dann ließe sich "x" doch ermitteln und entsprechend positionieren.
Leider weiß ich nicht, wie das Scrollen überwacht und die oberste sichtbare Zeile ermittelt werden kann. Evtl. kann mir hier jemand helfen?
11.02.2022, 13:34 (Dieser Beitrag wurde zuletzt bearbeitet: 11.02.2022, 13:42 von volti.)
Hallo,
hier eine Idee, wie Du die Textbox neu positionieren kannst.
Allerdings gibt es m.E. kein Event für ActiveSheet-Scrolling, so dass ich es erst mal an das Event Selection-Change gebunden habe.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow.VisibleRange ActiveSheet.Shapes("TextFeld 1").Top = .Cells(1, "B").Top End With End Sub
_________ viele Grüße Karl-Heinz
Hallo,
noch ein Nachtrag....
Das Window-Scrolling über die API abzufragen, scheint mir selbst unter Verwendung eines Timers sehr aufwändig.
Wenn es nur darum gehen sollte, einen einfachen Text oder einen Bildausschnitt dauerhaft an einer festen Stelle im Vordergrund zu halten, gäbe es noch die Möglichkeit, alternativ zu einer Userform, sich ein eigenes Fenster zu zimmern. Bedingt allerdings einen gewissen Aufwand, wie RPP63 schon schrieb.
Hier mal ein Beispiel der einfachsten Art zur Ansicht. Einmal mit und einmal ohne Caption. Wenn das in Betracht kommen sollte, poste ich gerne auch eine Version, die einen beliebigen Bildausschnitt anzeigt und/oder eine, die man auch direkt schließen kann.
Bitte beachten, dass diese Box spätestens vor Verlassen der Arbeitsmappe wieder abgeschaltet werden sollte. Zu Abschalten dient die entsprechende Destroy-Sub.
Code:
Option Explicit ' Fenstererstellung und -handling Private Declare PtrSafe Function CreateWindowExA Lib "user32" ( _ ByVal dwExStyle As Long, _ ByVal lpClassName As String, ByVal lpWindowName As String, _ ByVal dwStyle As Long, _ ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _ ByVal hWndParent As LongPtr, ByVal hMenu As LongPtr, ByVal hInstance As LongPtr, _ lpParam As Any) As LongPtr Private Declare PtrSafe Function FindWindowA Lib "user32" ( _ ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function DestroyWindow Lib "user32" ( _ ByVal hWnd As LongPtr) As Long Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As Long ' Zeichnen/Schreiben Private Declare PtrSafe Function SetBkColor Lib "gdi32" ( _ ByVal hDC As LongPtr, ByVal crColor As Long) As Long Private Declare PtrSafe Function DrawTextA Lib "user32" ( _ ByVal hDC As LongPtr, ByVal lpStr As String, _ ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type
Private Sub Infobox(sCaption As String, sText As String, Optional lStyle As Long = WS_CAPTION, _ Optional X As Long, Optional Y As Long) Dim hWnd As LongPtr, hDC As LongPtr, R As RECT
If sCaption = "" Then Exit Sub ' Kein gültiger Caption angegeben =>raus hWnd = FindWindowA("#32770", sCaption) ' Handle ermitteln If sText = "Destroy" Then ' Infobox schließen? If hWnd <> 0 Then DestroyWindow hWnd ' Infobox schließen Exit Sub ElseIf hWnd = 0 Then ' Neue Infobox starten If X = 0 Then X = (GetSystemMetrics(0) - 350) \ 2 ' X-Position If Y = 0 Then Y = (GetSystemMetrics(1) - 150) \ 2 ' Y-Position hWnd = CreateWindowExA(WS_EX_MYWINDOW, _ "#32770", sCaption, WS_MYWINDOW Or lStyle, _ X, Y, 350, 150, 0&, 0&, Application.HinstancePtr, ByVal 0&) End If hDC = GetDC(hWnd) ' Device Context des Fensters holen R.Left = 10: R.Top = 10: R.Bottom = 100: R.Right = 330 ' Schreibbereich festlegen SetBkColor hDC, RGB(240, 240, 240) DrawTextA hDC, sText & Space(255), 255, R, &H10 ' Text ausgeben ReleaseDC hWnd, hDC ' Device Context auflösen End Sub
' ################# Starten Updaten Schließen #################
' Anzeigebox öffnen mit Caption Sub Open_MsgBox11a() Call Infobox("Prozessablauf", "Die Verarbeitung wurde um " & Left$(Time, 5) & " Uhr gestartet!", , 350, 200) End Sub
' Anzeigebox schließen Sub Destroy_MsgBox11a() Call Infobox("Prozessablauf", "Destroy") End Sub
' Text aktualisieren, während der Laufzeit Sub UpDate_MsgBox11a() Call Infobox("Prozessablauf", "Mein neuer Text") End Sub
' Anzeigebox öffnen ohne Caption Sub Open_MsgBox1a11() Call Infobox("Prozessablauf", "Die Verarbeitung wurde um " & Left$(Time, 5) & " Uhr gestartet!", 0, 350, 200) End Sub
_________ viele Grüße Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Wanderfalke