• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:excel vba 時間計算と条件分岐の質問)

Excel VBAで勤怠表の時間計算と条件分岐の質問

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1です。お礼欄拝見しました。 > variant型も、購入した本で極力使うなと書いてあったもので、なんとなく意識から外れていまして、 > 当たり前ですが、(極力)というからには使う機会があるのですね。 VBA内部での演算に関しては、 ハッキリとデータ型が特定できるものは適切な型を選ぶべきです。 Variant方を避ける理由として、  ・使用するメモリが大きい  ・演算が(適切な型に比べると)比べると遅い ここら辺の理由は、現代的には一般的PCスペックの向上とともに 以前ほどには説得力ない気もしますが、無駄は無いに越したことはないです。 でも、これからもVBAを勉強するのでしたら、  ・上達が遅くなる という理由が大きくなります。 Variant型は、どんなデータ型でも格納できる、というものなので、 例えば、Variant/Double とか Variant/Long とか Variant/String とか 内部にはしっかりデータ型が指定されて格納されるものなのです。 ここをキチンと理解しておかないと、Variant型の方が却って難しい場面もあります。 例えば、小数点数を扱うデータ型には、 Single、Double、Currency、Date、等がありますが、中身は同じ小数点数ですから、 これらを異種相互に演算したり、代入したり、することも条件付きで可能です。 そんな時、どのデータ型で演算するのか、 本来的なプログラムではデータ型を変換して揃えないと エラーになって計算出来ないものでも、 "気を利かせて"、"器用に"、"無難に"、演算してくれるのがVariantです。 しかし、見方を変えると、"勝手に"データ型を変えてしまうこともあるので、 こちらの意図を見抜いて適切な型を選ぶ機能は無いので、 そういった特性を正しく理解していないと、 部分的な演算は通っても、型のキャストのせいで、その後の処理でエラーになる というような場合も出てきます。 そういう観点からすると、 初級の初めぐらいの学習者にとっては、問題になることもなく、 ただただその重宝さを享受して、次々に書く経験を増やせる点でメリットがあるけれど、 そろそろ中級ともなれば、却って扱いが難しくなってきます。 何より、あらゆるデータ型を理解しなければ、Variant型を使いこなすことも出来ませんし、 その上でVariant型の特性を理解するのも容易ではないです。 なので、まずはともかく、Variant型以外を覚えて貰わないと、 Variant型の使い方の話は出来ない、という意味で、 初級の初めを過ぎたら、極力使うな、という教え方になります。 実際は、Variant型でなければならないケースも多数ある訳ですが、 今は、そういうことに拘って停滞しちゃうよりは、 記憶の内にだけ留めて前に進んだ方がいいですし、 この課題は、今考えるのでなく後回しにした方が、 この課題への理解を深めるまでの近道になるんだと思います。 私が#1で書いた Dim myRecess As Variant については、 部分的には、文字列値を格納していますから、 String型でも、コードは問題なく通ります。 また、格納したいのは、日付時刻型なのですから、 Date型に格納するのが、本来的・教科書的・基本的、な、やり方です。 (時刻値の扱いは掘り下げると書き切れないので略) では何故わざわざVariant型を選んだかというと、 #1にも軽く説明しましたが、セル範囲には文字列型で出力した方が 手間が省けるという、ご都合的・実戦的・応用的、な、方法論 (+視覚的に解り易い記述を選んだ)です。 ここまでは、何故文字列値なのかという説明で、 Variant型の変数であっても、内部的には、Variant/String型になっています。 この値を演算(加・減算)することがあるなら、 myRecess = CDate(myRecess) のように1行加えて、 本来のVariant/Date型に型変換してやるだけで済むので、 都合により一時的にString型にしますが、 いつでもDate型に型変換してくださいね、 という意味でもあり、受け皿としてはVariant型を選ぶことになったのです。 また、他の観点から、 日付時刻に関するVBAの関数の戻り値は軒並みVariant型ですし、 セル範囲の値等とVBA変数とのデータのやりとりも基本的にVariant型を使います。 個人的に最近は、時刻のみのデータはなるべくVariant、日付を含む場合はDate を使うようにしてデータ型変換関数と組み合わせるようにしています。 でもまぁVBAは様々な書き方を許容するように作られている面もあって、 教本での教え方と、私(やここで回答する人)の教え方が、 一致する可能性は低いですから、 > 未然に混乱を避ける意味もある 解らなくなったら、今手にしている教本を終わらせることを優先した方がいいです。 質問掲示板も使いよう、、、です。 一応、疑問にはお応えするべきと思ったので説明を書きましたが、 先にも述べたように、以上のことは軽くスルーしてくれた方が吉、 (記憶の隅に置いといてくれるなら尚)私としてもベターです。 > Swichは知らなかったので勉強になります。ファイルサイズが増えていくようなら、このような短い記述の方が処理が軽くなったりするのでしょうか。こういった関数を積極的に使えるように、勉強を重ねたいと思います。 ファイルサイズの差は、看過できるレベル、でしょう(誤差のレベルと言ってもいい)。 処理速度という面では(テストしてませんが)関数をひとつ余計に使う訳ですから、 こちらもメリットは無い筈です。 ですので、Switch関数については、 今からワザワザ覚えるほどのものではない、というニュアンスで書いたつもりだったのです。 まぁ、タイプする文字数が少ない、ということは、仕事が早く片付く訳ですから、 状況によってはメリットありそうです。 マクロといっても繰り返し実行するものばかりではなくて、 例えば、新しいシートを作成する仕事など、一度しか使わないから早く簡単に書きたい場合 もありますし、デバッグ用、テスト用のコードとかもサクッと終らせたいですよね。 行数が少ないということは、昨今の小さなモニター環境での作業には有利でしょう。 TPOによっては使いでがあるとか、人によってはそういう回答をするかも、 という程度のものです。 > TimeValue関数は、やはり時間の表示もしてくれるみたいなのですが、時刻と時間を区別しなくても問題ないということですか? まず、 "時刻と時間を区別"については、基本的にExceもVBAも内部的には区別しないものと考えて下さい。 > myTime = LAST_TIME - STAR_TIME これは形式的に、時間 = 時刻 - 時刻 という計算をしているわけです。 この文脈では時間は時刻として扱われます。 "時刻と時間を区別"する必要があるのは、 セルに時間を表示する場合、や、 ExcelまたはVBAで文字列として時間を得たい場合、に限られます。 例えば、セルA1に勤務時間を合計した「123時間45分」を意味する値が入っているとして、 (内部的には 1900/1/1 0:00:00 を1とした 1900/1/5 3:45:00 という日付時刻値です) "123:45"のように表示したい場合は、 [セルの書式設定][表示形式][分類][ユーザー定義][種類]に、[h]:mm のように指定するとか。 例えば、関数を使って他のセルに文字列として"123:45"を返したい時は、  =TEXT(A1,"[h]:mm") とか。 例えば、VBAでセルA1の値から、文字列値"123:45"を取得するには、  rtn = WorksheetFunction.Text(Cells(1, 1).Value, "[h]:m") とか。 「表示する文字列」 と 「値」 との違いを意識するようにしましょう。 意味が解らないようでしたら、 セルに表示されている文字列、と、数式バーに設定されている値、は、 違っていることがある、ということを時々思い出してみてください。 今は理解出来なくても、その内スーッと呑み込めるようになるでしょう。 > "TimeValue関数は、やはり時間の表示もしてくれるみたい" 表示は関係ないので、ちょっと意図が汲めませんでした。 VBAのヘルプでTimeValue関数を引くと、 "時刻を表すバリアント型 (内部処理形式 Date の Variant) の値を返します。" と書かれています。 > 私がFormatでわざわざ時刻を指定してしまっていた。という認識でよいのでしょうか。 幾つか勘違いされていますが切り口として一点だけ説明します。 TimeValue関数は、文字列値を渡して日付値を返しますが、 Format関数は、この場合なら日付値を渡して文字列値を返します。 ExcelのTEXT関数と似た機能を持ちます。 主な使い方としては、数値(日付値も中身は数値です)を 指定した書式の文字列値にする、といった感じです。 例えば、セルA2の値が日付値 2015/1/2 3:45 だったとして、 "15/01/02 03:45"という書式を適用した文字列を返す場合には、  MsgBox Format(Range("A2").Value, "yy/mm/dd hh:mm") などの様に使います。 以上で文字数制限4000文字。

