アプリ版:「スタンプのみでお礼する」機能のリリースについて

過日、「マクロの中断」について質問し適切な回答をいただき無事解決したものです。
ところが、初心者の悲しさ、少し変わると全く応用がききません。
Range("A1:B10")を読み上げている途中で中断したいのです。前回ご教示いただいたところにより 「DoEvents」や「Me.Repaint」「Sleep」などをあちこち挿入してみましたがうまくいきません。理屈、理論を理解できていないので仕方ないのでしょうがよろしかったら又ご指導のほどお願いします。Excel2003です。

Dim c As Range
Dim CancelFlg As Integer

Private Sub CommandButton1_Click()
Range("A1:B10").Select
CancelFlg = 0
For Each c In Selection
  ’DoEvents
Application.Speech.Speak c.Value
 ’DoEvents
If CancelFlg = 1 Then Exit For
 ’DoEvents
Next c
Range("A1").Select
End Sub

Private Sub CommandButton2_Click()
CancelFlg = 1
End Sub

前回のご教示いただいたもの
Private Sub CommandButton1_Click()
Dim i As Integer
CancelFlg = 0
For i = 1 To 100
DoEvents
ActiveCell.Value = 1
ActiveCell.Offset(1, 0).Activate
Application.Wait (Now + TimeValue("0:0:01"))
If CancelFlg = 1 Then Exit For
Next i
End Sub
Private Sub CommandButton2_Click()
CancelFlg = 1
End Sub

A 回答 (4件)

こんにちは。



>MySpeakが見当たりません」というエラーになってしまい

そのコントロールによって、こういうのは置き場所が変わりますので、ややこしいです。一般的には、そのコードは、標準モジュールに書くものですが、前回の場合は、ローカルモジュールに入れるように出来ていますが、UserForm モジュール用にはなっていません。UserForm 用には、以下のようにしてください。


'---------------------------
'UserForm モジュール(修正)
'----------------------------
Private Sub CommandButton1_Click()
  Dim c As Variant
  CancelFlg = False
  myTime = Now()
  Cnt = 1
  Call MySpeak
  Range("A1").Select
End Sub


Private Sub CommandButton2_Click()
 CancelFlg = True
 myValue = ""
End Sub

'------------------------------------
'標準モジュール
'------------------------------------

Public CancelFlg As Boolean
Public myTime As Date
Public myValue As String
Public Cnt As Integer

Sub MySpeak()
 
   With Range("A1:B10")
     .Cells(Cnt).Select
     myValue = .Cells(Cnt).Value
   End With
   If CancelFlg Or myValue = "" Then
     On Error Resume Next
      Application.OnTime myTime, "MySpeak", , False
     On Error GoTo 0
     Exit Sub
   Else
   If myValue <> "" Then
    DoEvents
    Application.Speech.Speak myValue
   End If
   myTime = Now() + TimeSerial(0, 0, 1)
   Application.OnTime myTime, "MySpeak"
   Cnt = Cnt + 1
   End If
End Sub
    • good
    • 0
この回答へのお礼

再三に渉りご指導いただきありがとうございました。
きっちり動きました。
「マクロは難しい」ということを実感させられ、あまり背伸びしないで初歩的なもので楽しむようにしたほうがいいのでは、と思っているところです。
でも「マクロは面白い」いろんなことをやってみたい。これにこりずに今後ともご指導くださるようお願いします。

お礼日時:2008/03/22 10:29

こんにちは。



こんな方法はどうでしょうか?前よりは、多少良くなったとは思います。

完全に止まっている時間を作ってあげて、砂時計が出ていないときに、繰り返しボタンを押せば、とまります。


Dim CancelFlg As Boolean
Dim myTime As Date
Dim myValue As String
Dim Cnt As Integer
Private Sub CommandButton1_Click()
  Dim c As Variant
  CancelFlg = False
  myTime = Now()
  Cnt = 1
  Call MySpeak
  Range("A1").Select
End Sub

