• ベストアンサー

If … then の中の条件式と型について

超初心者のふつつか者です。^^; Dim rc as Long rc = DB_Sub_Select(SQL) If rc Then … 以上のようにコードの一部がなっているのですが、rcはLong型と定義されているので、If rc Then との記述の中ではBoolean 型に自動的に型の変換がされていると考えていいのでしょうか。 また、Ifのあとは条件式が普通ですが、これは、rc=true の省略形なのでしょうか。 MSDNなど検索してみたのですが、うまくみつけられなかったです。

質問者が選んだベストアンサー

  • ベストアンサー
  • RJCO
  • ベストアンサー率66% (2/3)
回答No.3

結論だけから言うと,既に2chさんが回答なさったとおりです。C/C++やVBをはじめ,多くの言語で数値のゼロと論理のFALSEは同じものと取り扱えます。 ご質問はVBについてですが,例えばC言語ではTRUEやFALSEがもともと定義されていないので,“#define FALSE 0”(FALSEとは0のことである)とヘッダで定義してやることが多いです。そのくらい,コンピュータにとってゼロとFALSEは同じものなのです。 FALSEがゼロならば,FALSEでないもの,つまりTRUEは,ゼロでないもの,ということになります。またまた余談ですが,便宜上TRUEを-1と定義するプログラムがよくありますが,-1以外ゼロ以外の値がTRUEでないと判断される危険があるので私は好きでありません。正しいプログラムでは,ゼロでないすべての値がTRUEと扱われます。 型の意識が比較的薄いVBプログラミングにおいて,Boolean型に暗黙の型変換(キャスト)が起こっていると推測されたこと自体は,非常に良い考え方だと思います。 Javaのように(しか思いつきませんが),型にうるさい言語では,ご質問と同様のif文を書くと,まさにご質問の通り,“そこは論理型ぢゃい”というエラーが出ます。 将来の他の言語への展開(或いは他の言語からVBに入った方だったら失礼)も考えると,“型にうるさくない”VBを使うのであっても,kistuneさんが今後も“型にうるさい”人であり続けることをお奨めします。

kistune
質問者

お礼

由来も含めた丁寧な回答をありがとうございました。頑張ります。

その他の回答 (3)

noname#7749
noname#7749
回答No.4

# ドしろうとの分際で専門家のコメントに補足するのは恐れ多いのですが......。 > 便宜上TRUEを-1と定義するプログラムがよくありますが VB (6.0以前) でTrueが-1 (ゼロのビット反転) となるのは、AND / OR で論理演算とビット演算の両方を兼用させるための仕様と思われます。 このため、他のプログラミング言語では可能な「短絡評価 (ショートサーキット)」ができる演算子がVBには存在しません。 ※ C言語では、論理演算子とビット演算子は別の演算子となっています。 If (条件式Left) And | Or (条件式Right) Then といった条件文では、左辺式(条件式Left)の結果如何に関わらず、必ず右辺式(条件式Right)も評価されます。 プログラムの内容次第ではこれは、パフォーマンス (処理性能) に影響しかねないため、VB.NETでは短絡評価用の演算子 AndAlso, OrElse が追加されています。 また、VB.NET で Option Strict On (厳格なTypeチェック) を適用すると、暗黙の型変換に依存するコードはすべてビルドエラーとなります。 すなわち、 × If rc Then     ↓ ○ If CBool(rc) Then または ○ If rc <> 0 Then と記述しなければなりません。 ※ 余談ですが、Option Strict On を適用すると、抽象Object型を使用した実行時バインディングができない、というデメリットもあります。 (この問題は、適切なプログラム設計により回避可能かもしれません。専門家のフォローを希望)

参考URL:
http://fukkey.dyndns.org/pins/vb/030228/45930.html
kistune
質問者

お礼

さらに詳しい説明をありがとうございました。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>If rc Then との記述の中ではBoolean 型に自動的に型の変換がされていると考えていいのでしょうか。 はい。自動的にCBoolします。後はCBoolのヘルプを見れば分かります。

kistune
質問者

お礼

ありがとうございます。早速読んでみます。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

0=FALSE !0=TRUE

kistune
質問者

お礼

そうなんですかー。シンプルな回答ありがとうございます。

