habe eine nicht modale Userform. Wie kann ich erreichen, dass diese nie die aktive Zelle
in meinem Tabellenblatt verdeckt? Ich meinr so, wie Commandbars, die auch "ausweichen",
wenn mann eine Zelle anklickt.
Grüße Jörg
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim l As Single, t As Single
t = 10
l = 20
If userform1.Visible = True Then
userform1.Top = ActiveCell.Top + t
userform1.Left = ActiveCell.Left + ActiveCell.Width + l
End If
End Sub
Problem bei der Sache sind die Versatzfaktoren t und l, da sich .TOP und .LEFT der aktiven Zelle auf das Excel-Fenster beziehen, diese Werte der Userform allerdings auf Bildschirm-Koordinaten.
da musst du halt noch etwas rumprobieren.
Außerdem solltest du noch eine Fallunterscheidung einbauen, wenn die Userform nicht mehr nach rechts, sondern nach links ausweichen soll.
aber ein bisschen was zum tüfteln will ich dir auch noch lassen.
Gruß, Daniel
Sub UF_Positionieren()
Dim x(6) As Long
Dim y(7) As Long
x(1) = Application.Left
x(2) = ActiveWindow.Left
x(3) = ActiveCell.Left
x(4) = ActiveCell.Width
x(5) = Breite_Befehlszeilen
x(6) = ActiveWindow.VisibleRange.Cells(1, 1).Left
x(0) = x(1) + x(2) + x(3) + x(4) - x(6)
UserForm1.Left = x(0) + 25
y(1) = Application.Top
y(2) = ActiveWindow.Top
y(3) = ActiveCell.Top
y(4) = ActiveCell.Height
y(5) = -10 * Application.DisplayFormulaBar
y(6) = Höhe_Befehlszeilen()
y(7) = ActiveWindow.VisibleRange.Cells(1, 1).Top
y(0) = y(1) + y(2) + y(3) + y(4) + y(5) + y(6) - y(7)
UserForm1.Top = y(0) + 40
End Sub
Function Höhe_Befehlszeilen() As Long
Dim i As Long
Dim CBar As CommandBar
For Each CBar In Application.CommandBars
If CBar.Visible And CBar.Position = msoBarTop Then
Höhe_Befehlszeilen = WorksheetFunction.Max(Höhe_Befehlszeilen, CBar.Top + CBar.Height)
End If
Next
End Function
Function Breite_Befehlszeilen() As Long
Dim i As Long
Dim CBar As CommandBar
For Each CBar In Application.CommandBars
If CBar.Visible And CBar.Position = msoBarLeft Then
Breite_Befehlszeilen = WorksheetFunction.Max(Breite_Befehlszeilen, CBar.Left + CBar. _
Width)
End If
Next
End Function
ansonsten hoffe ich, ich habe alles brücksichtigt, Korrekturen und ergänzungen sind gerne willkommen.
Gruß, Daniel
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
call uf_positionieren
End Sub
(oder eben den Inhalt des Makros direkt hier reinschreiben)
Gruß, Daniel
ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Call UF_Positionieren
End Sub
Dieses Makro sorgt dafür, dass die Userform sich an die aktive Zelle anpasst, wenn du eine neue Zelle auswählst.
Sub UF_Positionieren()
Dim x(6) As Long
Dim y(7) As Long
x(1) = Application.Left
x(2) = ActiveWindow.Left
x(3) = ActiveCell.Left
x(4) = ActiveCell.Width
x(5) = Breite_Befehlszeilen
x(6) = ActiveWindow.VisibleRange.Cells(1, 1).Left
UserForm1.Left = x(0) + 25
' Weitere Berechnungen für y...
End Sub
Achte darauf, dass du die Funktionen Höhe_Befehlszeilen und Breite_Befehlszeilen ebenfalls im Modul hast, um die Userform korrekt zu positionieren.
UserForm1.Left und UserForm1.Top korrekt sind. Wenn die Userform immer noch die Zelle verdeckt, experimentiere mit den Werten und Positionierungen.Eine einfache Methode ist die Verwendung von API-Funktionen, um die Position der Userform zu berechnen. Obwohl dies fortgeschrittener ist, kann es dir helfen, eine flexiblere Lösung zu finden. Ein Beispiel findest du unter cpearson.com.
Hier ist ein einfaches Beispiel, wie du die Userform relativ zur aktiven Zelle positionieren kannst:
Sub Beispiel_UF_Positionieren()
Dim OffsetX As Long, OffsetY As Long
OffsetX = 20 ' Abstand nach rechts
OffsetY = 10 ' Abstand nach unten
If UserForm1.Visible = True Then
UserForm1.Top = ActiveCell.Top + OffsetY
UserForm1.Left = ActiveCell.Left + ActiveCell.Width + OffsetX
End If
End Sub
Dieses Beispiel sorgt dafür, dass die Userform immer rechts neben der aktiven Zelle angezeigt wird.
OffsetX, OffsetY), um die beste Position für deine Userform zu finden.1. Kann ich die Userform auch mit einer Tastenkombination öffnen?
Ja, du kannst ein Makro erstellen, das die Userform öffnet, und es einer Tastenkombination zuweisen.
2. Was passiert, wenn die Userform die Bildschirmgrenzen überschreitet?
Du solltest eine Logik einbauen, die prüft, ob die Userform innerhalb der Bildschirmgrenzen bleibt, und sie entsprechend anpasst.
3. Gibt es eine Möglichkeit, die Userform automatisch wieder zu schließen?
Ja, du kannst ein weiteres Event-gesteuertes Makro erstellen, das die Userform schließt, wenn eine bestimmte Bedingung erfüllt ist.