Private Sub MySpeak() 
   With Range("A1:B10")
     .Cells(Cnt).Select
     myValue = .Cells(Cnt).Value
   End With
   If CancelFlg Or myValue = "" Then
     On Error Resume Next
      Application.OnTime myTime, Me.Name & ".MySpeak", , False
     On Error GoTo 0
     Exit Sub
   Else
   If myValue <> "" Then
    DoEvents
    Application.Speech.Speak myValue
   End If
   myTime = Now() + TimeSerial(0, 0, 1)
   Application.OnTime myTime, Me.Name & ".MySpeak"
   Cnt = Cnt + 1
   End If
End Sub
Private Sub CommandButton2_Click()
 CancelFlg = True
 myValue = ""
End Sub

この回答への補足

早速追加のご教示ありがとうございます。
まことにお恥ずかしいのですが、残念ながら全くの初心者で十分理解できません。
「MySpeakが見当たりません」というエラーになってしまい実行することができません。
Private Sub MySpeak() を標準モジュールにもっていったり、Sub MySpeak()にしてみたりしましたがうまくいきません。折角のご好意を活用できなくて申し訳ありません。こんなことが出来ないのに、マクロの中断などと言っているのがおこがましいのかもしれません。
今は時間がないのでこれで失礼します。後刻ゆっくり勉強させてもらいます。ありがとうございました。

補足日時:2008/03/21 15:53
    • good
    • 0

こんばんは。



マクロが稼動している最中は、ふつうは外部からの命令を受け付けません。DoEvents というのは、そこにメモリの空きを作って、命令を受けられるようになるのですが、この種のコントロールを使っているものは、難しいです。

一般的には、Flg のデータ型は、Boolean型です。数字型のFlg は、分岐がある場合のみです。

前回は、No.3709490 ですね。
'-----------------------------------
Dim CancelFlg As Boolean 
Private Sub CommandButton1_Click()
  Dim c As Range '←これは中です。
  CancelFlg = False
  For Each c In Range("A1:B10")
    Application.Speech.Speak c.Value
    Application.Wait (Now + TimeValue("0:0:01"))
    DoEvents
    If CancelFlg Then Exit For
  Next c
  Range("A1").Select
End Sub
Private Sub CommandButton2_Click()
 CancelFlg = True
 ''以下のあるなしで試してみてください。
 ''うまく行くときもあれば、そうでないこともあります。
 'Application.SendKeys "^{ESC}"
End Sub

ただ、この種のブレークを入れるマクロは、本格的に書くと、非常に難しくなりますから、ある程度の妥協してください。ESCキーをブレークに換える方法もあるのですが、それ以外のマクロは、私は、以前、ここのカテゴリで書いたことはあるのですが、ハングの可能性も出てきますので、あまり自信がありません。
    • good
    • 0
この回答へのお礼

早速のご回答いただき恐縮です。
いつもながら、的確なお答えで感謝いたします。
前回のものは、ほぼ100%停止できましたが、今回のものはとまる時もあればとまらない時もある、でWaitを002,003と伸ばしてもそれほど改善はみられないようです。
そのため実用化は難しいかなという気もしております。
それでも今回、「 Range("A1:B10").Select」の扱い方などでも大変勉強になりました。今後ともよろしくお願いします。

お礼日時:2008/03/21 05:07

経緯が分かりませんので、問題点や疑問点を書き起こしてくれた方が良いです。


調べる甲斐性も無いし…。

普通にExcel VBAのマクロを中断するのなら、Ctrl+Breakキーで可能なハズですが、こちらは効かないのでしょうか?

この回答への補足

大変失礼いたしました。
ユーザーフォームに配置したボタンでマクロを実行し、もう一つのボタンを押して中断させる、という形にしたかったのです。
たしかにESCボタンでも中断できますが、フォーム上で完結させたかったのです。画面を見るだけで操作が分かる形にしたいということです。

補足日時:2008/03/20 22:37
    • good
    • 0

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