Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Shape langsam vergrößern

Shape langsam vergrößern
18.12.2021 16:00:51
Jens
Hallo Excel-Fans,
ich möchte mir ein Shape langsam vergrößern (und danach auch wieder verkleinern) lassen.
Das soll wie ein Slider ausschauen.
Leider bekomme ich das aktuell nicht hin.
Hier mein Versuch dazu:
https://www.herber.de/bbs/user/149888.xlsm
Wer kann mir hier helfen?
Danke
Jens

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Shape langsam vergrößern
18.12.2021 16:14:20
volti
Hallo Jens, so sollte s klappen....
Sind die 500 mSec nicht etwas lang als Wartezeit?
Code:

[Cc]

Sub ObjektErstellen2() Dim Box As Shape Dim Abstand_Links As Integer Dim Abstand_Oben As Integer Dim dblBreite As Integer Dim dblTiefe As Integer Dim i As Integer dblBreite = 10 dblTiefe = 10 Abstand_Links = 70 Abstand_Oben = 30 Set Box = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _ Abstand_Links, Abstand_Oben, dblTiefe, dblBreite) With Box .Name = "Neu" For i = 1 To 20 .Width = .Width + 1 DoEvents Sleep 500 Next i End With End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Shape langsam vergrößern
18.12.2021 17:05:17
Jens
Moin Karl-Heinz,
ja, die 500 waren auch nur zum Testen ...
DoEvents war/ist der Schlüssel, damit die Aktualisierung auch sichtbar wird.
Aber selbst bei Sleep 0.7 ruckelt es.
Unter 0.7 passiert wieder nichts (wahrscheinlich, weil DoEvents da nicht mehr mitkommt).
Hast du eine andere Idee, wie ich so einen Balken von Links (Startbreite 20 Pixel) nach rechts reinlaufen lassen kann und das wie bei Webseiten "ruckelfrei"?
Gruß
Jens
AW: Shape langsam vergrößern
18.12.2021 19:13:53
Jens
Hallo ralf_b,
vielen Dank für den Link.
Das kann ich als Startpunkt nutzen.
Witzig und interessant ist, wenn man den Sleep Faktor mal mit diesen Werten testet:
0.5
0.7
0.8
Ein extremer Unterschied.
Ich muss das mal mit einem Wert auf verschiedenen Rechnern testen.
Vielen Dank
Jens
AW: Shape langsam vergrößern
18.12.2021 19:21:07
volti
Hallo Jens,
mich wundert, dass da überhaupt ein Unterschied sein soll bei den kleinen Zahlen.
Lt. Declare wird ein Long-Wert erwartet und keine Kommazahl.
Gruß
KH
AW: Shape langsam vergrößern
18.12.2021 19:16:58
volti
Hallo Jens,
das läuft schon ziemlich ruckelfrei. Excel ist m.E. dafür nicht gemacht und grätscht wahrscheinlich immer mal mit Zwischenprozessen da rein.
Oder Du probierst mal die u.a. Idee mit Timer...
Der Code muss dann aber in ein normales Modul.
Und wenn Du einen Fortschrittsbalken brauchen solltest...Fortschrittsanzeige
Code:

