• ベストアンサー

ラベルの文字色変更

VBでラベルの文字色を透明から黒に徐々にしたいと思ってるんですけど。 For文で作ってみたものの・・・ エラーがでて困っています。 作ってみたFor文を以下に書きます。 For i = 255 To 0 Step -2 Label1.ForeColor = RGB(i, i, i) Next この文の中の RGB(i,i,i) というところがエラーでます。。 どうしたら徐々に色を変化させれるのか教えてください!

質問者が選んだベストアンサー

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

デバッグ作業の際には、Forの内部で。。。等々の、不要な(正常に動作している)個所をそぎ落としていって、最終的にエラー発生の最終的なポイントを特定する事が肝要です。 たとえば、ループの内外関係なく以下の一文だけでも同様のエラーが発生します。 Label1.ForeColor = RGB(0, 0, 0) そこで、RGB関数をヘルプで引くと、Integerを返す関数です。 そのうえで、エラーメッセージと突合せると、ForeColorはsystem.drawing.color型なので、Integer型を設定できないという意味だと読み取れます。 ※「値をsystem.drawing.colorに変換できません」=自動変換できない型の値を代入しようとしています、程度に意訳できます。 それではRGB関数同様に色を指定して、system.drawing.color型の値を作成するにはと言うと system.drawing.colorをヘルプで引くと、FromArgbというメソッドが見つかります。 という事で、以下のように書きなおせばOK Label1.ForeColor = RGB(i, i, i) ↓ Label1.ForeColor = Color.FromArgb(i, i, i) デバッグに必要な切り分け方、ヘルプの情報の当たりの付け方を書いてみました。 ちなみに、#2で書いたように意味のあるコードにする為にはというのを、VB2010で書くと以下の通り Dim i As Integer Dim j As Integer For i = 255 To 0 Step -2 Label1.ForeColor = Color.FromArgb(i, i, i) 'フォームを再描画してラベルの色変えを画面上に反映させる Me.Refresh() '徐々に色が変わっていく様子を見せる為に、待機処理をする '待機時間はループ回数で調整する For j = 0 To 1000 Application.DoEvents() Next Next

qwerjpo
質問者

お礼

回答ありがとうございます。 なんとか徐々に色を変えることができました!! 問題解決の仕方等、教えてくださってありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

コードを見る限り、VB6以前のソースのようですので、そのように解釈してコメントします。 #1の方が書いているように、最終的にはiの値は-1になりますが、stepの値がマイナスで、終了条件が0なのでRGB(-1, -1, -1)は実行されないはず。 実際に、VB6でこのコードを動かしましたがエラーは発生しませんでした。 どちらかと言えば、Label1って名前のコントロールが存在しないなど、別の理由でエラー発生ではないかなという気がします。 とりあえず、何が原因でエラー発生しているのかを調べないことには何も言えません。 たとえば、以下のようなコードに書き直して調査します。 一度、tmpColorに値を格納してから設定するなどの冗長なコードは、エラーの発生個所を明確にする為です。 dim i As Long dim tmpColor As Long '事前にForeColorを設定する Label1.ForeColor = &HFFFFFF MsgBox "ループ開始" For i = 255 To 0 Step -2 'イミディエイトウィンドウにiの値を表示する Debug.Print i tmpColor = RGB(i, i, i) Label1.ForeColor = tmpColor Next MsgBox "ループ終了" ちなみに、エラーが出なくなったとしてもこのコードは無意味です。 あくまでForを使用するのであれば、以下のような感じです。 For i = 255 To 0 Step -2 Label1.ForeColor = RGB(i, i, i) 'フォームを再描画してラベルの色変えを画面上に反映させる Form1.Refresh '徐々に色が変わっていく様子を見せる為に、待機処理をする(待機時間はDoEventsの個数で調整) DoEvents DoEvents ~~~ DoEvents を10000行ぐらい書く ~~~ DoEvents Next 実際には、タイマーを使って徐々に色が変わるように作成するべきですが。

qwerjpo
質問者

お礼