関連するQ&A

  • エクセル・マクロでIf Thenの使い方

    このような質問は、ルール(エチケット、マナー)違反になるでしょうか? もしそうならお許し下さい。 名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。 Private Sub CommandButton1_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = False Next End Sub Private Sub CommandButton2_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = True Next End Sub これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。   If Names.Visible = False Then   If ThisWorkbook.Names.Visible = False Then If ThisWorkbook.tname.Visible = False Then Private Sub CommandButton3_Click() Dim tname As Name If Names.Visible = False Then 'これでは駄目 For Each tname In ThisWorkbook.Names tname.Visible = False Next Else For Each tname In ThisWorkbook.Names tname.Visible = True Next End If End Sub 苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。 Private Sub CommandButton3_Click() Dim tname As Name If Range("g1").Value = " " Then   For Each tname In ThisWorkbook.Names   tname.Visible = False   Next Range("g1").Value = "1" Else   For Each tname In ThisWorkbook.Names   tname.Visible = True   Next Range("g1").Value = " " End If End Sub ど素人ですがよろしくご教導ください。

  • 型が一致しません

    下記はセルが0の時、行全体を表示しないにするようにするVBAですが、型が一致しませんとエラーになります、どこを直せばいいのですか。 Dim I As Integer Sub Macro4() For I = 4 To 76 If Cells(I, 8) = 0 Then Rows("I:I").Select Selection.EntireRow.Hidden = True End If Next I End Sub

  • if文で・・・

    booleanの判定するときのif文の書き方ですが、 (1) if( !flg ) then (2) if( flg != true ) then (3) if( flg == false ) then のどれにしますか?

  • IFステートメントの条件式が間違っているのでしょうか?

    エクセルVBA初心者です。下記の式を作りましたが、計算した結果が正しい答えになりません。構文エラーが出ないので構文は間違ってはいないと思うのですが、答えが違うので参っています。どなたか何が間違っているのかおしえて下さい。よろしくお願いします。 Cells(6, "E") にある数字時を入れた時の答えをCells(6, "G") に求めるものです。 Sub 計算() Dim my As Long If Cells(6, "E") <= 90 Then my = 50000 * Cells(6, "E") / 30 Cells(6, "G") = my ElseIf 90 < Cells(6, "E") <= 120 Then my = 50000 + 40000 * (Cells(6, "E") - 90) / 30 Cells(6, "G") = my ElseIf 120 < Cells(6, "E") <= 150 Then my = 90000 + 30000 * (Cells(6, "E") - 120) / 30 Cells(6, "G") = my ElseIf 150 < Cells(6, "E") <= 180 Then my = 120000 + 20000 * (Cells(6, "E") -150) / 30 Cells(6, "G") = my ElseIf 180 < Cells(6, "E") <= 210 Then my = 140000 + 10000 * (Cells(6, "E") -180) / 30 Cells(6, "G") = my End If End Sub

  • InputBox キャンセルボタンが押された時の処理

    こんばんは。 Sub test() Dim タイトル As String タイトル = InputBox("タイトルを入力してください。") If Cancel = True Then Exit Sub ’次のコード・・・ ’次のコード・・・ End Sub このコードを実行した時に 下記のダイアログが出てきて 右のキャンセルボタンを押すと、 「If Cancel = True Then Exit Sub」 でsubステートメントを抜けたいのですが 「Cancel」の部分が 「変数が定義されていません」とエラーになってしまいます。 Dim Cancel As Boolean を追加してキャンセルボタンを押しても TrueではなくFalseになってしまいます。 回避方法を教えてください。 よろしくお願いします。

  • 【VBA】 IFの中にIF

    いつもこちらの識者の方々にはお世話になっています。 VBAの質問です。 やりたいことは下記構文を見ていただければわかると思うのですが、 ------------------------------------------------------------------------------ Sub Test() Dim f As Long Dim lRow As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row For f = lRow To 2 Step -1 If Cells(f, 2).Value = "りんご" Then Cells(f, 2).EntireRow.Delete Else Cells(f, 2).Value = Cells(f, 2) & "0" & Cells(f, 3) Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif End If Next f End Sub ------------------------------------------------------------------------------ Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif の部分が解決したい部分になります。 IFで条件分岐したあとの処理にさらにIFで分岐を加えたいのですが、無茶だと思いつつやってみたらやはり通りませんでした。 こういうのはなんというのでしょうか、ネストとも違うと思うのですが・・・ 上記のような場合、どのような構文が適していますでしょうか。

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • End Ifは不要な場合もある?

    Excel2010使用で下記のVBAのコードを書きました。 Sub イフとエンドイフは組ではなかったのか()  Dim Flag As Boolean  Dim S As Worksheet   For Each S In Worksheets    If S.Name = "合計" Then Flag = True '   Else '    Flag = False '   End If   Next S   If Flag = True Then    MsgBox "「合計」というシートはすでに存在します"   Else    Worksheets(1).Copy after:=Worksheets(Worksheets.Count)    ActiveSheet.Name = "合計"   End If End Sub 前半の >' Else >' Flag = False >' End If の部分があると「Elseに対応するIfがありません」というエラーが出ます。 Elseに関する記述だけをコメントアウトすると「End Ifに対応するIfブロックがありません」というエラーが出ます。 この部分をコメントアウトすればきちんと動作するのですが、If文はちゃんと存在しているにもかかわらず、またほとんど同じ記述の後半ではエラーが出ないというのに、なぜこのようなエラーが出るのかわかりません。 なにか勘違いをしているのでしょうか。

  • 【ExcelVBA】IF条件を満たしているのに、IF条件のところで止まってしまう

    Sub test1() 変数1 = IsEmpty(Range("C1")) If Range("A1") > 0 And Range("B1") = 0 And 変数1 = True Then   test2 End If End Sub 止まったときのデバッグでの表示は Range("A1")は「100」(セルの中身) Range("B1")は「0」(セルの中身) 変数1はRange("C1")がエラー表示なので「True」 すべての条件を満たしているのですが、 IF条件のところで止まってしまいます。 (IF条件のところの1行が黄色くハイライトになっている状態) 止まったデバッグの後に、F5を押して実行させると、 IF条件の続きから実行されて、test2が実行されて処理が終了します。 何で、IF文のところで一度止まってしまうのかわかりません。

  • アクセス フォームが存在するかを一発で取得したい

    フォームが50個くらいあるのですが 該当のフォームが存在するかvbaで取得したいのですが If CurrentProject.AllForms("フォーム1").IsLoaded Then のように、一発で取得する方法はありますか? 今は Sub Sample1() Dim DB As DAO.Database Dim f As DAO.Document Set DB = CurrentDb Dim strForm As String Dim flg As Boolean strForm = "Fメインメニュー" For Each f In DB.Containers!Forms.Documents If strForm = f.Name Then flg = True Exit For End If Next If flg = False Then MsgBox strForm & "は存在しません" End If End Sub のような感じで、すべてのフォームをループしているのですが 無駄が多い気がします。 改善策があればお願いします。

専門家に質問してみよう