[[20170120092800]] 『文字の点滅について』(とし) ページの最後に飛ぶ

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

 

『文字の点滅について』(とし)

多数の人が見る、一日の作業スケジュール表に、当日特に注意してもらいたい事項の文字を点滅させたいと思い、検索をして見つけたのを使用させて頂きたいと思います。
本当なら、オートシェイプを作ってそれを点滅させたいのですが、VBAはよくわからないので、EXCELのカメラ機能を使てやってみました。
すると、元々その作業スケジュール表には沢山のオートシェイプが貼り付けてあり、時間になるとそのオートシェイプ全てがチカチカとフラッシュしてしまいます。(文字の点滅等はしません)
文字が点滅するのは、設定してある4か所のカメラ部分だけです。
ちなみに、1か所にみにするとフラッシュせず大丈夫なのです。

これがコードです。

Option Explicit
Dim 開始時刻, 終了時刻, インターバル, 反復時刻

Sub 開始時刻から終了時刻まで一定間隔でマクロを実行する()

    開始時刻 = TimeValue("06:00:00")
    終了時刻 = TimeValue("19:00:00")
    インターバル = TimeValue("00:15:00")
    Application.OnTime 開始時刻, "一定間隔で実行するマクロ"
End Sub

Sub 一定間隔で実行するマクロ()

    If TimeValue(Now) >= 終了時刻 Then          '終了時刻になったら終わる
        MsgBox "終了時刻になりました。"
        Exit Sub
    End If
    Call 必要な作業を行うマクロ
    反復時刻 = TimeValue(Now) + インターバル
    Application.OnTime 反復時刻, "一定間隔で実行するマクロ"
End Sub
Sub 必要な作業を行うマクロ()

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("A85,I85,O85,T85")    '点滅させるセル範囲
  selNum = selR.Count
  colorId(0) = 5                  '点滅色
  colorId(1) = 3                   ' 〃
  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.4     '点滅の早さ
    Next flash
  Next counter
  For i = 1 To selR.Count
    selR(i).Font.ColorIndex = selId(i)

  Next i

End Sub

何故、時間になるとカメラの4か所は文字が点滅させ、その他のオートシェイプはただチカチカとフラッシュしてしまうのでしょうか?

よろしくご教授をお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows8 >


やりたいこと → 注意してもらいたい事項の文字を点滅させたい

やってみたこと → VBAはよくわからないので、EXCELのカメラ機能を使てやってみました。

結果 → 時間になるとそのオートシェイプ全てがチカチカとフラッシュしてしまいます。(文字の点滅等はしません)

ということですか?
提示されたコードはVBAですよね?

カメラ機能とは何のことを指しているか不明ですが、
「図としてコピー」の機能のことではなさそうですね?

提示されたマクロを実行してみました。
結果、指定されたセルの文字が点滅します。
図(オートシェープ)はフラッシュ(=点滅?)しません。

もう一度動作確認をされてみてはいかがでしょう。

一応、コードに変数が山ほど出てきて、
何が何だか分かり難いので添削してみました。(一例です。)

Sub 文字の点滅()

    Dim t As Single
    t = Timer
    With ActiveSheet.Range("A85,E85,H85,T85")
        Do Until Timer - t > 2
            .Font.ColorIndex = IIf(.Font.ColorIndex = 3, 5, 3)
            Application.Wait [Now() + "0:00:0.4"]
        Loop
        .Font.ColorIndex = xlAutomatic
    End With
End Sub

ただし、このようなエクセルをカスタマイズするようなマクロは、
使わない方がいいと思います。
不具合が起きる可能性があるうえに、
「元に戻す」機能が使えなくなるからです。
(操作の履歴がマクロの実行で消える)

セルの背景を塗りつぶしておく、
あるいは、セルを囲む罫線の色を目立つ色に変える、
程度で十分だと思いますが。。。。
(まっつわん) 2017/01/20(金) 10:47


私も、カメラ機能というのが何の事を言っているのか判りませんので、発生している問題の意味が判りません。