すいません。 VBのバージョンを書いてませんでしたね。。 今使ってるのはVB2010Betaです。 VB6でやって下さってありがとうございます。 一応、タイマーでやってます!

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

エラーが出たとき、iの値が-1なんじゃない? > For i = 255 To 0 Step -2 -2の差分なので、3,1,-1とループの最終回は-1で実行。 最終回を0でなく1まででやめるか (For i = 255 To 1 Step -2 ね) if文で判断するか。 For i = 255 To 0 Step -2  if i < 0 then   Label1.ForeColor = RGB(0,0,0)  else   Label1.ForeColor = RGB(i,i,i)  end if Next かな。

qwerjpo
質問者

お礼

エラーの内容を書いてませんでしたね。。 すいません。。 エラーの内容は、 iの値をsystem.drawing.colorに変換できません。 っていうエラーです。 どうにかして変換とかできないんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ラベル内容変更の簡略化がしたい。

     いつもお世話になっております。  エクセル97のVBAで、ユーザーフォーム上に配置されたラベルの内容を書き換えて、ユーザーフォームに表示される文字列を変更するのは、 Label1 = 文字列  と、するだけで良いことは気づいていましたが、今度は大量のラベルの内容を一気に変えたくなり、For文系の命令で添え数字を変化させたい、と思ったのですが、上手くいきません。  ここはどういう風に記述すべきなのでしょうか?  以下の例のようなイメージで、2行目の記述はどうすべきでしょうか? ====================================================================== 例)Label1からLabel100までの内容を、一括変更するマクロ For i = 1 to 100 Label & i = "使用中" Next ======================================================================  よろしくお願いします。

  • エクセルVBAラベルの変数?

    エクセル2000VBAにて下記のように作成しました。 With ActiveSheet For i = 4 To 200 If Label1.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label6.Caption = .Cells(idx, h) Label7.Caption = .Cells(idx + 2, h) GoTo ラベル2 End If Next idx End If Next h End If Next i ラベル2: For i = 4 To 200 If Label2.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label8.Caption = .Cells(idx, h) Label9.Caption = .Cells(idx + 2, h) GoTo ラベル3 End If Next idx End If Next h End If Next i ラベル3: ・・・ End With Label1~5まで同じ処理を行うため 1~5まで変数を使用して簡単にしたいのですが Label(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • VB2010でラベルに文字を結合したい

    VB2010でTextboxで辺の長さの数値を入力し、その数値分「*」を表示して正方形を作るアルゴリズムを考えています。どんな感じかは添付画像を参照していただければと思います。 Dim saizu As Integer Dim i, j As Integer saizu = TextBox1.Text For i = 1 To saizu For j = 1 To saizu Label1.Text = "*" Next Label1.Text = vbLf Next 考え方はこんな感じだと思うのですが、このままだとLabel1の中身が毎回更新されてしまい、結局何も表示されないという結果になることに気づきました。 確かVBにはLabelの手前に何か連結演算子のようなものをつけることで、更新されるのではなく追加していくというふうにできたと思うのです(記憶違いならこの質問自体が意味のないことになってしまうのですが…)。検索エンジンでいろいろと検索しては見たのですが、検索ワードがどれも曖昧な所為か私が必要としている答えにたどり着くことができませんでした。 曖昧な質問で申し訳ないのですが、Labelなどで文字を更新するのではなく結合する連結演算子のようなものを回答していただけたらありがたいです。もし、そんなものはないよ、という場合も教えていただければと思います。よろしくおねがいします。

  • VBA:ユーザフォームのラベルの指定の仕方教えてください。

     今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。  Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?  やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。 -------------------------------------------- Sub セルの値をラベル表示する() For i = 1 To 20 With UserForm1.Label(i) .Caption = Cells(1, i) End With Next i End Sub

  • ボタンを押すとラベルの文字をかえるには

    VB2008エクスプレスを使っています 初歩的な質問なんですが フォームにボタンとラベルを貼って ボタンを押すとラベルの文字が変わるように設定したいです buttun1クラスで clickメドットで Label1.Text = Label.text("") で("")内に文字を入力したんですが エラーになってしまします

  • Visual Basic6.0を使用しています。

    Visual Basic6.0を使用しています。 質問なのですが、テキストラベル100個で、10*10の表を作りました。 その100個のラベルの一つ一つに3ケタ乱数を入れたいと思って、For文を使用したのですが、 エラーが出てしまいます。 For k = 5 To 104 Label(k).Caption = Int((999 - 100 + 1) * Rnd + 100) Next k ⇒このように作ったのですが、Label(k)のところをどのようにしたらいいかわからなくて困ってます。 文がわかりにくくて申し訳ないのですが、どなたかわかる方いらっしゃいましたらよろしくお願いします! LabelをFor文で回すこと自体できないのでしょうか? ちなみにFor文で回さずに一つ一つの表に乱数を入れるのは成功します。

  • 配列化

    VB2005においてlabel,textboxといったコントロールを配列化したいのですがどうすればいいでしょうか? VB6では下記のコードが成り立ちますが・・・ For i=0 to 3 label(i).caption = str(i) Next このようにコントロール自体を配列化することは出来るのでしょうか?

  • Q:Ecvel 2007 VBA: 長い処理の間のメッセージ?

    いつもお世話になります。 ユーザーフォームの下にラベルを置いて、ステータスバー的に使っています。 ちょっと時間が掛かる処理があることが分かったので、その間は「処理中・・・」的なメッセージを出すことにしました。 現在は以下のようなプログラムにしています。 Option Explicit Private Sub CommandButton1_Click() setColor1 '<==Break? setcolor2 Dim i As Long For i = 2 To 10000 Cells(i, 5).Value = "wanwan" Next i setcolor3 End Sub Sub setColor1() With UserForm1.Label1 .Caption = "you push the button..." .ForeColor = RGB(0, 255, 0) End With End Sub Sub setcolor2() With UserForm1.Label1 .Caption = "wait for a while..." .ForeColor = RGB(255, 0, 0) End With End Sub Sub setcolor3() With UserForm1.Label1 .Caption = "Finished" .ForeColor = RGB(0, 0, 0) End With End Sub これを実行しても、Forループの間はLabel1のCaptionはフォームデザイン時のデフォルト値Beforeになったままで、Forループが終わるとsetcolor3によってセットされるFinishedになります。 setcolor1、setcolor2が表示する途中経過は見えません。 しかし、上のリストの Break? と書いているところにブレークポイントを置いて、ブレークしたらF8を連打してsetcolor1、setcolor2を手動実行するとメッセージは狙い通りに変わります。 Forループの中でワークシートに何らかの操作を行っている場合にのみ起こる現象で、Forループの中でwait文を書いて10秒待つとかやると、メッセージは狙い通りに変わります。 ワークシートを処理しながら、メッセージを狙い通りに変える方法はあるでしょうか。 何かわかりましたらよろしくお願いします。 なお、ユーザーフォームの画像を添えます。

  • ACCESS VBA のFor文のStepについて

    ACCESS VBAでFor文を使った構文を作っているのですが、Stepについて+、-は使えたのですが、乗算、割り算は使えないのでしょうか? For i = 10 to 10000 step *10 ~処理 Next i にすると"*"でコンパイルエラーが出ます。 10、100、1000、10000の処理がしたいのです。 Forでは無理なのでしょうか?

  • vb6で覚えたことがvb2010で活かせれない。。

    グラフの目盛表示をしたくて、 vb2010で下記のコードを入力したのですが、何回やってもエラーがでます。 どなたか教えてください。 --------------------------------- J = 0 For I = 0 To 200 Step 40 CurrentX = 120 CurrentY = 100 + I strB = CStr(0.2 - (2 / 5) * J * 0.1) Print strB J = J + 1 Next J = 0 For I = 0 To 200 Step 40 CurrentX = 120 CurrentY = 300 + I strB = CStr(0 - (2 / 5) * J * 0.1) Print strB J = J + 1 Next -------------------------------------