• 締切済み

マクロ 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

みんなの回答

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.6

こういう時は、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 ですが、そのためにビット演算子と論理演算子を別々に用意する必要があります。

honeybeans
質問者

お礼

ありがとうございます。勉強してみます。

回答No.5

Boolean型を 整数で判定するというプログラム自体が ”汚い”ですね。 見通しが悪くなって、バグの温床になりがちです。

回答No.4

【補足】ところ変われば True も-1から1に

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

「最低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の列が初めてあればループを脱出する方法の方が素直ではないか。

honeybeans
質問者

お礼

ちょっと私にはまだ難しいですが、何となく分かりました。ありがとうございました。

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.2

太字だったらCells(nRow, nCol).DisplayFormat.Font.Boldはtrueとなって数値として計算するときは-1です。

honeybeans
質問者

お礼

初心者すぎて、Trueが-1と知りませんでした。ありがとうございました。

回答No.1

添付図を見て下さい。 ? Cells(1,1).DisplayFormat.Font.bold * 1 -1 となっています。これを数式に直してXの値を求めると X*1=-1 X=-1 その値は、-1。 ほとんどのプログラム言語は、真=-1、偽=0 です。ExcelのVBAもそうだということです。

honeybeans
質問者

お礼

イミディエイトウィンドウはそのように使うのですね。ありがとうございました。

関連するQ&A