[[20091022134743]] 『文字の点滅について』(秋はサンマ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字の点滅について』(秋はサンマ)
 過去ログを検索して見つけたコードなんですが、数秒文字が点滅した後
 J3,N3,B17の文字だけ透明色で終えてしまいます。
 元の文字色で終える解決方法を教えていただけないでしょうか?
 よろしくお願いします。

 Private Sub Worksheet_Activate()
  Dim selR As Range
  Dim selId() As Integer
  Dim selNum As Integer
  Dim i As Integer, colorId(1) As Integer
  Dim counter As Integer, setTime, flash
  Set selR = Range("B3, J3, N3 ,B17") '点滅させるセル範囲
  selNum = selR.Count
  colorId(0) = 3                   '点滅色
  colorId(1) = 2                   ' 〃
  ReDim selId(1 To selR.Count)
  For i = 1 To selR.Count
    selId(i) = selR(i).Font.ColorIndex
  Next i
  For counter = 1 To 5
    For Each flash In colorId
      selR.Font.ColorIndex = flash
      setTime = Timer
      Do
        DoEvents
      Loop Until Timer >= setTime + 0.3
    Next flash
  Next counter
  For i = 1 To selR.Count
    selR(i).Font.ColorIndex = selId(i)
  Next i
 End Sub

 こんな感じでデバッグしてみると何か見えるかもしれません。
太字が私の方で追加した部分です。
 
Private Sub Worksheet_Activate()
  Dim selR As Range
  Dim selId() As Integer
  Dim selNum As Integer
  Dim i As Integer, colorId(1) As Integer
  Dim counter As Integer, setTime, flash
  Set selR = Range("B3, J3, N3 ,B17") '点滅させるセル範囲
  selNum = selR.Count
  colorId(0) = 3                   '点滅色
  colorId(1) = 2                   ' 〃
  ReDim selId(1 To selR.Count)
  For i = 1 To selR.Count
    MsgBox selR(i).Address & "の文字色を保持します。"
    selId(i) = selR(i).Font.ColorIndex
  Next i
  For counter = 1 To 5
    For Each flash In colorId
      selR.Font.ColorIndex = flash
      setTime = Timer
      Do
        DoEvents
      Loop Until Timer >= setTime + 0.3
    Next flash
  Next counter
  For i = 1 To selR.Count
    MsgBox selR(i).Address & "の文字色を元に戻します。"
    selR(i).Font.ColorIndex = selId(i)
  Next i
End Sub
(ご近所PG)

 ご近所PGさん、こんにちは。
 コードに追加していただき、何かヒントをくださったのですよね。
 申し訳ありません、せっかく頂いたコードなのに私にはサッパリ解りません。
 ステップインをしてみましたが、MsgBoxが何度も出てきました。
 どういうことなのでしょうか?
 (秋はサンマ)

 どういうことなのか、と言う問いに対して。
 
私が言いたかったのは、
「selR(i) と記述した時に参照するセルが何処になっているか、確認しましょう」
って事です。
 
メッセージボックスには、その参照されたセルのアドレスが表示されています。
例えば、「$B$3の文字色を保持します。」とか出ましたよね。
 
さて、ここで問題なわけですが、
メッセージボックスに出てきたセル番地は、
おそらく期待しているであろう、
「B3,J3,N3,B17」の4つが出てきていたでしょうか。
 
ここを突き詰めて考えれば解決出来ると思ったの。
(ご近所PG)よ

 (ご近所PG)よ さん、ありがとうございます。
 確かに、私が点滅させたいセルとはB3セル以外違いますね。
 どうして???

 点滅させるセル範囲は
 Set selR = Range("B3, J3, N3 ,B17") 
 ここで指定しているけど、文字色を元に戻すセル範囲を指定していないという事でしょうか?
 (秋はサンマが旨い!)

 ご近所PGさんの

 >「selR(i) と記述した時に参照するセルが何処になっているか、確認しましょう」

 で考えてみた。

 それで、その「i」というのはどこのことかと考えた時、

 For i = 1 To selR.Count

 これじゃないかと思いついた。

 「1 To selR.Count」の1とはB3セルのことじゃないかな・・・
 そのB3セルから「selR.Count」だから、B3セルから下の4個のセルが対象になった。
 そんなことだろうか・・・

 でも。。。そうだとしてもその後が解らない。。。。
 (秋はサンマの塩焼きが旨い)


 良い線を攻めてます。
RangeオブジェクトのデフォルトプロパティがItemみたいで、
selR(1) とか書いた場合、
selR.Item(1) と書くのと同じになるんですね。
.Item についてはヘルプをじっくり見てみましょう。
 
そして以下のようなサンプルを提示してみる。
Sub test()
  Dim selR As Range
  Dim selR_temp As Range
  Set selR = Range("B3, J3, N3 ,B17")
  'selRに含まれるRangeの1つ1つを処理する
  For Each selR_temp In selR
    MsgBox selR_temp.Address & "だよ"
  Next
End Sub
 
追記:元の奴はこれ[[20071001104026]]かな。
元々が検証されてなかったっぽい?かな。
(ご近所PG)私は魚系は全滅ななな

 ご近所PGさん、こんばんは。もう外は真っ暗ですね。

 >良い線を攻めてます。

 そうですか!
 ちょっと嬉しいかも!!
 でも、その後の「.Item」の話しは、私には全く日本語に聞こえません。
 ということで、私には解釈不可能な気がしますねぇ。

 サンプルコードを試してみました。
 MsgBoxに、ちゃんと希望のセル番号が出ました!
 でも、それをどうすればいいものやら・・・

 元のところは、その通りです。
 そこには、
 Set selR = Range("B3, J3, N3 ,B17")
 ここだけ直せばいいように書かれていたんですけどねぇ。。。
 どうしたらいいものやら。やれやれ。
 (秋はサンマ改めぶ厚いステーキ)

 もうちょっとじっくり見たかったけど、個人的に時間がないので、
例えば上の方にある問題部分の修正としては、こんな感じです。
  For i = 1 To selR.Count
    selId(i) = selR(i).Font.ColorIndex
  Next i
↓
  i = 1
  For Each selR_temp In selR
    selId(i) = selR_temp.Font.ColorIndex
    i = i + 1
  Next
下も同様に考えてみてください。
うまくいったら完成したものを載せておくと、後々、同じ疑問を持った方のためになるかも。
(ご近所PG)ステーキ……じゅるり

 ご近所PGさんは、やっぱりステーキが大好きだったんだ。

 教えていただいた部分を修正してやってみたら、点滅が終わったら全部が消えちゃいました!
 私、何かしちゃったかな・・・

 コードはこちら
    ↓

 Private Sub Worksheet_Activate()
  Dim selR As Range
  Dim selId() As Integer
  Dim selNum As Integer
  Dim i As Integer, colorId(1) As Integer
  Dim counter As Integer, setTime, flash
  Set selR = Range("B3, J3, N3 ,B17") '点滅させるセル範囲
  selNum = selR.Count
  colorId(0) = 3                   '点滅色
  colorId(1) = 2                   ' 〃
  ReDim selId(1 To selR.Count)
  i = 1
  For Each selR_temp In selR
    selId(i) = selR_temp.Font.ColorIndex
    i = i + 1
  Next
  For counter = 1 To 5
    For Each flash In colorId
      selR.Font.ColorIndex = flash
      setTime = Timer
      Do
        DoEvents
      Loop Until Timer >= setTime + 0.3
    Next flash
  Next counter
  i = 1
  For Each selR_temp In selR
    selId(i) = selR_temp.Font.ColorIndex
    i = i + 1
  Next
  End Sub
 (秋はぶ厚いステーキに赤ワイン)

 点滅が終わった後に
 書式を戻す方が変ですよね。

 上と下はほとんど同じですが
 全く同じではありません。

 それにしても
 元の文字色が色んな色だったりするんですか?
 しないんなら一つずつ色の情報をのけておいて
 一つずつ元に戻す なんて事をしなくても
 良さそうにも思いますが。

 (HANA)

 HANAさん、こんばんは。

 ご近所PGさんが、

 >下も同様に考えてみてください。

 と言われたのは、同じものを貼り付けるということじゃなかったんですね。
 まだ問題があったとは。。。

 だから、HANAさんの

 >点滅が終わった後に書式を戻す方が変ですよね。

 というわけなんですね。

 >元の文字色が色んな色だったりするんですか?

 いいえ、元の色は黒色です。
 HANAさんは、このコードじゃなく出来そうですが、
 どうか、その方法を教えていただけませんでしょうか?
 よろしくお願いします。
 (秋はぶ厚いステーキに赤ワイン)

 ん?
 今のが上手く変更出来なかったって事ですか?

 >同じものを貼り付けるということじゃなかったんですね。
 だって、上側と下側は違う部分が有りますよね?
 しかも、同じだったらタブン
 「同じ物を貼り付ける」って書いて居られると思いますよ。

 (HANA)

 HANAさん、そうなんですよぉ。
 上手く変更が出来なかったんです。。。

 >同じだったらタブン「同じ物を貼り付ける」って書いて居られると思いますよ

 そうですよね。
 でも、私にはさっぱり解りません。。。
 (秋はぶ厚いステーキに赤ワイン)

 済みません、思いの外遅くなっちゃいました。。。

 あら〜、見つかりませんでしたか。

 このコードは大きく分けると
 4つの部分から出来てますね。
 せっかくなので、ご近所PGさんの
 メッセージボックス付きのコードを引用しますが

 1つ目は色々設定をする部分です。
  これから使う変数 
  点滅させるセル番地 
  点滅で使う二色の色 等が書いてあります。

 2つ目は、点滅させるセルの文字色を調べて
      書き留めておく部分です。
  For i = 1 To selR.Count
    MsgBox selR(i).Address & "の文字色を保持します。"
    selId(i) = selR(i).Font.ColorIndex
  Next i

  これですね。「文字色を保持します」って書いてあります。
  selId(i) に selR(i).Font.ColorIndex = selR(i)の文字色インデックス を
  覚え書きとして残しておきます。

  でないと、後で戻そうと思った時に
  何色に戻せば良いのか分からなく成ってしまいますからね。

 3つ目に、設定した2色で文字色を点滅させます。

 4つ目で、文字の色を最初の色に戻します。
      何色にすれば良いのか、2番目の覚え書きを見ながら戻します。
  For i = 1 To selR.Count
    MsgBox selR(i).Address & "の文字色を元に戻します。"
    selR(i).Font.ColorIndex = selId(i)
  Next i

  ここです。「文字色を元に戻します」って書いてあります。
  selR(i).Font.ColorIndex = selR(i)の文字色インデックス を selId(i) に 
  戻します。

 メッセージボックスが無い場合は、3行ずつのコードです。

 保持
  For i = 1 To selR.Count
    selId(i) = selR(i).Font.ColorIndex
  Next i

 戻す 
  For i = 1 To selR.Count
    selR(i).Font.ColorIndex = selId(i)
  Next i

 よく見て違いを見つけましょう。

 例えば、
  箱に物を収める作業と
  物を箱から出す作業は
 似た動作をしますが
   物を掴んで、箱の縁を跨いで、掴んだ物を放す
 同じではありませんね。

 まぁ、どうしても分からなければ
 その旨書いておけば 誰かが教えて下さるでしょう。

 それと、ニックネームは貴方の顔ですから
 一つにして於いた方が良いと思いますよ。
 あくまでも、個人的見解ですが。

 (HANA)私もサンマよりはステーキの方が。。。

 今朝から、ず〜っと違いはどこかと眺めてて、ちょっと目が充血ぎみですぅ。。。
 でも、何となく違うところを見つけちゃいました!!!
 それが下のコードです。
 諸先生の皆様、これで正解でしょうか?

 Private Sub Worksheet_Activate()
  Dim selR As Range
  Dim selId() As Integer
  Dim selNum As Integer
  Dim i As Integer, colorId(1) As Integer
  Dim counter As Integer, setTime, flash
  Set selR = Range("B3, J3, N3 ,B17") '点滅させるセル範囲
  selNum = selR.Count
  colorId(0) = 3                   '点滅色
  colorId(1) = 2                   ' 〃
  ReDim selId(1 To selR.Count)
  i = 1
  For Each selR_temp In selR
    selId(i) = selR_temp.Font.ColorIndex
    i = i + 1
    Next
  For counter = 1 To 5
    For Each flash In colorId
      selR.Font.ColorIndex = flash
      setTime = Timer
      Do
        DoEvents
      Loop Until Timer >= setTime + 0.3
    Next flash
  Next counter
 i = 1
  For Each selR_temp In selR
    selR_temp.Font.ColorIndex = selId(i)
    i = i + 1
    Next
 End Sub

 (秋葉三馬)

 >今朝から、ず〜っと違いはどこかと眺めてて
 ん?何を眺めてたんですか?
 なんか書いただけ無駄だった気がする。

 ・・・まぁ、それでご希望の様になったのなら
 良いのではないでしょうか。

 (HANA)

 HANAさん、フォローありがとうございます。
 
 > ん?何を眺めてたんですか?
 
もちろんHANAさんが書いてくれたコードの解説に違いないです。ええ。

 > 諸先生の皆様、これで正解でしょうか?
 
正解は、秋葉三馬さんの期待通りに動いた物が正解、と言えます。
コードの修正内容に関して言えば、
私が読み取って頂きたいと思っていた通りに直ったと思います。
 
一点だけ、
  Dim selR_temp As Range
という宣言を追加してあげたいかな。一応。

 今回のやり取りから、少しでもマクロに対する理解が深まった事を期待しつつ。
(ご近所PG)

 難しいですね。。。

 さて、コードが無事に動くように成った所で
 >いいえ、元の色は黒色です。
 の話を少ししておこうと思います。

 今のコードは、文字色を変更する前に
 それらのセルの文字色を確認して於いて
  点滅させた後
 最初に設定してあった文字色に戻します。

 ですから、汎用性は高いと思います。
 文字色を好きに変更して於いても
 ちゃんとその色に戻るのですから。

 ただ、状況によっては
 「絶対黒。黒しかあり得ないから 確認しなくても黒に戻せば良いよ」
 って事も有るかと思います。

 そんな時は、最初に確認なんかせずに
 終わったらとにかく黒に戻すコードでも良いかもしれません。

 >Set selR = Range("B3, J3, N3 ,B17")
 これのイメージですが≪注・あくまでもイメージだけです≫
 B3,J3,N3,B17セルに、selR と言う名前が付いていると想像してみてください。
  メニュー・挿入→名前→定義 でセルに名前を付けるイメージです。
 すると、selR と言うと、この4つのセルの事ですね。

 この4つのセルの文字色が「自動」の色に成ればよいので
 selR.Font.ColorIndex = xlAutomatic
 ~~A~ ~~~~~~~~~~~~~B~   ~~~~~~~~~C~
 A.selR            = B3, J3, N3 ,B17 の4つのセルの
 B.Font.ColorIndex = 文字色
 を
 C.xlAutomatic     = 自動
 にします。

 最初のセルの状態がどうであっても これを実行すればよいのなら
 2つ目の、点滅させるセルの文字色を調べて書き留めておく必要は無くなります。
 また、4つ目では 書き留めておいた文字色に・・・(書き留めてないので・・・)
 するのではなく、4つのセルの文字色を「自動」の色に設定すれば良いですね。

 何となく分かりますか?

 但し、その事を知らない人が好きなように使いたいと思った時に
 「文字の色をわざわざ黒以外の色にしているのに
  勝手に黒に戻って困るんだけど!!」って状況が
 来るかもしれません。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.