[Cc][+][-]

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 Dim hTimer As LongPtr Const csBoxName As String = "Neu" Sub ShapeCallbackProc() Dim Box As Shape Dim Abstand_Links As Integer Dim Abstand_Oben As Integer Dim dblBreite As Integer Dim dblTiefe As Integer On Error Resume Next Set Box = ActiveSheet.Shapes(csBoxName) If Box Is Nothing Then dblBreite = 10 dblTiefe = 10 Abstand_Links = 70 Abstand_Oben = 30 Set Box = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _ Abstand_Links, Abstand_Oben, dblTiefe, dblBreite) Box.Name = csBoxName End If If hTimer = 0 Then hTimer = SetTimer(0&, 0&, 50, AddressOf ShapeCallbackProc) End If If Box.Width < 200 Then Box.Width = Box.Width + 1 Else KillTimer 0&, hTimer hTimer = 0: Box.Width = 10 End If End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Shape langsam vergrößern
18.12.2021 19:32:57
Jens
Hallo volti,
das schaut auch sehr gut aus. Vielen Dank für deine Idee!
Wie kann ich den Timer beeinflussen, damit es schneller geht?
Es soll kein Fortschrittsbalken werden, sondern ich überlege, ob man so etwas für eine Art Navigation nutzen kann.
Auf der linken Seite ein kleiner, kurzer, farbiger Anfang eines Balkens stehen, der beim Anklicken oder Mouseover nach rechts rausfährt und auf ein anderes Blatt verweist oder Aktionen ausführt. Ich habe leider gerade kein passendes Beispiel parat.
Stell die den Balken links in Breite 30 vor und wenn man dann mit der Maus draufzeigt, dann soll der Balken nach rechts mit Test/Hyperlink "rausfahren" und wenn man die Maus woanders hinbewegt, wieder zurück auf den 30'er Startpunkt.
Davon dann so 6,7,8 untereinander ...
Spielerei ... und die Frage ob so etwas umsetzbar ist.
Die letzten 2 Beispiele gehen schon in die Richtung.
Gruß
Jens
Anzeige
AW: Shape langsam vergrößern
18.12.2021 19:56:24
volti
Hallo Jens,
die 50 bei der Funktion SetTimer ist die Intervallzeit in mSec.
Nun zu Deiner Frage mit dem Mouseover:
Bei diesen Shapeelementen ist kein Mauseventhandling dabei, das heißt, Du kannst das Mouseover so nicht abfangen.
Allerdings klappt das über Mousehooking oder Mousepositionsabfragen über den Timer. Hierzu habe ich diverse Beispiele, wie man beim Überfahren von Shapes z.B. die Größe verändern und wieder zurückändern kann usw..
Das ist aber mit API-Funktionen programmiert und etwas aufwändiger.
Kann ich bei Interesse mal ein Beispiel hier reinstellen. Würde aber etwas dauern.
Gruß KH
Anzeige
AW: Shape langsam vergrößern
19.12.2021 07:34:45
Jens
Moin volti,
das würde ich mir sehr gerne mal anschauen, ich lerne gerne dazu.
Gerade an einem funktionierenden (und ggf. gut kommentierten Beispiel) können doch viele partizipieren.
Ich würde mich freuen.
Die Mouseover-Funktion habe ich auch irgendwo schon gehabt, muss sie nur suchen und dann entsprechend umbauen, wenn das
mit dem ein-/ausfaden des Balkens klappt.
Gruß
Jens
AW: Shape langsam vergrößern
19.12.2021 09:29:09
volti
Hallo Jens,
hier mal der Code für ein Beispiel zur Verbreiterung von Shapes bei Mouseover. Ist auch kommentiert.....
Habe ich auch in der anliegenden Datei eingebaut.
Bitte unbedingt beachten, dass über Code in "DieseArbeitsmappe" und in dem Tabellenmodul das Mousehooking auch wieder ausgeschaltet werden muss.
Mouseoverbeispiel
Code:

[Cc][+][-]

