259 Aufrufe
Gefragt in Tabellenkalkulation von jelena Mitglied (750 Punkte)
Hallo guten Tag, kann mir jemand bitte weiterhelfen es soll anstatt dem code
UserForm2.Show 0
UserForm2.Left = 910
UserForm2.Top = 260
Die grafik 1 in einer excel Tabelle angezeigt werden. Danke

17 Antworten

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)
Hi Jelena,

hast du es in meiner hochgeladenen Mappe denn schon mal getestet? Das UserForm mit dem Bild bleibt doch beim Scrollen immer sichtbar - genau so wie du es wolltest.

Du kannst das eigentliche Bild auch in einem ausgeblendeten Tabellenblatt ablegen und von dort aus in das UserForm laden - musst halt im Code nur den Namen des Tabellenblattes anpassen.

Bis später, Karin
0 Punkte
Beantwortet von xlking Experte (1.5k Punkte)

Hallo Jelena,

Excel unterstützt multiple Fenster. Wenn du auf Neues Fenster klickst und beide Fenster vertikal anordnest kannst du im linken Fenster etwas platzieren, das dann bleibt während du im rechten Fenster scrollst. Du müsstest dann nur noch das versehentliche Scrollen im linken Fenster verhindern. z.B. in beide Fenster auf verschiedene Tabellenblätter verweisen und im du in den Eigenschaften des Tabellenblatts im linken Fenster im entsprechenden Tabellenmodul im VBA-Editor die Eigenschaft "Scrollarea" auf A1 festlegst.

Gruß Mr. K.

0 Punkte
Beantwortet von jelena Mitglied (750 Punkte)
Hallo, ich möchte nur dass das Bild stehen bleibt und nicht nach oben verschwindet wenn ich nach unten scrolle. Danke
0 Punkte
Beantwortet von xlking Experte (1.5k Punkte)
Das geht leider nicht. Ein Bild ist immer an bestimmte XY-Koordinaten gebunden, die mit den Koordinaten 0,0 in der linken Oberen Ecke von A1 beginnen und sich nach unten und rechts fortsetzen. Wenn du nun nach unten scrollst erhöhst du die angezeigten Koordinaten. Stell dir das Tabellenblatt mit allen Zellen als riesiges Diagramm vor in dem du herumscrollen kannst.

Es gibt m.W. auch kein Ereignis, das auf Scrollen reagiert. Sonst könnte man das Bild entsprechend in den Koordinaten verschieben. Du brauchst also eine Alternativ-Lösung. Entweder du verwendest Karins ungebundenes Userform, oder eben die multiplen Fenster. Was anders fällt mir auch nicht ein.

Gruß Mr. K.
0 Punkte
Beantwortet von xlking Experte (1.5k Punkte)
Bearbeitet von xlking

Es gibt m.W. auch kein Ereignis, das auf Scrollen reagiert.

Da fällt mir ein, wenn es kein Ereignis gibt, dann muss man sich halt eins schreiben. Wenn du folgenden Code in ein allgemeines Modul kopierst, würde das von dir gewünschte gehen. Beim Scrollen würde die Position des Bildes angepasst, sodass es effektiv immer an der gleichen Position im Bildschirmausschnitt bleibt. Aber Achtung: Ein Fehler im Code und der Timer lässt sich nicht mehr zurücksetzen oder Excel schmiert ab. Deshalb schlage ich diese Möglichkeit nur ungern vor. Schalte unbedingt den Timer aus bevor du Änderungen am Code vornimmst. Dazu einfach das Makro TimerOff ausführen.

Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Private hEvent As LongPtr
Private ScrollRow As Long
Private ScrollColumn As Long
Private VersatzTop As Single
Private VersatzLeft As Single
Public Sub TimerOn()
    If hEvent <> 0 Then Exit Sub
    hEvent = SetTimer(0, 0, 200, AddressOf CheckScrollEvent)
End Sub

Public Sub TimerOff()
    If hEvent = 0 Then Exit Sub
    KillTimer 0, hEvent
End Sub
Public Sub CheckScrollEvent(ByVal hWnd As LongPtr, ByVal uMsg As LongPtr, ByVal wParam As LongPtr, ByVal lParam As LongPtr)
  On Error Resume Next
  If ActiveWorkbook.Name = ThisWorkbook.Name And ActiveSheet.Name = Worksheets("Tabelle1") Then
    If ScrollRow = 0 And ScrollColumn = 0 Then
      VersatzTop = ActiveSheet.Shapes(1).Top
      VersatzLeft = ActiveSheet.Shapes(1).Left
    End If
    
    If ActiveWindow.ScrollRow <> ScrollRow Or ActiveWindow.ScrollColumn <> ScrollColumn Then
      ActiveSheet.Shapes(1).Left = ActiveWindow.VisibleRange.Cells(1).Left + VersatzLeft
      ActiveSheet.Shapes(1).Top = ActiveWindow.VisibleRange.Cells(1).Top + VersatzTop
      ScrollRow = ActiveWindow.ScrollRow
      ScrollColumn = ActiveWindow.ScrollColumn
    End If
  End If
End Sub

Den Code musst du noch an deine Bedürfnisse anpassen. Statt Shapes(1) natürlich Shapes("Grafik 1") und statt Tabelle1 den Namen deines Tabellenblatts.

Damit der Timer Startet musst du natürlich TimerOn ausführen. Das kannst du z.B. über das Workbook_Open Event im Modul "DieseArbeitsmappe" machen. Dann wird der Timer beim Öffnen der Datei automatisch gesetzt und das Event startet.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  TimerOff
End Sub

Private Sub Workbook_Open()
  TimerOn
End Sub

Gruß Mr. K.

0 Punkte
Beantwortet von jelena Mitglied (750 Punkte)
Bearbeitet von jelena

Hallo guten Tag, vielen Dank an alle Helfer/innen. Ich habe eine Grafik mit Formatierung in eine UserForm eingefügt. Nochmal Danke

0 Punkte
Beantwortet von vbastler Mitglied (228 Punkte)

Moin allerseits,

so wie Du Dir das vorstellst (eigentlich eine CSS/HTML-Funktion vgl. background-fixed) klappt das in XL nur, wenn du das Bild in eine Zeile in einem eingefrorenen Bereich einfügst. Dazu definierst Du über Ansicht > Fenster fixieren > Auswahl einen Bereich als Spalte und/oder Zeile, die auch beim Scrollen unverändert bleiben. Eigentlich gedacht für Zeilen/Spalten-Titel, kann es aber auch hier helfen.

Wenn Du das mit VBA realisieren willst, schau mal hier

So nebenbei: du könntest Deinen o.g. Code mit With deutlich übersichtlicher vereinfachen:

With Userform2
    .Top = 200
    .Left = 200
    .Show
End With

Grüße

d'r Bastler von den VBAsteleien.de

...