プロが教える店舗&オフィスのセキュリティ対策術

VBAで特定のキーを押すとRGB(i+1,255,255)みたいに
キー入力が入るたびに1足したいです
ですが、今のコードでやるとFor文が無限にループしてしまいます
無知を承知で、どこが悪いのか、どういう仕組みにすべきなのか教えてください
本当に、無知ですみません 

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Integer

If KeyCode = vbKeyLeft Then

For i = 0 To 255

Application.Wait (Now + TimeValue("0:00:03"))

Label1.Left = Label1.Left - 1
Label1.ForeColor = RGB(i, 0, 255)

End If

If KeyCode = vbKeyRight Then

For i = 0 To 255

Application.Wait (Now + TimeValue("0:00:03"))

Label1.Left = Label1.Left + 1
Label1.ForeColor = RGB(0, 255, i)

End If

If KeyCode = vbKeyUp Then

For i = 0 To 255

Application.Wait (Now + TimeValue("0:00:03"))

Label1.Top = Label1.Top - 1
Label1.ForeColor = RGB(255, i, 0)

End If

If KeyCode = vbKeyDown Then

For i = 0 To 255

Application.Wait (Now + TimeValue("0:00:03"))

Label1.Top = Label1.Top + 1
Label1.ForeColor = RGB(i, 0, 255)

End If

End Sub


あほは承知で
回答お願いします

質問者からの補足コメント

  • 回答ありがとうございます!
    一番大事なとこ書いてませんでした申し訳ないです!
    次から気をつけますね!

    特定のキーが入力される度に色を変えたいというか
    キーを長押しすると色がグラデーションのようになって欲しいんです
    伝わるかな、、、?
    押せば押すほどiが増えるから
    色が変わるんじゃないかなって
    説明するの難しいですね、、、
    例えば◆があるとすれば
    ←を入力した際に色を微かに変えたいんです
    そうするとRGBのグラデーションになる、と思ったんです
    私の語彙力ではこれば精一杯です申し訳ありません

    的外れかもしれませんけど
    RGBよりHSVの方が良かったりするんですかね

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/01/15 00:42
  • うーん・・・

    返信遅くなり申し訳ありません!
    その通りにやってみましたが
    どうも左のキーを押した瞬間にループが止まらなくて
    うわーーーーーってなりました、、、

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/01/16 17:44

A 回答 (6件)

Forの無限ループはわかりませんけど、1つのlabelを色を変えて移動させても



>色がグラデーションのようになって欲しいんです

にはならないように思いますけどね。
検証はしてませんが、単に同じlabelが色を変えながら移動するだけでグラデーションのように残像現象みたいにはならないのでは?と。
    • good
    • 0

やりたい事はこんなことでしょうか。



Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Static n

If KeyCode = vbKeyLeft Then
If n > 0 Then
n = n - 1
Label1.Left = n
Label1.ForeColor = RGB(0, 255, n)
End If
End If

If KeyCode = vbKeyRight Then
If n < 255 Then
n = n + 1
Label1.Left = n
Label1.ForeColor = RGB(0, 255, n)
End If
End If

End Sub
    • good
    • 0

多分ウェイトとして「Application.Wait (Now + TimeValue("0:00:03"))」を使っていたのかなぁ?と思って残しましたが全く不要なので省きました。



※「Sample」マクロを実行して下さい。
※ 「←」「→」「↓」「↑」でラベルの位置が動きます。
※ 「E」「R」「F」「G」「V」「B」でラベルの背景色が変化します。

☆ 標準モジュールへ

Public T As Long '上
Public L As Long '左
Public R As Long '赤
Public G As Long '緑
Public B As Long '青

Sub Sample()
 UserForm1.Show
End Sub


☆ フォームへ

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Select Case KeyCode
  Case vbKeyLeft
   If L > 0 Then '「0」は適当に
    L = L - 1
   Else
    L = 0 '「0」は適当に
   End If
  Case vbKeyRight
   If L < 100 Then '「100」は適当に
    L = L + 1
   Else
    L = 100 '「100」は適当に
   End If
  Case vbKeyUp
   If T > 0 Then '「0」は適当に
    T = T - 1
   Else
    T = 0 '「0」は適当に
   End If
  Case vbKeyDown
   If T < 100 Then '「100」は適当に
    T = T + 1
   Else
    T = 100 '「100」は適当に
   End If
  Case vbKeyR
   If R < 255 Then R = R + 1
  Case vbKeyE
   If R > 0 Then R = R - 1
  Case vbKeyG
   If G < 255 Then G = G + 1
  Case vbKeyF
   If G > 0 Then G = G - 1
  Case vbKeyB
   If B < 255 Then B = B + 1
  Case vbKeyV
   If B > 0 Then B = B - 1
 End Select
 Label1.Left = L
 Label1.Top = T
 Label1.BackColor = RGB(R, G, B)
