【最大10000ポイント】当たる!!質問投稿キャンペーン!

非常に単純で申し訳ない質問なのですが
もし ~の条件を満たさない場合 ~へ行くというプログラムを組みたいのですが

ちょっとよく分かりません GOTO文を使えば良いのでしょうか?一回 IF 条件 GOTO (文字) とやりましたところ
(文字)の部分が指定されていないと でました

本などで調べれば良いのですが, ちょうどその本を忘れてしまい 困っているところです

また,このプログラムは他人が作ったものを修正する作業ですので勝手も分からない状態です

単純質問でもうしわけありませんが宜しくお願いします

A 回答 (6件)

>このプログラムは他人が作ったものを修正する作業



ということは元のプログラムにはGOTOはないんですよね?
じゃあGOTOを使用しない方向で考えたほうがいいのでは?
一般的にはGOTOは使用しないほうがいいです。
(ルールなしにGOTOを多用するといとも簡単に解読不能なプログラムができるため。)

たとえば

if (条件1) then
  (条件1成立時の処理)
elseif (条件2) then
  (条件2成立時の処理)
....

else
  (該当なし時の処理)
end if

のようなやり方で置き換えできませんか?

もしくは別のSUBを作ってそれをCALLするとか。
    • good
    • 0

No.4


> ということは元のプログラムにはGOTOはないんですよね?
> じゃあGOTOを使用しない方向で考えたほうがいいのでは?
> 一般的にはGOTOは使用しないほうがいいです。

後のメンテは自分がやるとは限らないのだから、スパゲティ化して可読性が悪化しようが、品質が劣化しようが知ったことではないのでは?
自分にとばっちりが来ないのなら、グローバル変数、マジックナンバー、GOTO文、Variant、非構造化、なんでもありでは?

# 元のソースの出来が悪いからこんなところで相談してるんだろうし。
    • good
    • 0

sub a()



If *** then
xxxx goto 5 '条件を満たした時5のラインに飛ぶ
else
goto 10'条件を満たさない時10のラインに飛ぶ
End if



5 Msgbox(XXXXX)

Exit sub

10:
Msgbox(YYYYY)
End sub

「:」は入れなくても結構(コード内の5のように独立していない場合)
10のように独立したコードの場合「:」は入れたほうがよいと思います
    • good
    • 0

if hoge > 5 then goto koko1


if hoge > 2 then goto koko2
  ・
  ・
  ・
  ・

koko1:
  hoge=hoge+1
goto koko9
koko2:
hoge=hoge+2
goto koko9
  ・
  ・
koko9:
end sub

こんな具合です。
おそらく、ラベルの後の:が無かったのでは?
それとあまり goto を多用するとわからなくなりますので、ご注意を!です。

ではでは。
    • good
    • 0

ネットにつながっているのでしたら、


検索すれば、参考になるページが
たくさん出てくると思いますよ。

参考URL:http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/ …
    • good
    • 0

goto 文の使い方ですね。


goto ラベル と書きます。

ラベルを どこかに 書くと そのラベルにジャンプします。

この回答への補足

すみません 私もそのようにラベルらしきものを設定したのですが ラベルが指定されていませんとでました

できれば ちょっとした具体例などあったならば…と思います

差し出がましいようですが 宜しくお願いします

補足日時:2003/05/15 20:48
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBでのGOTO文はできますか?

 教えてください。
例えば)
   もしA1セルが-1だったら、選択1へ飛び、黄色をつける。
            0だったら、選択2へ飛び、赤色をつける。
            1だったら、選択3へ飛び、青色をつける。
   と選択肢が選択1・選択2・選択3と3つあった場合、それぞれにGOTO文で飛ばしたいのですが、可能でしょうか?
 よろしくお願いします。

Aベストアンサー

GOTO文とCASE文利用を挙げます。
(GOTO文利用)
Sub test01()
i = 10
If Cells(i, 1) = -1 Then GoTo a1
If Cells(i, 1) = 0 Then GoTo a2
If Cells(i, 1) = 1 Then GoTo a3
GoTo a4
a1:
 Cells(i, 1).Interior.ColorIndex = 6
 MsgBox "-1" & "でした"
 Exit Sub
a2:
  Cells(i, 1).Interior.ColorIndex = 3
 MsgBox "0" & "でした"
 Exit Sub