とりあえず、コード中で間違っているなぁ、と思ったのは、文字色を戻す部分。
Set selR = Range("A85,I85,O85,T85") ならば、エリアが4つあり、それぞれアイテムが1つずつという意味なので、文字色戻しは以下のようになるのでは?

    selR.Areas(i).Font.ColorIndex = selId(i)
(???) 2017/01/20(金) 11:22

 クイックアクセスツールバーのユーザー設定でリボンにないコマンド、あるいはすべてのコマンドで「カメラ」を追加できる。
 (2003以前はメニューに入ってた思ったが)

 選択した範囲を別の場所に図形としてリンク貼り付けするようなものだったはず。
(ねむねむ) 2017/01/20(金) 11:28

なるほど、全てのコマンドから選択すれば、カメラ機能は今でも使えるのですね。これならば、元のセルは触らずに使えますね。

カメラ機能では、文字は画像としてコピーされてしまう(セルに図形を重ねてみれば判ると思います)のですが、背景色は変更できたので、点滅もできそうに思います。
(???) 2017/01/20(金) 11:59



皆様、色々とご教授有難うございます。

カメラ機能とは、ねむねむ様の言う通りで、セルを図形として任意の場所に貼り付けています。

又、まっつわん様のコードで再度試しました。しかし、点滅らしき現象はでます。

今、気づいたのですが、この現象は、普通にマウスでオートシェイプを移動した時に、他のオートシェイプが
一瞬、1回だけ点滅するのですが、それがマクロで点滅させる回数分(5回)、一緒に点滅しているみたいです。

???様

確かに間違っていました。色が戻ってい所がありました。コード変更しました。

(とし) 2017/01/20(金) 13:07


>カメラ機能

あぁ、図としてコピーして、
リンクして貼り付けているということですか?

で、元のセルの色を変えれば、
当該図形の色も変わるであろうということですね?

あとで解決してなかったら、実験して考えてみます。。。
(まっつわん) 2017/01/20(金) 13:21


ちょっと試しましたが、カメラ機能(セルにリンクした画像貼付)でセルをコピーし、同じセル上に貼り付けると、貼った画像もまたカメラ機能に取り込まれ、これを繰り返し、変な画像になりますね。無限に繰り返して、ハングアップしかねません。

違うセルに貼ってしまうのも何ですし、カメラ機能案は駄目な気がします。
(???) 2017/01/20(金) 14:11



???様

画像のほうが、大きくできて、分かり易いと思ったので、カメラでやってみましたが、
そうですか〜駄目ですか〜
では、表の中のセルで直接表示させたほうが良いですかね?

他に何か良い方でもあればよいのですが・・・

ご教授ありがとうございました。

(とし) 2017/01/20(金) 14:49


元セルの内容や罫線を変えたくなければ、シェイプで枠の図形を作り、これを点滅させるとか? または透過色を使った画像で矢印でも描き、これを点滅させるとか?

でもまぁ、いちいち点滅せずとも、他の文字が全て黒ならば、強調したい文字だけ色を付ければ、十分目立つと思うのですけどねぇ。 通常でもカラフルな画面になっているせいで、赤くした程度じゃ目立たなくなっているのでは?
(???) 2017/01/20(金) 14:59



???様

色々と有難うございます。
スケジュール表は、全てオートシェイプが貼り付けてあり、シェイプの色で中の文字色が違います。
まぁ、ほとんどの文字は黒ですが。
でも、かなりカラフルな表になっているのは確かです。
なので、もしかしたら目立たないかも?です。

表の中には、空いているセルもあるので、そこだと罫線も関係なく、使用できます。
色々と試したいので、シェイプの枠や矢印を点滅させる方法をご教授願いませんか?

よろしくお願いします。
(とし) 2017/01/20(金) 16:20


一例ですが、枠線点滅なぞ。四角形のシェイプを置いて、塗りつぶし無しにしておいてください。

 Sub test()
    Dim i As Single
    Dim dw As Double
    Dim s As Single

    With ActiveSheet.Shapes(1)
        For i = 0 To 4
            For s = 0 To 1 Step 0.2
                .Line.Transparency = s
                dw = Timer + 0.1
                While Timer < dw
                    DoEvents
                Wend
            Next s
            For s = 1 To 0 Step -0.2
                .Line.Transparency = s
                dw = Timer + 0.1
                While Timer < dw
                    DoEvents
                Wend
            Next s
        Next i
    End With
 End Sub

