loop文等で、よくフラグを立てろといわれるんですが、意味もわからないし、
何の為に、どのように使うんでしょうか?教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

まず、「フラグを立てろと」ということですが、


意味は、条件に対する結果だとおもってください。
すると「何の為に」が条件

Loop構文だと
ループ(繰り返し)を終わる条件を  満たよ/満たしていないよ(フラグ)
ということになります。

※注 Do Loop の場合は繰り返す条件または、繰り返しを終わる条件を指定できます。 

例題で考えます。

「例題1」
最初に入力した文字と同じ文字を入力するまで、何度でも再入力を要求するプログラムを作る。


「考え方」
最初に入力した文字と同じ場合にループを終わる。

ループ(繰り返し)を終わる条件 = 最初に入力した文字と同じ場合
満たよ/満たしていないよ(フラグ)= 最初に入力した文字と同じ場合

になる。

解答Aと解答Bを用意しました。解答Bの方が質問の解答に、あってますが
例題の解答としては、Aの方がシンプルです。解答Bの場合に、なる場合は
大抵終わる条件が複数ある場合です。


「解答A」

Private Sub Form_Load()

Dim sStr As String
Dim sLoopStr As String
Dim lCnt As String

sStr = InputBox("文字をいれてください。")


Do Until sStr = sLoopStr

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

Loop

  End

End Sub


「解答B」

Private Sub Form_Load()

Dim sStr As String '最初
Dim sLoopStr As String '2回目以降
Dim lCnt As String '回数

Dim bFlg As Boolean 'フラグ

sStr = InputBox("文字をいれてください。")

bFlg = False
lCnt = 1

Do Until bFlg = True

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

If sStr = sLoopStr Then
bFlg = True 'フラグを立てる
End If

    lCnt = lCnt + 1

Loop

End

End Sub

そこで、条件を複数にします。

「例題2」

例題1に回数制限をつけます。5回間違えたら入力した文字にかかわらず終了します。

解答は、以下のようにします。

Private Sub Form_Load()

Dim sStr As String '最初
Dim sLoopStr As String '2回目以降
Dim lCnt As String '回数

Dim bFlg As Boolean 'フラグ

sStr = InputBox("文字をいれてください。")

bFlg = False
lCnt = 1

Do Until bFlg = True

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

If sStr = sLoopStr Then
bFlg = True 'フラグを立てる
End If

If lCnt = 5 then
bFlg = True 'フラグを立てる
End If

    lCnt = lCnt + 1

Loop

End

End Sub
    • good
    • 0
この回答へのお礼

例題付でとてもよく解りました。
ご丁寧にありがとうございます。

お礼日時:2001/09/26 15:20

>フラグを立てる意味は見難いか、否かだけなんですかね????



そうですね。基本的にはプログラムを見やすくするためのテクニックだと思ってください。

自分だけでなく第三者にとっても見易い、分かり易いプログラムが書けるってのはプログラマにとって重要な資質の一つです。

if 式A OR 式B OR 式C OR 式D OR 式E THEN 処理1
って書くよりも、

Flag = False
if 式A THEN Flag =True
if 式B THEN Flag =True
if 式C THEN Flag =True
if 式D THEN Flag =True
if 式E THEN Flag =True
If Flag = True Then 処理1

って書くほうが見やすいですよね.
要は、フラグを使うことによってプログラムが見やすくなるんであれば、フラグを使ったほうが絶対にいいってことです。
    • good
    • 1

こんな感じ



dim Flag as boolean

'幾つかの条件にヒットしたとき、ループを抜ける
Flag=false
do
 ループ内の処理を行う
 
 if … then Flag = True'脱出条件の判定
 if … then Flag = True
Loop until Flag=True

ってな感じですね。
If … then Exit Do
ってやってしまってもいいんですが、プログラムが見難くなります。
    • good
    • 0
この回答へのお礼

フラグを立てる意味は見難いか、否かだけなんですかね????

お礼日時:2001/09/02 12:36

フラグ(Flag)というのはもともと「旗」という意味です。


旗で、今どういう状態にあるかを表しておくわけです。
例えば「降水確率80%」という旗が掲揚されていれば、出かける人はそれを見て傘を持ちます。
旗を立てたり、下ろしたりする仕事と、旗を見て行動を変えるという事柄が別々のタイミングで起こるわけですね。

フラグを立てたり見たりするのはループの中が多いですが、必ずしもそれだけではありません。複数のプログラムの間でフラグを共有することも多いです。(似たものでセマフォ:腕木式信号機:というのもあります)
    • good
    • 0
この回答へのお礼

旗ですか。なるほど.....。
ありがとうございます。

お礼日時:2001/09/02 12:34

