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と関連する良く見られている質問

Q「フラグが付いています」とは?

Windows XP。Outlook Express。受信したメールの画面上段に、「フラグが付いています」と表示されています。また、受信トレイの中に表示されているメッセージの左端には『フラグ』マークが付いています。メッセージは何の問題もなく読めます。これって何ですか? どういうメッセエージにこのマークが付き、受信側はどういうことに留意する必要がありますか?・・・ ついでに、同じように『!』マークもあります。これの付いたメッセージを受信したことはないのですが、これについても意味と留意することを教えてください。お願いします。

Aベストアンサー

フラグはメールに任意につける目印と解釈して良いと思います。
使い方は任意ですので、特に留意する事項は無いと思います。
例として、メールを並び替えた際にフラグを付けたメールだけ一番上に表示することができ、見つけやすくなります。

※参考 OEでメールに目印(フラグマーク)を付ける
http://trendy.nikkeibp.co.jp/article/tec/oe/20060914/118640/


また、『!』マークは通常は送信者が重要と判断したメールに任意に付ける重要度「高」の印です。
あくまでも、送信者が判断して任意に付けた印です。
受信したメールソフトによっては、特に「重要」として区別しない可能性があります。

※参考 OEで重要度「高」マーク(「!」)を付けて送る
http://trendy.nikkeibp.co.jp/article/tec/oe/20060908/118535/

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

Qフラグとはなんですか。

趣味で本を読んでいますが、
フラグの意味はなんですか?
あと伏線との違いはなんですか?
宜しくお願いします

Aベストアンサー

物語における『フラグ』とは、安易で類型的な伏線の演出を指します。

元々はコンピュータプログラムで、真偽で条件判断を行う際、
真ならば『フラグが立っている』と言い、
真にすることを『フラグを立てる』と言います。

例えばファミコンのゲームで、
あるアイテムを持っていればイベントが発生し、
持っていなければ発生しない場合、
そのアイテムの所持が『フラグ』と呼ばれます。

物語の『フラグ』はこれとは異なり、
例えばある登場人物の死によるカタルシスを効果的にするために、
それに先だって、感情移入を促すための類型化された安易な演出を
行うことがあります。
(あるキャラクターの死を感動的にするために、
 そのキャラクターの人間関係や、
 行動原理を説明する生い立ちや過去にまつわる話を
 挿入したりするなど)

この演出があまりに安易だと、
もうすぐ死ぬということが容易に予想されます。
この状態を(演出の安易さや稚拙さを揶揄して)
『死亡フラグ』が立ったと言います。

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

Q.urlファイルのModifiedとは?

こんにちは。

WindowsXPsp2,VB6.0sp6で、インターネットショートカット(IEからお気に入りを追加すると作成される、.urlのファイルで、XPでは.urlは表示されなません)ファイルを作成しようとしています。

インターネットショートカットファイルをエディタで開いてみると以下のようになっています(googleへのリンクの場合)。

[DEFAULT]
BASEURL=http://www.google.co.jp/
[InternetShortcut]
URL=http://www.google.co.jp/
Modified=6000A2DF9CB9C501FC
IconFile=http://www.google.co.jp/favicon.ico
IconIndex=1

このうち、Modifiedという項目をどうやって作ればよいのかわかりません。
何かの日時を指しているというのはなんとなくわかるのですが、何の日付なのか(ショートカットを作成した日なのか、何かを更新するためのフラグなのか)、「6000A2DF9CB9C501FC」という値はいったいどうやって算出しているのかがわかりません。
ずいぶんgoogleで検索してみたのですが、わからない、という情報ばかりでした(探し方が悪いのかもしれませんが)。
この項目は別になくても、きちんとリンクとして動作するようですが、気になってしまいました。

あと、IconIndexもよくわかりません。どのリンクでも値は「1」になっているようなのですが…

よろしくお願いします。

こんにちは。

WindowsXPsp2,VB6.0sp6で、インターネットショートカット(IEからお気に入りを追加すると作成される、.urlのファイルで、XPでは.urlは表示されなません)ファイルを作成しようとしています。

インターネットショートカットファイルをエディタで開いてみると以下のようになっています(googleへのリンクの場合)。

[DEFAULT]
BASEURL=http://www.google.co.jp/
[InternetShortcut]
URL=http://www.google.co.jp/
Modified=6000A2DF9CB9C501FC
IconFile=http://www.google.co.jp/favicon...続きを読む

Aベストアンサー

インターネットショートカットは、テキストファイルを作成するのではなくショートカット作成APIを使用するのが「正しい」方法です。(テキストファイルを作成するのは、iniファイルを操作するのにWindows APIを使わないようなものです・・・という例えで分かるだろうか・・・)

作り方は

「Internet Shortcuts」
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/shortcuts/internet_shortcuts.asp

の中の「Creating an Internet Shortcut from a URL」の項にあります。

IconIndexは、「Accessing Property Storage」の項にあるPID_IS_ICONINDEXプロパティに対応するものでしょう。アイコンリソースを持つファイルをPID_IS_ICONFILEプロパティで指定し、その中のどのアイコンを使用するかをPID_IS_ICONINDEXプロパティで指定します。

Modifiedがどのプロパティに対応するのか、ざっと見たところでは分かりませんでしたが、この一覧に対応するものがなければシステム側が使用している項目なので、自前で操作する必要はありません。

インターネットショートカットは、テキストファイルを作成するのではなくショートカット作成APIを使用するのが「正しい」方法です。(テキストファイルを作成するのは、iniファイルを操作するのにWindows APIを使わないようなものです・・・という例えで分かるだろうか・・・)

作り方は

「Internet Shortcuts」
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/shortcuts/internet_shortcuts.asp

の中の...続きを読む

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)

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

QJavaでVBのDOEVENTSと同様の処理とは

for(;;){
.
.
.
}としているのですが、キーイベントによりfor文を
抜けるにはどうしたらよいのでしょうか?
vbですとdoeventsでいいのですが、Javaで同様の処理をさせるにはどうしたら良いのでしょうか?
どなたか教えてください。

Aベストアンサー

ループ内で、重い処理を実行し、その最中にキーで中止をするということでよろしいでしょうか?


対応するメソッド類はありません。

同じ事をする場合には、次のような手順になります。

1.画面上の、中止ボタン以外のボタン類を使用不可にする。
2.重い処理を別のスレッドで実行。
 ループ内で、常にフラグをチェックし、中止するかを判断する。

3.中止ボタンのイベント内で、フラグを設定する。
4.重い処理のスレッドの終了時に、1のボタン類を戻す。

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...続きを読む

Qディスクをアクティブにマークとは?

Windows2000のディスクの管理のところにあるパーティションをアクティブにマークってのはなんでしょうか?
アクティブにすると何が違うのでしょうか?
アクティブにしちゃったのを消すにはどうするのでしょうか?
教えてください。

Aベストアンサー

>アクティブにすると何が違うのでしょうか?
アクティブフラグが設定されそのパーティションが起動ドライブになります。
アクティブにできるのは、基本パーティションであることが条件で
基本パーティションが複数あってもアクティブにできるのは1つだけです。
(拡張パーティションはできません)

>アクティブにしちゃったのを消すにはどうするのでしょうか?
別の基本パーティションをアクティブにすると元のパーティションの
アクティブフラグはリセットされます。

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ランキング