UserForm soll oberhalb oder unterhalb der aktiven Zelle erscheinen
#1
UserForm soll oberhalb oder unterhalb der aktiven Zelle erscheinen

Hallo liebes Forum,

mich hat bisher immer die Eingabemöglichkeit in den einzelnen Excelzellen geärgert. Also habe ich mir eine kleine Userform mit TextBox programmiert.
Ein kleiner Doppelklick auf die zu befüllende aktive Zelle startet dann meine Userform. Doch jetzt habe ich ein kleines Problem.
Ich möchte, dass meine Userform immer in der richtigen Position zu dieser aktiven Zelle auf dem Bildschirm erscheint.
Das Computerprogramm muss also in Abhängigkeit von der Position der aktiven Zelle auf meinem Computerbildschirm wissen, ob die Userform beim Start diese:

Userform1.top =1
Userform1.left =1
Userform1.height =200

oder diese Position auf dem Bildschirm einnimmt.
Userform1.Top = 350
Userform1.Left = 1
Userform1.height =200

Wie macht man so etwas?
Top
#2
Hallo Wulfi,

einfach die Werte der aktiven Zelle nehmen und keine festen, z.B. ... = ActiveCell.Top ...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Hallo André,

(12.11.2017, 14:07)schauan schrieb: einfach die Werte der aktiven Zelle nehmen und keine festen, z.B. ... = ActiveCell.Top ...

das hast Du aber nicht getestet, oder? Wink

Gruß Uwe
Top
#4
Moin!
Wollte ich auch mal machen, hab irgendwann frustriert aufgegeben.
Die Zellen werden innerhalb der Zeilen/Spaltenköpfe gemessen.
Die Userform muss aber innerhalb der Application - und dann auch noch mit anderen Maßen - plaziert werden.
Hinzu kommt noch, ob die Ribbons sichtbar sind, ob die Bearbeitungsleiste ausgeklappt ist, …
Spätestens ab dreistelliger Zeilennummer macht das dann keinen Spaß mehr.

Gruß 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)
Top
#5
Hallo Uwe,

gut, ganz so einfach ist es nicht, aber die Richtung stimmt Smile Für das Userform sind noch andere Faktoren relevant wie Position der Application, ob die Ribbons eingeblendet sind usw. Da wäre die Ausrichtung über di ePosition am Desktop vorzuziehen, im Prinzip so

Hier mal ein Code, bei Nepomuk abgeschaut. Mit kleiner Änderung - Ausführung beim userform_activate und nicht .._initialize

Code:
Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long
    
Private Const SM_CXSCREEN = 0&
Private Const SM_CYSCREEN = 1&
Private Const GC_CLASSNAMEUSERFORM = "ThunderDFrame"

Private Sub UserForm_Activate()

    Dim lngTop As Long, lngLeft As Long, lngHwnd As Long
    Dim lngScreenWidth As Long, lngScreenHeight As Long
    Dim lngFormWidth As Long, lngFormHeight As Long
    
    lngScreenWidth = GetSystemMetrics(SM_CXSCREEN)
    lngScreenHeight = GetSystemMetrics(SM_CYSCREEN)
    
    lngFormWidth = Width / 0.75
    lngFormHeight = Height / 0.75
    
    With ActiveCell '                        Anpassen !!!!!!!!!!!!!!!!!!!!!!!!!!!
        lngLeft = ActiveWindow.PointsToScreenPixelsX(.Left / 0.75)
        lngTop = ActiveWindow.PointsToScreenPixelsY(.Top / 0.75)
    End With
    
    lngHwnd = FindWindow(GC_CLASSNAMEUSERFORM, Caption)
    
    If lngLeft + lngFormWidth <= lngScreenWidth And lngTop + lngFormHeight <= lngScreenHeight Then
        Call MoveWindow(lngHwnd, lngLeft, lngTop, lngFormWidth, lngFormHeight, 1)
    ElseIf lngLeft + lngFormWidth <= lngScreenWidth And lngTop + lngFormHeight > lngScreenHeight Then
        Call MoveWindow(lngHwnd, lngLeft, lngTop - lngFormHeight, lngFormWidth, lngFormHeight, 1)
    ElseIf lngLeft + lngFormWidth > lngScreenWidth And lngTop + lngFormHeight <= lngScreenHeight Then
        Call MoveWindow(lngHwnd, lngLeft - lngFormWidth, lngTop, lngFormWidth, lngFormHeight, 1)
    Else
        Call MoveWindow(lngHwnd, lngLeft - lngFormWidth, lngTop - lngFormHeight, lngFormWidth, lngFormHeight, 1)
    End If
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo André,

(12.11.2017, 18:33)schauan schrieb: Hier mal ein Code, bei Nepomuk abgeschaut. Mit kleiner Änderung - Ausführung beim userform_activate und nicht .._initialize

auch der funktioniert nicht, jedenfalls nicht mit FullHD-Auflösung (1920x1080) wie ich sie habe. Auch darf der Code nur einmal per UF-Anzeigesitzung laufen, weil sich das UF jedesmal verkleinert.

PS: Mir geht es so wie Ralf. Ich habe das Thema für mich abgehakt, bin aber für tatsächlich überall und immer funktionierende Lösungen ganz offen. Smile

Gruß Uwe
Top
#7
Hallo Uwe,

ich habe auch 1920 x 1080 und er funktioniert.

Ich starte das UF mit einem Button auf der Tabelle1

Im UF habe ich einen Button zum Hiden.

Anzeigen tue ich es anschließend wieder mit dem Button der Tabelle.

Auf dem UF habe ich ein Label, wo ich die Größe eintrage. Ist immer gleich.


Es gibt lediglich das aus meiner Sicht Windows-typische verhalten, dass das UF höher angezeigt wird, wenn es nach unten nicht genug Platz hat.


Getestet unter W10 / Excel 2016 (das "richtige")
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#8
Hallo Leute,

zunächst danke für eure Antworten.

Ich habe das Thema folgendermaßen gelöst:

If ActiveCell.Row - ActiveWindow.VisibleRange.Row < ActiveWindow.VisibleRange.Rows.Count / 2 Then
UserForm1.Top = 340 'Der Wert muss hier angepaßt werden, je nachdem wie groß eure UserForm1 ist.
UserForm1.Left = 1
End If

Ob das Ganze auf HD funktioniert weiß ich noch nicht, sitze am Laptop. Das müßte es aber auf jeden Fall.

Um die Methoden von ActiveWindow.Visible Range heraus zu bekommen, hier ein kleiner Beispielcode:
(Man kann sich dann die Ganze Sache mal im Local Fenster anschauen.  Dieser Tipp ist ausschließlich für die weiteren Besucher des Forums gemeint
und nicht für die, mir hier in diesem Thread geantwortet haben. Denn ich weiß: Ich seid topfit in VBA und sonstiger Programmierung und bringt sonst
mich immer zum staunen. Außerdem  helft mir natürlich auch viel!  Daher wißt ihr natürlich nur allzu gut wie man mit Objekten umgeht.)


Sub Den_Sichtbaren_FensterBereich()

Dim r As Range
Dim s As String
Set r = ActiveWindow.VisibleRange
s = r.Address

Debug.Print "Letzte Zelle " & r.Row + r.Rows.Count
Debug.Print r.Rows.Count
Debug.Print r.Height
Debug.Print r.Row
Debug.Print s

End Sub
Top


Gehe zu:


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