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

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.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
nullahnung3000 
Fragesteller
 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
PWolff  09.04.2016, 22:06
@nullahnung3000
Select Case a
Case 1
Anweisungsblock_1
Case 2
Anweisungsblock_2
Case 3 To 5
Anweisungsblock_3
Case Is > 20
Anweisungsblock_21Plus
Case Else
Anweisungsblock_Sonst
End Selecg

ist äquivalent zu

If a = 1 Then
Anweisungsblock_1
ElseIf a = 2 Then
Anweisungsblock_2
ElseIf (a >= 3) And (a <= 5) Then
Anweisungsblock_3
ElseIf a > 20 Then
Anweisungsblock_21Plus
Else
Anweisungsblock_Sonst
End If

Um Objekte per Tasten zu bewegen, brauchst du wie gesagt eine KeyDown-Ereignisprozedur. KeyPress geht leider nicht (nach meinen Experimenten), deshalb musst du dich selbst darum kümmern, dass ein Tastendruck mehrfach berücksichtigt wird, wenn man die Taste gedrückt hält (und entsprechend beim KeyUp-Ereignis das Wiederholen wieder abschalten).

1