Clever-Excel-Forum

Normale Version: Textfeldposition in Tabsheet 'fixieren'
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
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 und vG!
Hi,

komisch, dass noch niemand geantwortet hat.

Ansicht - Fenster fixieren

Oder sollte es am Ende doch nicht so simpel gewesen sein?
Hallo,

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.

VG!
Hallo,

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.
Hi,

da Dir statt Fixieren auch Fenster-Teilen nicht wirklich hilft, bleibt der Vorschlag von Klaus-Dieter.
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
Hallo

und danke erstmal für die Ideen.

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?

Danke und vG!
Schrieb ich ja.
Diverse APIs nebst ellenlangem Code!
Da das alles nicht profan ist, wiederhole ich mich.
Ist es das Wert?
Hallo,

VBA kann auch den sichtbaren Bereich abfragen: (aus dem Gedächtnis)

Code:
rng = windows.visibleRange

Damit kann dann die Textbox verschoben werden.

mfg
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 Const WS_EX_MYWINDOW = &H40008 ' WS_EX_APPWINDOW + WS_EX_TOPMOST
Private Const WS_MYWINDOW = &H90800000 ' WS_BORDER + WS_POPUP + WS_VISIBLE
Private Const WS_CAPTION = &HC00000

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
Seiten: 1 2 3