• 締切済み

マクロ 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
  • ベストアンサー率48% (708/1464)
回答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/17068)
回答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% (7992/17078)
回答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

  • マクロ IF分岐 空白行は空白を返す

    指定の2列に条件付き書式設定で太字が設定してあり、2行とも太字ならその行に〇を付けるというマクロを作ってみたのですが、空白行がある場合にうまくいきません。空白行だったら、空白を返す、というふうにしたいのですが、elseのところを Cells(nRow, 21) = ""にしてもCells(nRow, 21) .clearcontentsにしても空白にならず〇が入力されてしまいます。他の空白行ではない行は正しく太字なら〇が付いているのですが、空白行は空白にするにはどうすればいいですか? Sub test() ' For nRow = 7 To 233 If Cells(nRow, 9).DisplayFormat.Font.Bold = True And Cells(nRow, 10).DisplayFormat.Font.Bold = True Then Cells(nRow, 21) = "○" Else Cells(nRow, 21) = "" End If Next nRow End Sub

  • マクロ IF分岐 結果がうまく表示されない

    I列J列、M列N列、Q列R列の、それぞれ2列ともに水色と紫色のフォントが両方あったら、U、V、W列に、う、キ、ち、とそれぞれ入力する、というマクロを作ってみたのですが、入力結果が指定した列に表示されません。添付のように「キ」がU列にきたり、「ち」がU列にきたりしています。何をどうすればいいでしょうか? Sub test() ' For nRow = 7 To 233 If Cells(nRow, 9).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 10).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "う" ElseIf Cells(nRow, 10).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 9).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "う" Else Cells(nRow, 21) = "" End If Next nRow For nRow = 7 To 233 If Cells(nRow, 13).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 14).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "キ" ElseIf Cells(nRow, 14).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 13).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 22) = "キ" Else Cells(nRow, 22) = "" End If Next nRow For nRow = 7 To 233 If Cells(nRow, 17).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 18).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "ち" ElseIf Cells(nRow, 18).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 17).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 23) = "ち" Else Cells(nRow, 23) = "" End If Next nRow End Sub

  • 書式の条件に合致したら〇を付ける

    以前質問して、A~C列、D~F列、G~I列、それぞれの「3グループいずれにも」色塗りがあり、かつ太字フォントがあれば、その行のJ列に〇を付ける、というマクロを作っていただきましたが、「3グループいずれかに太字で色塗りがある」に変えるにはどうしたらいいですか? 初心者のためBooleanのTrue,Falseの使い方が分かりません。以前の質問と画像はこちらです。https://okwave.jp/qa/q9345886.html Sub Macro1() '   Dim IY As Long   Dim IXL As Integer   Dim IXG As Integer   Dim LFlag As Boolean   Dim GFlag As Boolean '   Application.ScreenUpdating = False '   For IY = 1 To Cells(Rows.Count, "A").End(xlUp).Row     LFlag = True '     For IXL = 1 To 9 Step 3       GFlag = False '       For IXG = IXL To IXL + 2         With Cells(IY, IXG).DisplayFormat         GFlag = GFlag Or .Font.Bold And .Interior.Pattern = xlSolid         End With       Next IXG       LFlag = LFlag And GFlag     Next IXL     If LFlag Then       Cells(IY, "J") = "〇"     Else       Cells(IY, "J").ClearContents     End If   Next IY End Sub

  • excelのマクロで2007だとエラーが。

    excel2003では動いていたマクロが2007では、エラーになってしまいます。 中断→デバッグ→再開→中断→デバッグ→再開、、、、 と中断しながらも10~20行ずつ進みます。 解決法がありましたら教えてください。 ※デバッグで確認すると「end if」で中断します。 Sub 仕分() Dim n As Long Dim nRow As Long Worksheets("シート名").Activate nRow = Range("A1").End(xlDown).Row For n = 2 To nRow If Cells(n, 6) = "条件1" Then Cells(n, 22) = "仕分け" ElseIf Cells(n, 6) = "条件2" Then Cells(n, 22) = "仕分けしない" ElseIf Cells(n, 6) = "条件1" And Cells(n, 7) = "条件2" Then Cells(n, 22) = "仕分け2" Else Cells(n, 22) = "OK" End If Next n End Sub

  • 画像ファイル名抽出マクロが機能しない

    mt2015様 以前 https://okwave.jp/qa/q9432826.html で質問させていただいたものです。 当時に作っていただいた Sub Sample()   sPath = "C:\Users\Owner\Downloads\通販素材\tsuhan_jp_5028_2018-02-26\setting_000002016\"   nRow = 2   sSubFol = Cells(nRow, 1).Text   Do While sSubFol <> ""     nCol = 10     sFileName = Dir(sPath & sSubFol & "\*.jpg")     Do While sFileName <> ""       Cells(nRow, nCol) = sFileName       sFileName = Dir()       nCol = nCol + 1     Loop     nRow = nRow + 1     sSubFol = Cells(nRow, 1).Text   Loop End Sub のマクロが当時は問題なく動いていたのですが、急にファイル名が抽出されなくなったのですが、どのような原因が考えられますでしょうか?

  • エクセルマクロ 条件分岐 条件に合わない列は削除

    マクロ初心者です。 添付のようなデータが30000万行位ありますが、 1)セルAの値が16またはRFの場合はその行のデータをすべて残します 2)セルAの値が上記以外の場合はその行をすべて削除したいのですが 私なりに調べて次のようなマクロを記録しました。 Sub macro1() Dim i As Integer For i = 1 To 30000 If Cells(i, 1).Value = "16" Or Cells(i, 1).Value = "RF" Then Cells(i, 1) = Cells(i, 1) Else Rows(i).Delete End If Next i End Sub 1)の部分は何とか動いてくれているみたいですが 2)の条件に合わない行の削除の記録がぜんぜんだめみたいで途方に暮れています。 わかる方がいらっしゃいましたら是非ご教授願います。

  • 繰り返しマクロについて

    先日、マクロについて質問をさせていただきました。 常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。 最初にデータを入れる列はD列7行目から30行目まで。次はE列に同じようににデータ入力した後ににマクロを実行します。これをM列7行目から30行目まで、列に新しいデータを入れるたびに毎回繰り返したいのです。 矢印マークは 常にN列に表示。  で、以下のようなマクロを教えていただきましたが、このマクロだと 比較がされる列が、絶えずD列と、新しく入力した列になってしまいます。 先ほども書きましたが、比較する列は、D列とE列 それが終わったらE列とF列 次はF列とG列 というように常に右側とその直ぐ左側の列の比較をしたいのです。 もう一度 お教えいただきたいのですが、よろしくお願いいたします。 回答いただいたマクロを下に入れておきます。 Sub test() Dim i, j, k As Long Dim vl1, vl2 As Variant For i = 4 To 30 If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, 13))) > 1 Then j = 4 Do Until Cells(i, j) <> "" j = j + 1 Loop vl1 = Cells(i, j) For k = 4 To 13 If Cells(i, k) <> "" Then vl2 = Cells(i, k) End If Next k If vl1 > vl2 Then Cells(i, 14) = "↓" ElseIf vl1 = vl2 Then Cells(i, 14) = "→" Else Cells(i, 14) = "↑" End If Else Cells(i, 14) = "" End If Next i End Sub

  • Excel 2007 マクロのIF構文について

    Excel 2007 マクロのIF構文について Sheet1からSheet2にIF構文を使用して、 必要な情報を転記するマクロです。 下記マクロで実現できているのですが、IF構文が多く もっと効率的なマクロがあるのではないかと考えています。 IF構文が2つありますが、1つにまとめるマクロがありましたら お教えください。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '「Sheet1」シートを更新 Worksheets("Sheet1").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False '「Sheet1」シートから「Sheet2」シートに転記 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, 13).End(xlUp).Row '「Sheet1」シートのL列から「Sheet2」シートのS列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "S") = ws1.Cells(i, "L") End If '「Sheet1」シートのG列から「Sheet2」シートのQ列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "Q") = ws1.Cells(i, "G") End If Next j Next i End Sub

  • エクセル2002のVBAで太文字を検索したいのですが、

    エクセル2002のVBAで太文字を検索したいのですが、 <状況> B列にチェックしたい文字が入力されています <やりたいこと> B列に入力されている文字の中から、太文字のみを抜き出して、 太字の見つかった行のG列に太文字のみを抜き出して複写したい <自作マクロの現状> セル全体の太文字検索は下記のマクロ「太字検索チェック1」で完成しましたが、 セルに記載してある文字の中で「一部は普通文字、のこり一部は太文字」と混在 しているセルの中身から太文字部分のみを別のセルに抜き出したいのですが、 そのマクロを「太字検索チェック2」のように書きました。 しかし「太字検索チェック2」の「 If dat.Font.Bold = True Then」の部分で 「型が違う・・・」のエラーで先に進みません。 どなたか、セルの中身の太文字のみを抜き出すマクロを教えてください よろしくお願いします   Sub 太字検索チェック1() i = 3 Worksheets("テスト").Activate For Each myRng In Range("B:B") セル = "b" & i If Range(セル).Font.Bold = True Then Cells(i, 7) = Cells(i, 2) ’太字のCells(i, 2)を Cells(i, 7) にコピー End If i = i + 1 If i = 1703 Then ’1703番地で終了 Exit For End If Next End Sub Sub 太字検索チェック2() i = 3 Worksheets("テスト").Activate For Each myRng In Range("B:B") 内容 = Cells(i, 2) 文字数 = Len(内容) For p = 1 To 文字数 dat = Mid(内容, p, 1)       X=8+P If dat.Font.Bold = True Then  ’1文字づつ太字を検索 Cells(i, X) = dat        ’太字なら→Cells(i, X) にコピー End If Next i = i + 1 If i = 1703 Then Exit For End If Next End Sub

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。