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