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

お世話になります。
VBA初心者です。勉強中に以下コードを見つけましたが、
なぜIfがネストではなく別々なのかがわかりません。

C1に入っている値がA列にあれば無視、
なければ末尾にC1の値を追記するマクロです

Sub ren1()
Dim i As Long, flag As Boolean
For i 2 To Cells(Rows.Count,1).End(xlUp).Row
If Cells(i,1)=Range("C2") Then
flag = True
Exit For
End If
Next
If flag = false Then
Cells(Rows.Count,1).End(xlUp).Offset(1,0)=Range("C2")
End If
End Sub

→flagの条件は一つ目のif文内にあり閉じられたあとに、flagが偽の場合、と出てくるのはおかしくないでしょうか?
なぜこれがちゃんと動くのでしょうか?

A 回答 (3件)

インデント、段下げして、空行作って行番号付けると、



01:Sub ren1()
02:  Dim i As Long, flag As Boolean
03:
04:  For i 2 To Cells(Rows.Count,1).End(xlUp).Row
05:    If Cells(i,1)=Range("C2") Then
06:      flag = True
07:      Exit For
08:    End If
09:  Next
10:
11:  If flag = false Then
12:    Cells(Rows.Count,1).End(xlUp).Offset(1,0)=Range("C2")
13:  End If
14:End Sub

02行で宣言した際に、flagは規定値のfalseになる。
04~09まで何回かループした際に、05の条件を満たすと、06でflagはtrueになる。
1回も05の条件を満たさなければ、falseのまま。


Microsoft Docs - ブール型 (Boolean) (Visual Basic)
https://docs.microsoft.com/ja-jp/dotnet/visual-b …

| Boolean の既定値は Falseです。


まぁ、ちゃんと明示的に初期化した方が、質問者さんみたいな誤解招いたり、上みたいなドキュメント調べずに済みます。
    • good
    • 1
この回答へのお礼

初期値でfalseなのですね。どうもありがとうございます。

お礼日時:2022/03/27 21:00

こんにちは



前半で「同じ値のセルが存在するか」を調べて、その結果がflagに設定されます。
少し簡略化して書き直してみると・・

flag = False '←明示するために追加
For i = 2 To ~ ' 最終行までループ(ご提示のコードでは「=」が抜けている)
 ' 同じ値があれば、flag = True にセット
Next

このループを抜けると、
 flag = True --- 同じ値のセルが存在する
 flag = False --- 同じ値のセルは存在しない
となっているはずなので、その後の処理で、これを利用しているということかと。


※ なお、ご質問には直接関係ありませんが・・・
同じ値が存在するかを調べるだけなら、COUNTIF関数を使って0以上かどうかを見る方法にすると、ループも不要になるので、わかりやすくなるかも知れません。
例えば、調べる対称がA列全体でもかまわなければ、

 n = WorksheetFunction.CountIf(Columns(1), Cells(2, 3))

としておけば、n>0 か否かで判断が可能になるので、1行で同じことができるようになります。
    • good
    • 1
この回答へのお礼

ありがとうございます!

お礼日時:2022/03/27 21:00

1個でもflagがtrueなら何もしないで終了になります。



全てfalseの場合のみ、その下の処理をする事になりますね。

だから、正解のやり方です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/03/27 20:59

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