Wie kann man in VBA (Excel) ein Bild verschieben?

... komplette Frage anzeigen

1 Antwort

(Leider gibt es auf VBA-Userforms keine PictureBox-Elemente, die sowohl ein Bild anzeigen als auch den Fokus erhalten können, und eine Userform hat auch keine KeyPreview-Eigenschaft, sodass dies etwas komplizierter ist als in VB.)

Ich hab mal ein bisschen rumgespielt:

Wenn du überhaupt ein Steuerelement auf der Form hat, das den Fokus erhalten kann (das sind alle außer Image und Label), brauchst du ein solches Steuerelement, das die Tastenereignisse verarbeiten kann. Sonst reicht es, wenn die UserForm das tut.

Im KeyDown-Ereignis prüfst du, ob der KeyCode eine der Pfeiltasten darstellt. Falls ja, verschiebst du das Image-Control entsprechend.

(Welche KeyCodes das sind, kannst du über ein Debug.Print in der KeyDown-Ereignisprozedur herausfinden.)

Wenn der KeyCode eine der Pfeiltasten darstellt, solltest du außerdem den KeyCode auf 0 setzen, damit der Fokus nicht auf das nächste/vorige Control, das den Fokus erhalten kann, verschoben wird. (KeyCode = 0 bedeutet, dass dieser Tastendruck nicht weiter verarbeitet werden soll.)

Damit das verschobene Control auch immer im Bereich der UserForm bleibt, habe ich folgenden Code in ein Modul geschrieben:

Public Sub MoveByKey(ByVal ctl As Control, ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer, Optional ctnr As Object = Nothing)
With ctl
If Shift = 0 Then
Select Case KeyCode
Case XX, XX, XX, XX
If ctnr Is Nothing Then Set ctnr = ctl.Container
Select Case KeyCode
Case XX: .Left = WorksheetFunction.Max(.Left - 1, 0) 'Pfeil nach links
Case XX: .Top = WorksheetFunction.Max(.Top - 1, 0) 'Pfeil nach oben
Case XX: .Left = WorksheetFunction.Min(.Left + 1, ctnr.InsideWidth - .Width) 'Pfeil nach rechte
Case XX: .Top = WorksheetFunction.Min(.Top + 1, ctnr.InsideHeight - .Height) 'Pfeil nach unten
End Select
KeyCode = 0 'Den Key als abgearbeitet markieren, damit durch die Pfeiltasten nicht andere Controls aktiviert werden
End Select
End If 'ctl
End With
End Sub

(Was für die XX eingetragen werden muss, überlasse ich mal dir zum Herausfinden.)

Wenn du als Anfänger aber so einen Code ablieferst, wird dir keiner glauben, dass du den nicht aus dem Internet oder so hast.

Nimm also lieber direkt den Ereignishandler

Sub CommandButton1_KeyDown

usw.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von nullahnung3000
09.04.2016, 21:43

Erstmal will ich sagen, dass deine Unterstützung echt super ist.

Ich habe mich ein bisschen erkundigt, um herauszufinden, was es mit dem "case" auf sich hat.  

Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber 
Hilfe, wenn man auf F1 klickt (als Beispiel)

Leider weiß ich nicht, wie mir das weiterhelfen soll.

Das Ziel für die Arbeit ist, etwas mit Excel zu programmieren. Also habe ich mir ausgedacht zwei Raumschiffe (eins oben und eins unten) gegenüber fliegen zu lassen (nur nach rechts und links) und sich gegenseitig abzuschießen.

Erstmal ist es mir jedoch wichtig zu wissen wie man ein Objekt mit Tasten bewegen kann.

Übrigens bin ich mir sicher, dass mein Lehrer es eher befürworten würde, wenn ich mich erkundige.

 

0

Was möchtest Du wissen?