2017-02-05 7 views
2

Ich brauche das Benutzerformular, das ich in der oberen rechten Ecke des Arbeitsblatts angezeigt habe. Ich denke, ich kann die Position manuell festlegen, aber wenn die Arbeitsmappe auf einem anderen Computer mit einer anderen Bildschirmauflösung geöffnet wird, ist das Benutzerformular fast vollständig von dem Bildschirm. Was ist falsch an meinem unten stehenden VBA-Code, der dazu dient, das Benutzerformular so zu positionieren, dass das Ganze nur oben rechts auf dem Bildschirm angezeigt wird? es macht einfach nichts, und ich nehme an, das liegt daran, dass der Code nicht stimmt.Benutzerformular in der oberen rechten Ecke des Arbeitsblatts anzeigen

Danke für die Hilfe

Private Sub UserForm_Activate() 

    Me.StartUpPosition = 0 
    Me.Top = Application.Top + 25 
    Me.Left = Application.Left + Application.Width - Me.Width - 25 

End Sub 
+0

Ich bin kein Experte hier aber [von den Blicken] (https://www.mrexcel.com/forum/excel-questions/671108-userform-startup-position.html) sollten Sie Ihren Code arbeiten . Können Sie überprüfen, ob dieser Code tatsächlich ausgeführt wird? – displayname

+0

Nun, Sie können einen Haltepunkt für den [Debugger] setzen (https://www.youtube.com/watch?v=T1ARYg4ZJBA). Ein anderer Weg könnte sein, eine Nachricht zu schreiben oder ein Nachrichtenfeld zu öffnen. – displayname

+0

Sie sollten lernen, was ein Debugger ist. Es ist das wichtigste Werkzeug für Sie als Programmierer. Vielleicht schaue [dieses Video] (https://www.youtube.com/watch?v=T1ARYg4ZJBA) oder google "was ist ein Debugger". Ihr Code ist vielleicht in Ordnung, aber Sie müssen herausfinden, ob er ausgeführt wird. Wenn Sie nicht daran interessiert sind zu lernen, was ein Debugger ist eine faule Methode wäre, 'MsgBox" Hello World! "Irgendwo in Ihrem Code einfügen und sehen, ob dieses Meldungsfeld angezeigt wird oder nicht. – displayname

Antwort

0

Ich habe Angst, dass ich Ihnen mehr bin verwirrend als zu helfen. Sie müssen verstehen, dass "Application.Width" die gesamte Breite des Excel-Fensters ist. Ich denke, dieser Code hilft Ihnen, die Zahlen zu verstehen. Legen Sie es in ein reguläres Modul, nicht das Formularmodul, nicht das Blattmodul. Wenn Sie es ausführen, wird es debuggen.print die Zahlen der Auflösung Ihres Computers, Gesamtbreite von Excel, wenn Sie bei Ihrer Auflösung zu maximieren, die Gesamtbreite von Excel, wenn bei Ihrer Auflösung minimiert, und die Gesamtbreite Ihres Benutzerformulars. (Ändern Sie es von UserForm1, wenn Sie einen anderen Namen dafür haben.)

Jeder Computer, der Ihr Formular ausführt, möglicherweise unterschiedliche Auflösungen, und ihre Bildschirme möglicherweise maximiert oder minimiert werden, kennen wir diese Dinge nicht. Aber es sind alle Variablen, die sich auf die gesamte verfügbare Breite auswirken, wo das Formular positioniert werden soll. Denk an einzelne Pixel. Wenn Ihr Formular 300 Pixel breit ist und Sie es auf einem Bildschirm positionieren, der über 1000 Pixel verfügt, dann wäre der Befehl, um das Formular am rechten Rand des Bildschirms zu setzen, me.left = 1000 - 300. (oder Anwendung .width - me.width) Aber wenn nur 700 verfügbare Pixel zur Verfügung stehen, dann wäre der Befehl me.left = 700-300 oder 400.

Der Befehl me.left sagt dem Computer, dass er zeichnen soll linkes Pixel des Formulars an einer bestimmten Stelle. Wenn Ihr also auf der linken Seite erscheint (auf der gleichen Seite wie der "Start" - oder Windows-Button), dann sagen Sie ihm, dass er das Pixel ganz links auf 0 zeichnen soll. Ich weiß nicht, wie ich es besser erklären könnte.

Aber legen Sie dies in ein Modul und führen Sie es aus. Es kann hilfreich sein, die tatsächlichen Zahlen in Ihren Befehlen zu sehen.

Public Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long 
Const SM_CXSCREEN = 0 
Const SM_CYSCREEN = 1 
Sub VerifyScreenResolution2() 

    Dim x As Long 
    Dim y As Long 

    x = GetSystemMetrics(SM_CXSCREEN) 
    y = GetSystemMetrics(SM_CYSCREEN) 

    Debug.Print "This Computer Resolution Width: " & x, "Resolution Height: "; y 
    ActiveWindow.WindowState = xlMaximized 
    Debug.Print "Application.Width Maximized: " & Application.Width 
    ActiveWindow.WindowState = xlMinimized 
    Debug.Print "Application.Width Minimized: " & Application.Width 
    Debug.Print "Userform1 Width: " & UserForm1.Width 

End Sub 

Hier sind die Ausdrucke, die ich für meinen Computer und Formular bekomme.

Dieser Computer Auflösung Breite: 1366
Auflösung Höhe: 768
Application.Width Maximized: 1.036,5
Application.Width Minimized: 120
UserForm1 Breite: 240

+0

Nein, ich weiß nicht, warum es nicht funktioniert. Sie müssen mit der rechten Maustaste irgendwo in das "Projekt" -Fenster des Editors (oben links) klicken und auf "Einfügen" klicken. (Nicht Klassenmodul) Fügen Sie den obigen Code in das neue Modul ein. Klicken Sie auf die Option "Ansicht" im oberen Menü des Editors und klicken Sie auf "Direktes Fenster", um sicherzustellen, dass es geöffnet ist. Der Befehl debug.print schreibt in dieses Fenster. Setzen Sie den Cursor irgendwo innerhalb des Unterprogramms und klicken Sie auf PF5, um es auszuführen. Aber ehrlich, wenn Sie diese Art von Anweisung benötigen, bitte das Buch Excel VBA für Dummies. Es ist hervorragend für Anfänger. –

0

Es ist in der Userform Modul sein sollte . Es funktioniert für mich, aber ich habe eine Auflösung von 1366. Interessanterweise zeigt die applicaabovtion.width von Excel 1033.5 für mich. Ich habe die Subroutine in der anderen Antwort auf debug.print editiert, was deine Werte sind. Versuchen Sie es erneut in Ihrem Benutzerformularmodul zu ersetzen. Gehen Sie dann zurück zum VBA-Editor und sehen Sie, was im unmittelbaren Fenster ausgedruckt wird. Auf diese Weise können Sie die verschiedenen Arbeitsstationen mit unterschiedlichen Auflösungen testen und möglicherweise herausfinden, wo es falsch läuft. Stellen Sie nur sicher, dass Sie Ansicht - Direktfenster eingestellt haben, um zu sehen, was ausgedruckt wird.

Wenn alles andere fehlschlägt, müssen Sie möglicherweise für jede Benutzerauflösung anpassen. Denken Sie daran, dass 25 Punkte in einer Auflösung von 1600 wie 50 Punkte in einer Auflösung von 800 sein werden.

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long 
Const SM_CXSCREEN = 0 
Const SM_CYSCREEN = 1 

Sub VerifyScreenResolution() 

    Dim x As Long 
    Dim y As Long 

    x = GetSystemMetrics(SM_CXSCREEN) 
    y = GetSystemMetrics(SM_CYSCREEN) 

    Debug.Print x, y 

End Sub 
Verwandte Themen