Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5864 / 13646 ツリー ←次へ | 前へ→

【48385】セル(複数)の変化の読み上げ hozmin 07/4/15(日) 19:07 質問[未読]
【48386】Re:セル(複数)の変化の読み上げ Kein 07/4/15(日) 21:31 回答[未読]
【48390】Re:セル(複数)の変化の読み上げ hozmin 07/4/16(月) 0:02 お礼[未読]
【48507】Re:セル(複数)の変化の読み上げ(実行エ... hozmin 07/4/19(木) 20:20 質問[未読]
【48387】Re:セル(複数)の変化の読み上げ ponpon 07/4/15(日) 21:46 発言[未読]
【48391】Re:セル(複数)の変化の読み上げ hozmin 07/4/16(月) 0:20 お礼[未読]

【48385】セル(複数)の変化の読み上げ
質問  hozmin E-MAIL  - 07/4/15(日) 19:07 -

引用なし
パスワード
   関数で変化したセルを読み上げようしています

Private Sub Worksheet_Calculate()
Range("A1").Speak
Range("A2").Speak
end sub

とするとそのシートの変化が対象になり、シート内のセルが変化したら順にA1
、A2のセルの内容を読み上げます(あたり前ですが)
"A1"セルが変化したときは"A1"セルのみを読み上げさせ、"A2"セルが変化したと
きは"A2"セルのみを読み上げさせる方法がございましたらアドバイスお願いいた
します。

【48386】Re:セル(複数)の変化の読み上げ
回答  Kein  - 07/4/15(日) 21:31 -

引用なし
パスワード
   一般的に「プログラムを走らせっぱなしにして、何かの値や状態を監視する」
というやり方をしない方が良いと思います。詳しい説明はしませんが、
その方向で組もうとすると、なかなか安定した動作を確保できなくて
苦労するからです。
ですので"変化前と変化後の比較"をしたいなら、どこかに変化前の値を記憶・保存
しておき、変化したタイミングで値を最新のものと入れ替える。というような
考え方が無難かと思います。
この質問内容に沿ってサンプルを作ると、例えばグローバル変数を使って・・

Private Data1 As Variant, Data2 As Variant

Private Sub Worksheet_Activate()
  Data1 = Range("A1").Value
  Data2 = Range("A2").Value
End Sub

Private Sub Worksheet_Calculate()
  With Range("A1")
   If .Value <> Data1 Then
     .Speak: Data1 = .Value
   End If
  End With
  With Range("A2")
   If .Value <> Data2 Then
     .Speak: Data2 = .Value
   End If
  End With
End Sub

というようなコードになるでしょう。

【48387】Re:セル(複数)の変化の読み上げ
発言  ponpon  - 07/4/15(日) 21:46 -

引用なし
パスワード
   >セルが変化したら
ということで、Worksheet_Changeを
使ってみたらどうなのでしょう?
対象は、A1とA2だけなのでしょうか?

たぶんうまくいかないと思いますが、
しばらくVBAをいじってないと忘れてしまいそうなので・・
久しぶりの投稿です。

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
     If .Count > 1 Then Exit Sub
     If IsEmpty(.Value) Then Exit Sub
     Application.EnableEvents = False
      .Speak
     Application.EnableEvents = True
  End With
     
End Sub

【48390】Re:セル(複数)の変化の読み上げ
お礼  hozmin E-MAIL  - 07/4/16(月) 0:02 -

引用なし
パスワード
   Keinさんありがとうございます。こんなに早くアドバイス頂けるとは思いませんでした。

>一般的に「プログラムを走らせっぱなしにして、何かの値や状態を監視する」
>というやり方をしない方が良いと思います。詳しい説明はしませんが、
>その方向で組もうとすると、なかなか安定した動作を確保できなくて
>苦労するからです。
>ですので"変化前と変化後の比較"をしたいなら、どこかに変化前の値を記憶・保存

そうですね、走らせっぱなしは確かに・・・読み上げの最中データが更新という可能性は高いです。A1,A2と表現させていただきましたが、狙いはA20までを考えています。ただ、比較は行っておらず、vlookupで抽出した値の中でさらに関数で計算させた結果を”読み上げさせようと”しております。読み上げさせるのは日本語なのですが読み上げの最中セル内容が変わると危ないですね。

【48391】Re:セル(複数)の変化の読み上げ
お礼  hozmin E-MAIL  - 07/4/16(月) 0:20 -

引用なし
パスワード
   ponponさんありがとうございます。目先目指している事ができました。

>ということで、Worksheet_Changeを
>使ってみたらどうなのでしょう?
>対象は、A1とA2だけなのでしょうか?


ponponさんのマクロですとシート上の変化セル全てが対象ですが、読ませたい箇所を別シートへ引っ張れば当初の目的を達せそうです。

文法もろくに判っていない初心者の質問にお答え頂き、keinさん、ponponさん
ありがとうございました。

【48507】Re:セル(複数)の変化の読み上げ(実行...
質問  hozmin E-MAIL  - 07/4/19(木) 20:20 -

引用なし
パスワード
   keinさんのマクロを使わせて頂いたところ安定して希望通りの動きをしてくれました。対象となるセルを増やした所、実行エラー13 型が一致しません

のエラーが起動時発せします。keinさんのそのままのマクロでは問題がございません。が、対象セルを増やしたら起動時にエラーが発生いたします。その後は問題なく動作はするのですが、起動時気になります。どこを間違っているかお解かりになりますでしょうか?excelは2003です。

Private Data1 As Variant, Data2 As Variant, Data3 As Variant, Data4 As Variant, Data5 As Variant, Data6 As Variant, Data7 As Variant, Data8 As Variant, Data9 As Variant


Private Sub Worksheet_Activate()
  Data1 = Range("A1").Value
  Data2 = Range("A2").Value
  Data3 = Range("A3").Value
  Data4 = Range("A4").Value
  Data5 = Range("A5").Value
  Data6 = Range("A6").Value
  Data7 = Range("A7").Value
  Data8 = Range("A8").Value
  Data9 = Range("A9").Value

End Sub

Private Sub Worksheet_Calculate()
  With Range("A1")
   If .Value <> Data1 Then
     .Speak: Data1 = .Value
   End If
  End With
  With Range("A2")
   If .Value <> Data2 Then
     .Speak: Data2 = .Value
   End If
  End With
   With Range("A3")
   If .Value <> Data3 Then
     .Speak: Data3 = .Value
   End If
  End With
  With Range("A4")
   If .Value <> Data4 Then
     .Speak: Data4 = .Value
   End If
  End With
   With Range("A5")
   If .Value <> Data5 Then
     .Speak: Data5 = .Value
   End If
  End With
  With Range("A6")
   If .Value <> Data6 Then
     .Speak: Data6 = .Value
   End If
  End With
  With Range("A7")
   If .Value <> Data7 Then
     .Speak: Data7 = .Value
   End If
  End With
  With Range("A8")
   If .Value <> Data8 Then
     .Speak: Data8 = .Value
   End If
  End With
  With Range("A9")
   If .Value <> Data9 Then
     .Speak: Data9 = .Value
   End If
  End With


End Sub

5864 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free