End Sub
「VBAとFor文について」の回答画像4
    • good
    • 0

字下げを付け忘れました。

(☆ フォームへ だけです)

☆ フォームへ

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

 Select Case KeyCode
  Case vbKeyLeft
   If L > 0 Then '「0」は適当に
    L = L - 1
   Else
    L = 0 '「0」は適当に
   End If
  Case vbKeyRight
   If L < 100 Then '「100」は適当に
    L = L + 1
   Else
    L = 100 '「100」は適当に
   End If
  Case vbKeyUp
   If T > 0 Then '「0」は適当に
    T = T - 1
   Else
    T = 0 '「0」は適当に
   End If
  Case vbKeyDown
   If T < 100 Then '「100」は適当に
    T = T + 1
   Else
    T = 100 '「100」は適当に
   End If
  Case vbKeyR
   If R < 255 Then R = R + 1
  Case vbKeyE
   If R > 0 Then R = R - 1
  Case vbKeyG
   If G < 255 Then G = G + 1
  Case vbKeyF
   If G > 0 Then G = G - 1
  Case vbKeyB
   If B < 255 Then B = B + 1
  Case vbKeyV
   If B > 0 Then B = B - 1
 End Select
 Label1.Left = L
 Label1.Top = T
 Label1.ForeColor = RGB(R, G, B)
 Application.Wait (Now + TimeValue("0:00:03"))

End Sub
この回答への補足あり
    • good
    • 0

もしかしたら以下の様な事?



☆ 標準モジュールへ

Public T As Integer '上
Public L As Integer '左
Public R As Integer '赤
Public G As Integer '緑
Public B As Integer '青

☆ フォームへ

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Select Case KeyCode
Case vbKeyLeft
If L > 10 Then '「10」は適当に
L = L - 1
Else
L = 10 '「10」は適当に
End If
Case vbKeyRight
If L < 100 Then '「100」は適当に
L = L + 1
Else
L = 100 '「100」は適当に
End If
Case vbKeyUp
If T > 10 Then '「10」は適当に
T = T - 1
Else
T = 10 '「10」は適当に
End If
Case vbKeyDown
If T < 100 Then '「100」は適当に
T = T + 1
Else
T = 100 '「100」は適当に
End If
Case vbKeyR
If R < 255 Then R = R + 1
Case vbKeyE
If R > 0 Then R = R - 1
Case vbKeyG
If G < 255 Then G = G + 1
Case vbKeyF
If G > 0 Then G = G - 1
Case vbKeyB
If B < 255 Then B = B + 1
Case vbKeyV
If B > 0 Then B = B - 1
End Select
Label1.Left = L
Label1.Top = T
Label1.ForeColor = RGB(R, G, B)
Application.Wait (Now + TimeValue("0:00:03"))

End Sub
    • good
    • 0

For ~ Next 文は何をやりたいのでしょうか?


ちなみに「For」の数と「Next」の数が合いませんし…
下記のように字下げの習慣をつけると良いと思います。(何をやりたいか判らないので回答ではありません)
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Integer
 If KeyCode = vbKeyLeft Then
  For i = 0 To 255
   Application.Wait (Now + TimeValue("0:00:03"))
   Label1.Left = Label1.Left - 1
   Label1.ForeColor = RGB(i, 0, 255)
  Next←が必要?
 End If
 If KeyCode = vbKeyRight Then
  For i = 0 To 255
   Application.Wait (Now + TimeValue("0:00:03"))
   Label1.Left = Label1.Left + 1
   Label1.ForeColor = RGB(0, 255, i)
  Next←が必要?
 End If
 If KeyCode = vbKeyUp Then
  For i = 0 To 255
   Application.Wait (Now + TimeValue("0:00:03"))
   Label1.Top = Label1.Top - 1
   Label1.ForeColor = RGB(255, i, 0)
  Next←が必要?
 End If
 If KeyCode = vbKeyDown Then
  For i = 0 To 255
   Application.Wait (Now + TimeValue("0:00:03"))
   Label1.Top = Label1.Top + 1
   Label1.ForeColor = RGB(i, 0, 255)
  Next←が必要?
 End If
End Sub
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!