a3:
 Cells(i, 1).Interior.ColorIndex = 5
 MsgBox "1" & "でした"
 Exit Sub
a4:
End Sub
'-------(CASE文利用)
Sub test02()
i = 10
Select Case Cells(i, 1)
Case -1
 Cells(i, 1).Interior.ColorIndex = 6
 MsgBox "-1" & "でした"
Case 0
 Cells(i, 1).Interior.ColorIndex = 3
 MsgBox "0" & "でした"
Case 1
 Cells(i, 1).Interior.ColorIndex = 5
 MsgBox "1" & "でした"
Case Else
End Select
End Sub
選択肢1,2,3ルーチンはCoLorIndexの次の行にいれてください。
沢山セルがある場合はiをFor i=1 to 30
とかで繰り返してください。

GOTO文とCASE文利用を挙げます。
(GOTO文利用)
Sub test01()
i = 10
If Cells(i, 1) = -1 Then GoTo a1
If Cells(i, 1) = 0 Then GoTo a2
If Cells(i, 1) = 1 Then GoTo a3
GoTo a4
a1:
 Cells(i, 1).Interior.ColorIndex = 6
 MsgBox "-1" & "でした"
 Exit Sub
a2:
  Cells(i, 1).Interior.ColorIndex = 3
 MsgBox "0" & "でした"
 Exit Sub
a3:
 Cells(i, 1).Interior.ColorIndex = 5
 MsgBox "1" & "でした"
 Exit Sub
a4:
End Sub
'-------(CASE文利用)
Sub test02()
...続きを読む

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QExcelのVBAでGoToの代わりに…

お世話になっています

よく、gotoは悪名高いとか、使わないほうが良いとか言われていますが、何故なのでしょう??
使わないようにしようと思っても、別の方法がわからず使ってしまっています。

例えば、「aaa」というシートがあるかどうか調べ、なければ作成するとした場合、

Dim myWS As Object
For Each myWS In Worksheets
If myWS.Name = "aaa" Then GoTo 1
Next
Worksheets.Add
ActiveSheet.Name = "aaa"
1
次の処理

というように書いていますが、これをgotoを使わないで…となるとどのように書いたら良いのでしょうか?

Aベストアンサー

こんばんは。

こんなんでも出来るよということで。。。

--------------------------------------------
Sub Test()

 On Error Resume Next

 Sheets("aaa").Select

   If Err.Number > 0 Then
     Err.Clear
     Worksheets.Add
     ActiveSheet.Name = "aaa"
   End If

End Sub
------------------------------------------


それから質問者のコードの変数myWSの宣言ですが、今回のような場合にはちゃんと型宣言もすべきです。

 Dim myWS As Object → Dim myWS As Worksheet

以上です。
 

QRedim とEraseの違いは?

VBA フォームのボタン クリックイベント時に書き込んだ記述で、次のような記述があります。
Dim temp() as string
ReDim temp(0)
(next processing)

一度、イベントを処理した後(フォームは閉じません。)
再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。
ReDimで Preserve宣言を使っていないので内容が消去されると考えていました。
ReDimのまえに、
Erase temp
という処理を設けて対応しますが、
ローカルウィンドウやウオッチウィンドウでメモリがクリアされたか確認できていません。
ReDimとEraseの処理でどのような違いがあるのでしょうか?

どなたかよろしくお願いします。

Aベストアンサー

----ヘルプより引用----
Eraseステートメント
固定サイズの配列の場合は要素を再初期化し、動的配列の場合は割り当てたメモリを解放します。
----------------------

今回は、動的配列なので、メモリ解放ですね。

----ヘルプより引用----
ReDim ステートメント
動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。
----------------------

通常は動的配列のサイズを変更する時に使います。
また、Preserve を付けない場合は値は残りません。

ReDim temp(0) ですが、Option Base 1 なら、エラーになります。
Option Base 0 (又は、省略)の場合、添え字 0 の要素が利用可能です。

UBound(temp) は 0 となります。
つまり、ReDimで配列の要素を 0 個にすることは出来ません。

ちなみに、Eraseした場合、UBound()はエラーになります。

Erase temp
Debug.Print UBound(temp) ' この行でエラー



>再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。