pti06mwa-qaz
質問者

お礼

詳しく説明してくださってありがとうございます。 ここまで長い説明大変でしたでしょうに、おかげさまでスッキリしました。 私の知識では、適所にVarinat型を配置するのは出来ないでしょうから、今まで通り別の型から使っていきたいと思います。Swichに関しても、やはり知っているものを駆使して出来る範囲で。を基本に困ったらまた、こちらで質問させて頂くことと致します。 何度も何度も、読み込んでしまいました。疑問の返答が反って来るというのは、勉強する上で大きく理解がかわるものですね。 >>"時刻と時間を区別"については、基本的にExceもVBAも内部的には区別しないものと考えて下さい >>(内部的には 1900/1/1 0:00:00 を1とした 1900/1/5 3:45:00 という日付時刻値です) そうか、そう言うものなのかと、ストンと落ちて来た感じがします。 こちらの内容が、私にとって目から鱗でしたが、本題の回答である#1をベストアンサーにさせていただきます。 本当にありがとうございました。

関連するQ&A

  • Excel VBAについて

    早速ですがExcelVBAについて質問です。 年齢がN列にあるとき、M列に年代を入れたいと思います。(例:19才なら10代、30才なら30代) 以下のように作成しましたが、すべてに20と入ったり正常に動作しないときがあります。 Excelは2003で作成していますが、いずれ2007でも使いたいです。 もっと正確に実行できるコードを教えてください。 ワークシート関数での解決は望んでいません。データ数も多く他の作業もマクロで処理するのでマクロを希望しています。よろしくお願いします。 -------------------------- Sub ByAge() Range("N1").Value = "年代別" Dim i As Long, N As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 13).Value >= 60 And Cells(i, 13).Value < 70 Then Cells(i, 14).Value = 60 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 50 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 40 ElseIf Cells(i, 13).Value >= 30 And Cells(i, 13).Value < 40 Then Cells(i, 14).Value = 30 ElseIf Cells(i, 13).Value >= 20 And Cells(i, 13).Value < 30 Then Cells(i, 14).Value = 20 End If Next i MsgBox "完了!" End Sub --------------------------

  • マクロ 条件分岐の仕方

    いつも回答ありがとうございます。 条件分岐について質問です。 文字に『N 』含まれている時の条件処理と、『N』が含まれていない時の条件処理を記述記述しました。一応、この記述で上手く動作しているので問題ないのですが、他に記述方法はないのでしょうか?宜しくお願い致します。 Sub 色を塗る2() Dim b As Long '仮シートの列 Dim res As Variant '色の設定 Dim c As Variant '最後に定期をした日付のセル番地 Worksheets("仮シート").Activate b = 2 Do While Worksheets("仮シート").Cells(2, b).Value <> "" With Worksheets(Worksheets("仮シート").Cells(2, b).Value) Set c = .Columns("C").Find("定期", , xlValues, 1, , 2).Offset(, -1) If Worksheets("仮シート").Cells(2, b).Value Like "*N*" Then If (Date - 30) <= c And c <= Date Then res = 8 ElseIf (Date - 60) <= c And c <= (Date - 31) Then res = 10 ElseIf c <= (Date - 61) Then res = 3 End If End If If Worksheets("仮シート").Cells(2, b).Value Like "*N*" = False Then If (Date - 10) <= c And c <= Date Then res = 8 ElseIf (Date - 30) <= c And c <= (Date - 11) Then res = 10 ElseIf c <= (Date - 31) Then res = 3 End If End If Worksheets("仮シート").Cells(3, b).Interior.ColorIndex = res End With b = b + 1 Loop End Sub

  • エクセルのVBA、ループ処理について

    if文とループ処理をどう組み合わせればいいのかわかりません 以下のコードで、iの数をを増やしていく処理を行いたいのですが、エラーがでてしまいうまくいきません どのように書けばいいのでしょうか 教えてください For i = 2 To 11 If Cells("4,i") > 80 Then Cells("5,i").Value = "A" ElseIf Cells("4,i") > 70 Then Cells("5,i").Value = "B" ElseIf Cells("4,i") > 60 Then Cells("5,i").Value = "C" Else Cells("4,i").Value = "D" End If Next

  • Excel VBA ・・・教えてください

    何度も質問させて頂いてます。すみません、 下記のプログラムはこの場で教えて頂いたプログラムで、 実行すると●の後を▲や■が追いかける動きをします。 下記のプログラムをある程度使用して 1~20の数字が順々で追いかけっこする プログラムを作成するにはどのようにすればいいのでしょうか… できればプログラムは長めにならず 20の数字から簡単に増やすことのできるような そんなプログラムが作成したいです… どなたかアドバイスお持ちの方 教えて下さいお願いします... Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • ▲ExcelのVBA▼困っています

    何度もVBAで質問させてもらい助けてもらっています。 懲りずにまた質問ですが… 下のプログラムは"●"が跳ね返るものなのですが… ●の後を■と▲が追うようなプログラムにするには なにを追加すればいいのでしょうか…?; どなたか教えて下さい;;お願いします;; Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim maru As String, yoko As String, tate As String Sub 描画() Cells(X, Y).Value = maru End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() maru = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • エクセルVBAについて質問です

    お世話になります。 早速ですが、下記の構文を作成しましたが、Activecell.Rowの部分で悪さをし 上手く動きません。 行いたかった事としては、Functionにて関数を手作りしようと試みたのですが、 結局は壁にぶちあたってしまったって所です。。。 内容としては、エクセルが手動計算だった場合は、一回りで動作が終了するので 問題なく想定の値が叩き出されますが、自動計算にした途端に「別セルに入れた 計算式まで、Activecell.Rowに引きずられて計算をし、別の値に変わってしまう」 現象となってしまいました。。。(説明下手で済みません) Public Function Shotoku(houshu As Long) Dim ACcel As Variant Dim FR As Range With Worksheets("所得税月額表(平成24年分)") ACcel = houshu If ACcel < 88000 Then Shotoku = 0 Exit Function End If For Each FR In .Range("C13:C347") If ACcel < FR Then If Cells(ActiveCell.Row, 51) = 0 Then       ←問題の個所です Shotoku = .Cells(FR.Row, 4) ElseIf Cells(ActiveCell.Row, 51) = 1 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 5) ElseIf Cells(ActiveCell.Row, 51) = 2 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 6) ElseIf Cells(ActiveCell.Row, 51) = 3 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 7) ElseIf Cells(ActiveCell.Row, 51) = 4 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 8) ElseIf Cells(ActiveCell.Row, 51) = 5 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 9) ElseIf Cells(ActiveCell.Row, 51) = 6 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 10) ElseIf Cells(ActiveCell.Row, 51) = 7 Then    ←問題の個所です Shotoku = .Cells(FR.Row, 11) End If Exit For End If Next End With End Function 計算式を当て込んで、例えば2行目のIF文の条件に引っかかった場合、他の セルまでその行を読んでしまうので、条件が変わってしまう事態になってます。 イメージではActivecell.Rowがダメなんだと思いますが、これ以外のセル番地の 取得方法が分からなくって><; どなたかお助け願います!!!

  • エクセルVBAでの質問

    お世話になります。 エクセルVBAのプログラムコードをコピーし、 エクセルの通常シートへ貼り付けした際、 「’」で始まる説明分または注釈をプロシージャ画面の 様に色づけしたいと思い下記の様なコードを書きました。 しかし、VBA実行後、元のコードが行によって、空白 から始まって行の途中に「’」がある場合など、 少し手前の文字から着色されたりしていました。 何故なのでしょうか。 どこがおかしいのでしょうか。 空白が半角か全角になっている為にこのような現象に なっているのでしょうか。 しかしその解決方法が分からなく、 どなたかご教授頂きたく宜しくお願い致します。   記 Sub サンプル() Dim x As Integer Dim y As Integer Dim z As Integer Dim myrng As String Dim zz As Integer For y = 1 To 10 For x = 1 To Cells(Rows.Count, y).End(xlUp).Row If InStr(Trim(Cells(x, y).Value), "'") = 1 Then Cells(x, y).Font.ColorIndex = 10 ElseIf InStr(Trim(Cells(x, y).Value), "'") = 0 Then Else z = InStr(Trim(Cells(x, y).Value), "'") myrng = Cells(x, y) zz = Len(myrng) Cells(x, y).Characters(z, zz).Font.ColorIndex = 10 End If Next x Next y End Sub

  • エクセルVBAで、分岐がうまくできません。

    A,B,,Cのりんごとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub test() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 'A みかんは、500以下になったら1000個になるように仕入 'A みかんまたはりんごの片方が500以下になったらみかんとりんごを1000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3) 'End If 'i = i + 1 'Loop 'B リンゴは、400以下になったら2000個になるように仕入 'B みかんは、400以下になったら2000個になるように仕入 'A みかんまたはりんごの片方が400以下になったらみかんとりんごを2000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3) 'End If 'i = i + 1 'Loop ''C リンゴは、300以下になったら3000個になるように仕入 ''C みかんは、300以下になったら3000個になるように仕入 'A みかんまたはりんごの片方が300以下になったらみかんとりんごを3000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3) End If i = i + 1 Loop End Sub

  • ExcelのVBAで高さの設定

    どなたか教えて下さい。 報告書のフォーマットの作成をしています。 A列からE列までは日付や名前等の内容が入力されています。 F列にはそれに関するコメントが入力されています。 コメントの文字数は、少なければ10字程度、多ければ320文字程度あります。 文字数に合わせて高さを変更させたいです。 その為、以下のような事を行いました。 (1)G列にLEN関数を用いて、文字数を表示 (2)G列の文字数によって高さを変更させるVBAを作成 Sub Macro1() For i = 2 To 100 If Cells(i, 6) < 72 Then Rows(i).RowHeight = 80 ElseIf 73 < Cells(i, 6) < 108 Then Rows(i).RowHeight = 120 ElseIf 109 < Cells(i, 6) < 144 Then Rows(i).RowHeight = 160 ElseIf 145 < Cells(i, 6) < 180 Then Rows(i).RowHeight = 200 ElseIf 181 < Cells(i, 6) < 216 Then Rows(i).RowHeight = 240 ElseIf 217 < Cells(i, 6) < 252 Then Rows(i).RowHeight = 280 ElseIf 253 < Cells(i, 6) < 288 Then Rows(i).RowHeight = 320 ElseIf 289 < Cells(i, 6) < 324 Then Rows(i).RowHeight = 360 End If Next End Sub このVBAに記述間違いがあるようで、 「文字数が72文字以内であれば、高さを80に変更。 文字数が73文字以上で108文字未満であれば、高さは120」 までは認識し・高さの設定を行ってくれますが、108文字以上あっても高さは120になってしまいます。 どなたか教えて下さい。 よろしくお願い致します。

  • Excel 2003 VBA 条件分岐

    質問させて頂きます。 私が現在行いたい事を下記に記述します。  1・あるボタンを押すと新規ワークシートが追加されAPIで天気予報を取得、天気予報の更新。  2・天気予報が更新されると晴/雨/曇などとその日により勿論値は変化します。  3・ 2で変化された値によって、同ワークシート内に A10セルに「晴」と言う文字が有れば晴れマークの    画像を貼ります。曇の場合 曇りマークです。 ですが、2 までは上手く出来ますたが、3 で思う用に動作してくれません。 私が現在記述しているコードは下記。 Private Sub tenki_Click() Worksheets("tenki").Activate ActiveWorkbook.XmlMaps("rss_対応付け").DataBinding.Refresh Dim Tiyo As String Dim Kumori As String Tiyo = "C:\SeaNavi\resource\image\Sunny.bmp" Kumori = "C:\SeaNavi\resource\image\Cloudy.bmp" If Range("A10").Value Like "*晴*" Then ActiveSheet.Pictures.Insert(Tiyo).Select With Selection.ShapeRange .IncrementLeft 300 .IncrementTop 5 End With ElseIf Range("A10").Value Like "*曇*" Then ActiveSheet.Pictures.Insert(Kumori).Select With Selection.ShapeRange .IncrementLeft 300 .IncrementTop 5 End With End If 私は If Range("A10").Value Like "*晴*" Then の部分を次の用に理解しています。 If Range("A10").Value は値を取得し Like "*晴*" Then でA10セルの値(文字列)に「晴」と言う文字があれば True でなければ False を返すと考えています。 ですが実行結果は、A10セルには「晴」と言う文字は含まれていませんが、画像を貼る構文が実行されたりなど不具合が絶えません。また、ウォッチウィンドウで If Range("A10").Value の値を見ましたが、 Empty値となっています。ですが条件分岐の式自体は True を返しています。 もう何がなんだか分かりません。 冗長的で説明不足な部分も有ると思いますが対応お願いします。