- 締切済み
マクロ IF条件分岐 疑問
マクロ初心者です。いろいろ参考に以下のマクロを作ってみたのですが、最初、私はnBold >0になると思いましたが、nBold < 0が正解のようですね。どうして0以下というふうにするのですか? Sub AからF列に太字あればJ列に◎() For nRow = 1 To 7 nBold = 0 For nCol = 1 To 6 nBold = nBold + Cells(nRow, nCol).DisplayFormat.Font.bold Next nCol If nBold < 0 Then Cells(nRow, 7) = "◎" Else Cells(nRow, 7) = "" End If Next nRow End Sub
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- SI299792
- ベストアンサー率47% (772/1616)
こういう時は、Boolean を使った方がわかりやすいし、間違えにくいです。 ' Option Explicit ' Sub AからF列に太字あればJ列に◎() ' Dim nRow As Integer Dim nBold As Boolean Dim nCol As Integer ' For nRow = 1 To 7 nBold = False ' For nCol = 1 To 6 nBold = nBold Or Cells(nRow, nCol).DisplayFormat.Font.Bold Next nCol ' If nBold Then Cells(nRow, 7) = "◎" Else Cells(nRow, 7) = "" End If Next nRow End Sub 変数は必ず定義しましょう。変数を定義しないと、Variant になります。 Variant は実行速度が遅い上、メモリーも食います。また、数字がはいるべき所に文字が入ってもエラーにはならないので、バグに気が付きにくくなります。どうしても必要なとき以外使わない方がいいです。 Option Explicit をつければ、定義していない変数があればエラーになるので変数の津釣りミスを防ぐことができます。 ここから先、難しかったら読み飛ばしてください。 Trueが-1なのは論理演算子とビット演算子を兼ねるためです。 別の言い方をすればVBには論理演算子がありません。 Not はビット演算子なので、Not 1 は-2になり、0 にはなりません。 CはTrueが1 ですが、そのためにビット演算子と論理演算子を別々に用意する必要があります。
- superside0
- ベストアンサー率64% (461/711)
Boolean型を 整数で判定するというプログラム自体が ”汚い”ですね。 見通しが悪くなって、バグの温床になりがちです。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
- imogasi
- ベストアンサー率27% (4737/17069)
「最低1列でも条件に合えば」ということで nBold = nBold + Cells(nRow, nCol).DisplayFormat.Font.bold としている(加えている)のだろうが、 Cells(nRow, nCol).DisplayFormat.Font.boldのサイン をよく考えないと、累積加算値の For nCol = 1 To 6 nBold = nBold + Cells(nRow, nCol).DisplayFormat.Font.bold Next nCol の正負判定で、nBoldの値は正や0や負にならないか、よく考えて使うべきだと思う。 本件では、負(-1)+負(-1)=負で、加えているうちに、正に戻すことはないのであるから本件では良いと思うが。 勉強のため、下記解説参照 http://officetanaka.net/excel/function/tips/tips59.htm >FALSEを「×1」したら「0」となりました。以上のことから、TRUEの実体は1、FALSEの実体は0とわかりました。<-ワークシート関数の場合 ーー下記に注意 >ちなみに、VBAでは少し違います。Falseが0というのは同じですが、Trueは1ではなく-1です。 判定していって、TRUEの列が初めてあればループを脱出する方法の方が素直ではないか。
お礼
ちょっと私にはまだ難しいですが、何となく分かりました。ありがとうございました。
- f272
- ベストアンサー率46% (8467/18126)
太字だったらCells(nRow, nCol).DisplayFormat.Font.Boldはtrueとなって数値として計算するときは-1です。
お礼
初心者すぎて、Trueが-1と知りませんでした。ありがとうございました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
お礼
ありがとうございます。勉強してみます。