この部分が疑問ですね。

プロシージャ内で宣言した変数なら、プロシージャが終了した時点で捨てられるので、次のイベントに値が残ることはありません。

どこか別の場所に値が残っているのでは?

----ヘルプより引用----
Eraseステートメント
固定サイズの配列の場合は要素を再初期化し、動的配列の場合は割り当てたメモリを解放します。
----------------------

今回は、動的配列なので、メモリ解放ですね。

----ヘルプより引用----
ReDim ステートメント
動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。
----------------------

通常は動的配列のサイズを変更する時に使います。
また、Preserve を付けない場合は値は残りません。

ReDim temp...続きを読む

Qモーダルフォームとモードレスフォーム

この二つの違いはどういう違いがあるのでしょうか?
どなたか教えてください。お願いいたします。

Aベストアンサー

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォーム2が表示されたあと
にメッセージボックスが表示されます。
つまりCommand1はShowのあとのロジックを、フォーム2が閉じるまで、未処理のままとなるわけです。

画面上はフォーム2が前面、フォーム1が背面になるどちらも似たような表示に見えますが、
Command1の場合はフォーム1はフォームをクリックしても、フォーカスを持たない
Command2の場合はフォーム1はフォームをクリックすると、フォーカスを持ちえる
という点も違います。


簡単にまとめると、
vbModalの場合はフォーム2だけに作業処理を固定させたい時に使用します。vbModelessの場合はフォーム2はポップアップ的な使用方法の時に使います。

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォー...続きを読む

QVBでイベント処理を追加するには?

昔、ちょっとだけVBを使っていたことがあるのですが、最近はずっと別の言語を使っていた為、ど忘れしてしまいました。

たとえば、フォームのサイズ変更があったときの処理を追加するにはどうしたら良いのでしょうか?

Aベストアンサー

VB6.0でしょうか?.NETでしょうか?
.NETなら、ほとんど何もわかりませんので、パスです。(^^;

6.0なら、

Private Sub Form_ReSize()

でよいはずです。
このコードは、VBエディタ上でベタにタイプしてもよいのですが、IDEのインテリジェンス機能を有効に活用するなら、

(1) エディタ左上の「(General)」と表示されているコンボボックスを開き、「Form」を選択する。
(2) エディタ右上のコンボボックスで、「ReSize」を選択する。

の手順でOKです。

************************************************************************

以下、余談です。

上記(2)のコンボボックスで選択できないイベントは、VBの仕様上公開されていないイベント(Windowsメッセージ)ということになります。
(一例を挙げると、Formに対するWM_MOVEなど)
この場合は、サブクラス化という手法を使用してWindowsメッセージを取得することになります。

VB6.0でしょうか?.NETでしょうか?
.NETなら、ほとんど何もわかりませんので、パスです。(^^;

6.0なら、

Private Sub Form_ReSize()

でよいはずです。
このコードは、VBエディタ上でベタにタイプしてもよいのですが、IDEのインテリジェンス機能を有効に活用するなら、

(1) エディタ左上の「(General)」と表示されているコンボボックスを開き、「Form」を選択する。
(2) エディタ右上のコンボボックスで、「ReSize」を選択する。

の手順でOKです。

****************************************...続きを読む

QVB.NETでのイベントの途中終了

VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。

そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。

どなたかおわかりの方お願いします。

Aベストアンサー

Exit ←これをイベント終了したいところで、使えばいいと思いました。

(例)
Private Sub Button1_Cilck・・・省略・・・
 '「Button1」をクリックしたときのイベント
 If Msgbox("イベントを途中終了しますか?",vbYesNo) = vbYes Then
  Exit Sub 'イベント途中終了
 End If
 Msgbox("イベントを途中終了しませんでした。")
End Sub

Q他言語で言うcontinue文

他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか?

continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。

なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。

バージョンは
Winエクセル2002 SP3
VBA Retail:6.4.8869, Version:9969
です。基本エンジンはVB6です。

よろしくお願いします。

Aベストアンサー

> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。

ループの最後へジャンプという感じですね。
VBなら、Nextへ飛ばすのと同じです。

For i = 1 To 5
    If i = 3 Then goto Next_i
    Debug.Print i
Next_i:
Next i


人気Q&Aランキング