矢印シェイプとかならば、線を無しにしておいて、.Line を .Fill に変えれば、今度は塗りつぶし領域が点滅します。
文字のときのように、色を変化させても良いですね。

任意の画像の場合は、.VisibleプロパティのTrue/Falseを交互に切り替えて点滅、とか。
アイデア次第であり、コードが知りたければ、マクロの自動記録でプロパティ操作を記録すれば良し。
(???) 2017/01/20(金) 17:19


Sub 枠の点滅()
    Dim t

    With Range("A85,E85,H85,T85")
        With .Borders
            .LineStyle = True
            .Color = vbRed
        End With
        .Copy
        t = Timer
        Do Until Timer - t > 5
            DoEvents
        Loop
        .Borders.LineStyle = False
    End With
    Application.CutCopyMode = False
End Sub

一応枠がチカチカしますが、
コピーの状態にしてるだけなので、
チカチカしてるときに貼付の操作をすると、
意図しないセルにセルがコピーされると思います><

ちなみに、
図の数が少ないからでしょうが、
さっきのマクロで、
>又、まっつわん様のコードで再度試しました。しかし、点滅らしき現象はでます。
こういう挙動は確認できませんでした。
かといって責任は取れないので、お勧めはしません。

何もしないのが、一番気楽だとは思いますが。。。
(まっつわん) 2017/01/20(金) 17:46



???さま

有難うございます。
早速、上記コードでやってみました。
スケジュール表には、シェイプが沢山あるからでしょうか?点滅の反応がありませんでした。
なにも無い、sheetでは、ちゃんと点滅が出来ていますが。
図形の形を決めた方が良いのでしょうか?
あと矢印もやってみました。

まっつわん様

有難うございます。
上記コードを試しましたが、特に変なフラッシュはありませんでした。

(とし) 2017/01/20(金) 20:22


私の例は、ActiveSheet.Shapes(1) を指定しているので、1つ目のシェイプに反応しますよ。 いろいろ貼っているならば、名前指定にするとか、目的のシェイプを指定しなければいけません。 あくまでもサンプルですので。
(???) 2017/01/23(月) 09:53


???さま

お世話になっています。
ActiveSheet.Shapes(1) を(8)とかに数を増やしてもみましたが、100位のオートシェイプが貼ってあり、しかも毎日オートシェイプの数も違います。

使っているオートシェイプの形は、四角型や角丸四角形を使い、User Formで文字入りのオートシェイプが任意のセルに表示できるようになっています。

なので、使用していない、例えば台形(msoshape Trapezoid)とかを指定して、その形のみを対象として点滅させたいと思います。点滅場所は2か所です。

目的のシェイプを指定する方法を、ご教授下さい。
よろしくお願いします。
(とし) 2017/01/23(月) 12:39


点滅させたいオブジェクトが2つなら、オブジェクト名を変えて、同じ処理を2つずつ書くだけですよ?

とりあえず、台形なら全て配列に入れておいて、これらを同時処理する例なぞ。複数だと、2割変化ではズレて感じたので、1割変化にしてみてます。

 Sub test()
    Dim DIC As Object
    Dim i As Long
    Dim j As Long
    Dim dw As Double
    Dim n As Single
    Dim S As Shape

    Set DIC = CreateObject("Scripting.Dictionary")
    For Each S In ActiveSheet.Shapes
        If S.Name Like "Trapezoid*" Then
            DIC.Add S.Name, S.ID
        End If
    Next S

    For i = 0 To 4
        For n = 0 To 1 Step 0.1
            For j = 0 To DIC.Count - 1
                With Shapes(DIC.keys()(j))
                    .Fill.Transparency = n
                    .Line.Transparency = n
                    dw = Timer + 0.05
                    While Timer < dw
                        DoEvents
                    Wend
                End With
            Next j
        Next n
        For n = 1 To 0 Step -0.1
            For j = 0 To DIC.Count - 1
                With Shapes(DIC.keys()(j))
                    .Fill.Transparency = n
                    .Line.Transparency = n
                    dw = Timer + 0.01
                    While Timer < dw
                        DoEvents
                    Wend
                End With
            Next j
        Next n
    Next i
 End Sub
