Excel VBA質問箱 IV

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

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


6788 / 13644 ツリー ←次へ | 前へ→

【43085】孫SUB内で プログラム全てを終了する方法 こま 06/10/1(日) 21:01 質問[未読]
【43087】Re:孫SUB内で プログラム全てを終了する方... [名前なし] 06/10/1(日) 21:35 発言[未読]
【43088】Re:孫SUB内で プログラム全てを終了する... neptune 06/10/1(日) 21:40 回答[未読]
【43149】Re:孫SUB内で プログラム全てを終了する... こま 06/10/3(火) 19:33 お礼[未読]

【43085】孫SUB内で プログラム全てを終了する方法
質問  こま  - 06/10/1(日) 21:01 -

引用なし
パスワード
   SUBを重複して実行している場合に、
現在のSUBを抜けるのではなく、プログラムをその場で終了するコマンドはありますでしょうか?

例えば、下記のプログラムの場合、
1.A1を実行し、#1で終了した場合、変数attentionに「1」が残ってしまう。
2.次に
 Cells(1, 1) = "" に変更して、A1を実行する。
 本来なら、C1まで実行したいのに、
 attenntion=1が残ってしまっている為に、#1で停止してしまう。
3.改善として、B1の#2で条件を満たした場合、
 その場で、プログラムを終了する(A1も終了する)
 という風に変更したらどうかと考えました。


上記以外に対策があればあわせて教えていただけたらと質問させていただきました。
よろしくお願いいたします。


例えのプログラムです------------------------------------
Option Explicit
Public attention As Byte

Sub A1()
  B1 'プログラムを実行するか否かを判断 B1 を呼ぶ
  If attention = 1 Then 'attention=1の場合は、実行=否と判断し、終了する。
    MsgBox "終了", vbExclamation
    Exit Sub '#1
  End If
  
  C1
End Sub

Sub B1() 'プログラムを実行するか判断する
  If Cells(1, 1) = 1 Then #2
    attention = 1
    Exit Sub
  End If
End Sub

Sub C1() '実際に計算したい内容
  Cells(2, 1) = Cells(3, 1) + Cells(4, 1)
End Sub

【43087】Re:孫SUB内で プログラム全てを終了する...
発言  [名前なし]  - 06/10/1(日) 21:35 -

引用なし
パスワード
   '-----------------------------------------------------------
'※方法1 attentionを初期化するコードを追加する
'-----------------------------------------------------------
Option Explicit
Public attention As Byte

Sub A1()
  attention = 0 'B1実行前にattentionを初期化
  
  B1 'プログラムを実行するか否かを判断 B1 を呼ぶ
  If attention = 1 Then 'attention=1の場合は、実行=否と判断し、終了する。
    MsgBox "終了", vbExclamation
    Exit Sub '#1
  End If
 
  C1
End Sub

Sub B1() 'プログラムを実行するか判断する
  If Cells(1, 1) = 1 Then '#2
    attention = 1
    Exit Sub
  End If
End Sub

Sub C1() '実際に計算したい内容
  Cells(2, 1) = Cells(3, 1) + Cells(4, 1)
End Sub

'-----------------------------------------------------------
'※方法2 B1をFunctionにする
'-----------------------------------------------------------
Option Explicit
Sub A1()
  If B1 Then 'B1の戻り値=Trueの場合は、実行=否と判断し、終了する。
    MsgBox "終了", vbExclamation
    Exit Sub '#1
  End If
 
  C1
End Sub

Function B1() As Boolean
  'プログラムを実行するか判断する
  If Cells(1, 1) = 1 Then '#2
    B1 = True
  Else
    B1 = False
  End If
End Function

Sub C1() '実際に計算したい内容
  Cells(2, 1) = Cells(3, 1) + Cells(4, 1)
End Sub


オススメは後者(方法2)です。

【43088】Re:孫SUB内で プログラム全てを終了する...
回答  neptune  - 06/10/1(日) 21:40 -

引用なし
パスワード
   Endというコマンドがありますが、普通これは使いません。
End ステートメントについてはHelpをご覧ください。
#私は使ったことありませんが、困ったことはないです。

一般的にこのような手法をとります。
Sub A1()
  if B1=false then 'プログラムを実行するか否かを判断 B1 を呼ぶ
    exit sub
   end if
  If attention = 1 Then 'attention=1の場合は、実行=否と判断し、終了する。
    MsgBox "終了", vbExclamation
    Exit Sub '#1
  End If
  
  C1
End Sub

function B1() as boolean 'プログラムを実行するか判断する
  If Cells(1, 1) = 1 Then #2
    attention = 1
    B1=flase
  End If
End function

もうひとつ言えば
Public attention As Byte
などはPublic レベルの変数にはしません。
例えば、こんなやり方もあります。
#Public レベルの変数はバグの元ですから、極力避けるのが定石です。
Sub A1()
dim attention As Byte
  attention =0
  'プログラムを実行するか否かを判断 B1 を呼ぶ
  if B1(attention)=false then
     exit sub
  end if
  If attention = 1 Then 'attention=1の場合は、実行=否と判断し、終了する。
    MsgBox "終了", vbExclamation
    Exit Sub '#1
  End If
  
  C1
End Sub

function B1(buref pData as byte) as boolean 'プログラムを実行するか判断する
  If Cells(1, 1) = 1 Then #2
    pData = 1
    B1=flase
  End If
End function

全体的なロジックについてはわかりませんので、変更可能なところを
変更しただけです。
>#2
って何?

【43149】Re:孫SUB内で プログラム全てを終了する...
お礼  こま  - 06/10/3(火) 19:33 -

引用なし
パスワード
   ありがとうございました。
独学な為、基本的なことが備わっていません。
またよろしくお願いいたします。

P.S
#2 は、一番上で説明する為のに、注釈で入れました。

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