ループ中での処理で、ある条件が満たされたときにフラグと呼ばれる変数の値を


変える(例えば0から1に)ことを「フラグを立てる」といいます。
ループ中ではフラグの値を監視していて、フラグが立ったときに特定の処理を行ったり、
ループを抜けたりします。
    • good
    • 0
この回答へのお礼

そこまでは、なんとなくわかります。
ありがとうございます。

お礼日時:2001/09/02 12:26

このQ&Aに関連する人気のQ&A

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

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

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

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

QVBAで処理フラグの立て方

こういった条件でやりたいのですがうまくいきません・・・
処理フラグの立て方は間違っていないと思うのですが・・・
ちょっとセルとかは変えてあります。

もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない
もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。
割り切れたら18行目を削除

E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです

Sub rdlt()
If Range("I1").Value = 0 Then
Range("I1").Value = 1 '処理は一度きり

If Range("E3").Value Mod 4 = 0 Then
Rows("8:8").delete '4で割れたとき8行目を削除
Range("J1").Value = 1 '4で割れたときは次の処理用にフラグ
End If



If Range("J1").Value = 0 Then 'E3が4で割れなかったときは処理する
If Range("E4").Value Mod 4 <> 0 Then
Rows("18:18").delete
Range("J1").Value = 1
End If
End If

End If
End Sub

こういった条件でやりたいのですがうまくいきません・・・
処理フラグの立て方は間違っていないと思うのですが・・・
ちょっとセルとかは変えてあります。

もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない
もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。
割り切れたら18行目を削除

E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです

Sub rdlt()
If Range("I1").Value = 0 Then
Range("I1...続きを読む

Aベストアンサー

If ... Then ... Else ... end ifを使って処理してみましょう
  if Range("E3").Value Mod 4 = 0 then
    Rows("8:8").Delete
    Range("J1").Value = 1
  else
    ' E3は割り切れなかった場合
    if Range("E4").Value Mod 4 = 0 then
      Range("18:18").delete
      Range("J1").Value = 1
    else
      ' E3,E4ともに割り切れなかった
      ' 18行目を先に削除
      Rows("18:18").Delete
      Rows("8:8").Delete
    end if
  end if

Qloop終了後のセルの一個右から同様のloopを行う方法

・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。
・データはA列にランダムに数字が入っているものとします。
・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。
・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。
---------------------------

Sub 比較()
Dim i As Integer
Dim j As Integer
Cells(1, 2).Select
ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")"
i = 1
Do While Cells(i, 2).Value <> ""
If Cells(i, 2).Value = "↓" Then
Cells(1 + i, 2).Select
ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")"
End If
i = i + 1
Loop
Cells(i - 1, 3).Select
ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")"
j = 1
Do While Cells(i - 2 + j, 3).Value <> ""
If Cells(i - 2 + j, 3).Value = "↓" Then
Cells(i - 1 + j, 3).Select
ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")"
End If
j = j + 1
Loop
End Sub

・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。
・データはA列にランダムに数字が入っているものとします。
・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。
・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。
---------------------------

Sub 比較()
Dim i As Integer
Dim j As Integer
Cells(1, 2).Select
Ac...続きを読む

Aベストアンサー

'こんな感じでどうでやんすか
Sub 比較改()
Dim i As Integer
Dim j As Integer
Dim k As Integer

i = 2
j = 2
k = 1
Cells(k, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")"
Do While Cells(i, 1).Value <> ""
If Cells(i, 1).Value > Cells(k, 1) Then
Cells(i, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")"
k = i
j = j + 1
End If
Cells(i, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")"
i = i + 1
Loop
End Sub

QLOOPやFor文で出来ないでしょうか。

いつもお世話になっております。


現在帳票出力のコーディングをしております。
帳票は8レコードで一枚で、
8レコード以下になると、罫線が印刷されないため、
ブランクのデータを作ることで対応しようと思っています。


そこでブランクを入れる処理についてなのですが、

データ件数が8の倍数まで処理をつづけたいのですが
どのように記述すればいいか思案に苦しんでおります。

Do Until KANRI_TANA_KENSU = 8 Or 16 Or 24 Or 32 Or 40 Or 48 Or 56 Or 64 Or 72

RS_BLANK.AddNew

RS_BLANK!区分 = "BLANK"

RS_BLANK.Update

Loop

とりあえず、一つのグループに30件以上はないので数値を固定化させたのですが
勿論これではダメだというのは理解しているのですが。。。

イメージとしては
件数カウントしている数値を8で割り、その答えが
8の倍数でない場合は小数点が出ると思います。

要するに、整数というか小数点が出なくなるまで加算させるという条件が
できればいいのかなと思っているのですが
それをコーディングにするにはどうすれば。。。と思っている次第です。

他の方法でも結構ですので何か案が御座いましたら
ご教示いただけませんでしょうか。

いつもお世話になっております。


現在帳票出力のコーディングをしております。
帳票は8レコードで一枚で、
8レコード以下になると、罫線が印刷されないため、
ブランクのデータを作ることで対応しようと思っています。


そこでブランクを入れる処理についてなのですが、

データ件数が8の倍数まで処理をつづけたいのですが
どのように記述すればいいか思案に苦しんでおります。

Do Until KANRI_TANA_KENSU = 8 Or 16 Or 24 Or 32 Or 40 Or 48 Or 56 Or 64 Or 72

RS_BLANK.AddNew

RS_BLANK!区分 = "BLANK"...続きを読む

Aベストアンサー

8の倍数でストップすればいいんでしょ?だったら

DATA/8 = INT(DATA/8)

こいつが成立すれば止めればいい、ってだけなんじゃ?

QDO~LOOP でのLOOPの抜け方

コマンドボタンを押して(スタートボタン)DO~LOOPで実行しているときにストップコマンドボタンを押してストップさせるときの LOOPの抜け方がわかりません。すみませんがよろしくお願いします。

Aベストアンサー

#2と#4のtinu2000です。
stop_flag を共通変数にしないと、それぞれ別の変数とみなします。

ここから下をコピー&ペーストして見て下さい。

Public stop_flag As String

Private Sub CommandButton1_Click()
Dim i As Integer, n As Integer, b As Integer, a As Integer

stop_flag = False
Do
a = 1
For i = 0 To 7
Range("a1") = a
For n = 0 To 500
Next n
a = a + 1
Next i

a = 2
For b = 0 To 7
Range("b1") = a
For n = 0 To 500
Next n
a = a * 2
Next b

DoEvents
If stop_flag = True Then Exit Do

Loop

End Sub

Private Sub CommandButton2_Click()
stop_flag = True
End Sub

#2と#4のtinu2000です。
stop_flag を共通変数にしないと、それぞれ別の変数とみなします。

ここから下をコピー&ペーストして見て下さい。

Public stop_flag As String

Private Sub CommandButton1_Click()
Dim i As Integer, n As Integer, b As Integer, a As Integer

stop_flag = False
Do
a = 1
For i = 0 To 7
Range("a1") = a
For n = 0 To 500
Next n
a = a + 1
Next i

a = 2
For b = 0 To 7
Range("b1") = a
For n = 0 To 500
Next n
a = a * 2
Next b

DoEvents
If s...続きを読む

QProgressBarを用いる場合、全体の処理数の求め方(Do Loop文に関して)。

ProgressBarを用いる場合、全体の処理数を求めますが、Do Loopを用いる場合、For文と異なり必ずしもすぐに全処理数が分かるわけではありません。そのような場合、どのように全処理数を求めればよいですか?

私は、あるフォルダにあるファイルすべてを処理するプログラムを作りました。Do Loopで全てのファイルを参照し終わるまでをUntilの条件としています。したがって、いくつのファイルがあるかは分かりません。

Aベストアンサー

#2です。
>ファイル数の合計で結構です。ちょっと甘えていますが、先ほどのご回答のどこを改造すればよいのかがわかりません
Private Sub test02()
Dim fn As String
Dim hn As String
p01:
fn = InputBox("フォルダ名=", "フォルダ指定", "c:\My Documents\")
i = 1
sdirname = Dir(fn)
Do While sdirname <> ""

i = i + 1

'------
sdirname = Dir
Loop
MsgBox i & " 個のファイルあり"
End Sub
でやって見てください。
ファイル数やレコード数が取得できる、VBのプロパテイかメソッドがない場合は自分でそれらの数を算出し、変数にセットしないとなりません。プログレスバーを使うルーチンに入る前に。
これも1ファイルや1レコード当たりの処理時間が等しいと(違いは無視できると)言う前提で、全体300のうち60番目の処理をしている時は20%進行済みと表示すると言うことだと思います。

#2です。
>ファイル数の合計で結構です。ちょっと甘えていますが、先ほどのご回答のどこを改造すればよいのかがわかりません
Private Sub test02()
Dim fn As String
Dim hn As String
p01:
fn = InputBox("フォルダ名=", "フォルダ指定", "c:\My Documents\")
i = 1
sdirname = Dir(fn)
Do While sdirname <> ""

i = i + 1

'------
sdirname = Dir
Loop
MsgBox i & " 個のファイルあり"
End Sub
でやって見てください。
ファイル数やレコード数が取得できる、VBのプロパテイかメソッドが...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報