(???) 2017/01/23(月) 13:27

文字の点滅ではなく、図形の点滅と化してしまいましたが、透過度ではなく、色を変えて目立たせる方の案も書いておきます。
i と k のループ回数を変えると、点滅具合が変わります。

 Sub test()
    Dim DIC As Object
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim S As Shape
    Dim iCol() As Long

    Set DIC = CreateObject("Scripting.Dictionary")
    For Each S In ActiveSheet.Shapes
        If S.Name Like "Trapezoid*" Then
            DIC.Add S.Name, S.ID
        End If
    Next S
    ReDim iCol(DIC.Count - 1, 1)

    For j = 0 To DIC.Count - 1
        With ActiveSheet.Shapes(DIC.keys()(j))
            iCol(j, 0) = .Line.ForeColor.RGB
            iCol(j, 1) = .Fill.ForeColor.RGB
        End With
    Next j

    For i = 0 To 59
        For j = 0 To DIC.Count - 1
            With ActiveSheet.Shapes(DIC.keys()(j))
                .Line.ForeColor.RGB = Array(RGB(128, 0, 0), RGB(128, 128, 0), RGB(128, 128, 128))(i Mod 3)
                .Fill.ForeColor.RGB = Array(RGB(255, 0, 0), RGB(255, 255, 0), RGB(255, 255, 255))(i Mod 3)
                For k = 0 To 999
                    DoEvents
                Next k
            End With
        Next j
    Next i

    For j = 0 To DIC.Count - 1
        With ActiveSheet.Shapes(DIC.keys()(j))
            .Line.ForeColor.RGB = iCol(j, 0)
            .Fill.ForeColor.RGB = iCol(j, 1)
        End With
    Next j
 End Sub
(???) 2017/01/23(月) 15:58


???さま

色々とご教授有難うございます。

最初のコードでやってみた所、コンパイルエラーで「SubまたはFunctionが定義されていません」と出ました。

後のコードでは、インデックスが有効範囲にありませんとでて、
ReDim iCol(DIC.Count - 1, 1)  ここの部分が黄色くなっています。

原因はなんでしょうか?
(とし) 2017/01/24(火) 01:37


シートモジュールで書いたので、透過度点滅の方は、標準モジュールならば ActiveSheet.Shapes のように、シートオブジェクトを明示してください。

色点滅の方は、DIC.Countが0ということでしょう。台形の図形を貼っていないのではないですか?
(???) 2017/01/24(火) 09:07


いくらでも応用できると思いますが、例えば点滅させたい領域をRange指定でコーディングしておき、一時的に角丸四角形を作成。点滅後に消してしまう例を書いてみます。これは事前に何も図形を置かなくとも動作します。

 Sub test()
    Dim i As Long
    Dim j As Long
    Dim k As Long

    With ActiveSheet.Range("B2:D3,B6:F10")
        For i = 1 To .Areas.Count
            With .Areas(i)
                With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, .Left, .Top, .Width, .Height)
                    .Adjustments.Item(1) = 0.1
                    .Name = "点滅対象" & i
                    .Fill.Visible = msoFalse
                End With
            End With
        Next i

        For i = 0 To 59
            For j = 1 To .Areas.Count
                With ActiveSheet.Shapes("点滅対象" & j)
                    .Line.ForeColor.RGB = Array(RGB(255, 0, 0), RGB(255, 255, 0), RGB(255, 255, 255))(i Mod 3)
                    For k = 0 To 999
                        DoEvents
                    Next k
                End With
            Next j
        Next i

        For j = .Areas.Count To 1 Step -1
            ActiveSheet.Shapes("点滅対象" & j).Delete
        Next j
    End With
 End Sub
(???) 2017/01/24(火) 09:46


???さま

色々とご教授有難うございます。

エラーも無く、全て動いています。
お騒がせしました。
(とし) 2017/01/24(火) 20:49


コメント返信:

[ 一覧(最新更新順) ]


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