Option Explicit Public Const bNoMouseHooking = False ' Zum Bearbeiten des VBA-Codes auf True setzen Private Type POINTAPI X As Long Y As Long End Type Dim Pt As POINTAPI Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Dim R As RECT Private Declare PtrSafe Function SetWindowsHookExA Lib "user32" ( _ ByVal idHook As Long, ByVal lpfn As LongPtr, _ ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr Private Declare PtrSafe Function CallNextHookEx Lib "user32" ( _ ByVal hHook As LongPtr, ByVal nCode As Long, _ ByVal wParam As LongPtr, lParam As Any) As LongPtr Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" ( _ ByVal hHook As LongPtr) As Long Private Declare PtrSafe Function GetCursorPos Lib "user32" ( _ lpPoint As POINTAPI) As Long Private Declare PtrSafe Function GetWindowRect Lib "user32" ( _ ByVal hwnd As LongPtr, lpRect As RECT) As Long Private Declare PtrSafe Function ScreenToClient Lib "user32" ( _ ByVal hwnd As LongPtr, lpPoint As POINTAPI) As Long Dim hHook As LongPtr Dim oActShp As Object Const WM_MOUSEMOVE = &H200 Const WM_LBUTTONDOWN = &H201 Const HC_ACTION = &H0 Const WH_MOUSE_LL = 14 Const ciZuklapp As Integer = 20 ' Startbreite <<<anpassen>> Const ciAufklapp As Integer = 100 ' Aufklappbreite <<<anpassen>> Sub MausAus() ' Beendet den Mousehook UnhookWindowsHookEx hHook: hHook = 0 End Sub Sub MausAn() ' Baut den Mousehook auf If bNoMouseHooking = True Then Call MausAus: Exit Sub If hHook = 0 Then hHook = SetWindowsHookExA(WH_MOUSE_LL, AddressOf MouseProc, _ Application.HinstancePtr, 0) End If End Sub Private Function MouseProc(ByVal nCode As Long, ByVal wParam As LongPtr, _ lParam As LongPtr) As LongPtr Dim oCurObj As Object If nCode = HC_ACTION Then GetCursorPos Pt Select Case wParam Case WM_LBUTTONDOWN ' Abschalten über Caption-Kreuz ScreenToClient Application.hwnd, Pt ' Punkt auf Bildschirm umrechnen GetWindowRect Application.hwnd, R ' Kreuz-Rechteck holen If Pt.X < R.Right And Pt.X > (R.Right - 68) And _ Pt.Y > R.Top And Pt.Y < R.Top + 50 Then Call MausAus ' Mouseover abschalten End If Case WM_MOUSEMOVE On Error Resume Next Set oCurObj = ActiveWindow.RangeFromPoint(Pt.X, Pt.Y) If Err <> 0 Then Exit Function ' Fehler => raus Select Case TypeName(oCurObj) Case "Nothing" ' Außerhalb des Tabellenbereichs Case "Range" ' Maus im Rangebereich If Not oActShp Is Nothing Then oActShp.Width = ciZuklapp Set oActShp = Nothing Application.Cursor = xlDefault ' Cursor zurükcsetzen End If Case "OLEObject" ' Nicht zu verarbeitende Objekte Case Else ' Maus über einem Shape If oCurObj.Name Like "Balken*" Then If oActShp Is Nothing Then oCurObj.Width = ciAufklapp Application.Cursor = xlNorthwestArrow ElseIf oActShp.Name <> oCurObj.Name Then oCurObj.Width = ciAufklapp oActShp.Width = ciZuklapp Application.Cursor = xlDefault ' Cursor zurücksetzen End If Set oActShp = oCurObj End If End Select End Select Exit Function End If ' Mousevent an nächsten Prozess weiterreichen MouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam) End Function

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Shape langsam vergrößern
19.12.2021 12:24:39
Jens
Hallo Karl-Heinz,
supercool und genau das was ich suche.
2-3 Fragen:
Hast du eine gute Internetseite oder Buchempfehlung, wo man (ich) die Geschichte mit den PtrSafe, die Möglichkeiten
aus der user32-Lib etc. anlesen kann?
Hier scheinen noch einige Überraschungen für künftige Excel (wahrscheinlich alle Office Produkte) zu schlummern.
Hast du einen Link oder Idee, wo ich mich bezgl. VBA für Visio (2019) schlau machen kann?
Und .. kannst du mir netterweise in dem Beispiel noch 2 Punkte zeigen?
- wie kann ich die Shapes so "sichern", dass sie beim anklicken (nachdem der Balken sich verlängert hat) keinen Focus mehr bekommen?
- kannst du in einem Balken einen Text mit Hyperlink auf die Tabelle 2 hinterlegen?
Vielen herzlichen Dank!
Gruß
Jens
Anzeige
AW: Shape langsam vergrößern
19.12.2021 13:47:51
volti
Hallo Jens,
Hast du eine gute Internetseite oder Buchempfehlung, wo man (ich) die Geschichte mit den PtrSafe, die Möglichkeiten aus der user32-Lib etc. anlesen kann?
da muss ich leider passen.
Ich habe meine ganzen Grundkenntnisse bzgl. API (wegen EXE_Programme) u.a. aus "Programming Windows 95" von Charles Petzold und danach nur noch scheibchenweise aus dem (Google-)Internet. :-)
PtrSafe ist ab VBA7 bei 32Bit-Office (optional) und bei 64Bit-Office (zwingend) einzusetzen.
Wenn Du möchtest, kannst Du Dir gerne mal meinen API-Viewer (Normal oder AddIn) anschauen, da habe ich viele Funktionen und Konstanten drin und beim Stöbern wirst Du bestimmt fündig, da auch Google-Suche eingebaut ist.
API-Viewer AddIn
Kommt hier ein: C:\Users\%User%\AppData\Roaming\Microsoft\AddIns
Hast du einen Link oder Idee, wo ich mich bezgl. VBA für Visio (2019) schlau machen kann?
Leider nicht
Wenn Du einen Text hinterlegen möchtest, sollte man besser ein Textfeld nehmen. s.B. in Datei
Und statt eines Hyperlinks könntest Du auch ein Makro zuweisen oder das über das Mouseevent "WM_LBUTTON" abfangen.
Wenn ein Makro zugewiesen ist, kommt kein Focus mehr.
Neue Testversion
Gruß KH
Anzeige
AW: Shape langsam vergrößern
19.12.2021 14:39:10
Jens
Hallo Karl-Heinz,
dann habe ich ja etwas über die Feiertage zu tun :-).
Ich schaue mir den API-Viewer mal an.
Vielen Dank!
Gruß
Jens
AW: Shape langsam vergrößern
19.12.2021 13:01:43
Jens
Hallo Karl-Heinz,
Text und Hyperlink funktionieren ja wie immer ... (hätte ich erst einmal ausprobieren sollen).
Das ist also abgehakt.
Gruß
Jens
Anzeige
AW: Shape langsam vergrößern
19.12.2021 15:26:23
Jens
Hallo Karl-Heinz,
den API-Viewer kann ich mir leider nicht anschauen - Passwort geschützt ...
Gruß
Jens
Api viewer ..
19.12.2021 16:27:33
ralf_b
evtl hast du es nicht richtig verstanden. Kann ja mal vorkommen.
den API viewer sollst du nicht auseinandernehmen, sondern als Addin benutzen. Vorheriges Laden des Addins wäre dabei notwendig.
Wenn du das Addin geladen hast, dann findest du den Eintrag in der Entwicklungsumbebung unter Menüpunkt Addins.
AW: Api viewer ..
19.12.2021 16:28:48
Jens
Ah ... ok... "ja", falsch verstanden ;-)
Gruß
Jens
AW: Api viewer ..
19.12.2021 18:14:11
Volti
Hallo Ralf,
hätte ich nicht besser sagen können.
Danke und Gruß
Karl-Heinz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige