条件分岐でnullがうまく分岐されなくなりました

エクセルファイルを開き、データテーブルを読み込み、繰り返し(各行)で
指定列に入力があればTRUEでWEBシステムへ入力、
空白の場合FALSEで繰り返すように条件分岐しています。

これまで特に問題がなかったのですが、
急に空白をFALSEとせずTRUEに行くようになってしまいました。
条件分岐には ROW(“指定列”).ToString <> ""としているのですが
理由を思いつく方はいらっしゃいますでしょうか。

直近の変更点で思いつくこととしては
エクセルファイルの保管場所が共有サーバーからboxなったことくらいです。

ご教示頂けますようよろしくお願いします。

こんにちは

データが変わった可能性を疑った方が良いかと思います。
条件分岐の手前でログ出力で例えば、ROW("指定列").ToString().Lengthを出力してみて0になっているかどうかを確認してみてはと思います。

ご返信ありがとうございます。

ブレークポイントを置いてみたのですが
下記のような表示になっております。
(見る部分は合ってますでしょうか。。。)

object[43]部分すべての表示は省略しておりますが
189の右隣の部分が空白なのにFALSEとならない状況です。

DataRow { HasErrors=false, ItemArray=object[43] { “Y”, , , 189, }, RowError=“”, RowState=Added, Table=[DataTable] }

これではわかりませんので

ROW("指定列").ToString().Length
を出力するか、あるいは

別の変数 = ROW("指定列").ToString().

別の変数の中身を確認してください。(見た目で判断できないケースがあるので、長さを確認するのが一番良いかと思います。)

問題となっている場所を出力してみました。
ROW(“指定列”).ToString().Length → 15
ROW(“指定列”).ToString() → System.Object

このようになりましたが原因わかりますでしょうか。
空白なのに15と出るのはなぜでしょうか。

空白ではありません。

ROW(“指定列”).ToString() → System.Object[]

なのでSystem.Object[]がいます。
これが分岐しない理由です

このデータがどこから来たかはロジックを遡っていく必要があるのではないかと思います。

ありがとうございます。

ただ、ほかのエクセルファイル(完全に新規のものも試しました)で空白列を出力しても
System.Objectと出ます。

System.Objectでも条件分岐できる書き方はありますでしょうか。

こんにちは

ROWの型は何でしょうか?DataRow? DataTable?

何度も申し訳ありません。
私の出力方法がおかしいと思い改めて確認しました。

先ほど出力した際は,別のシナリオを作成し、
列を読み込み(セル指定)→ メッセージボックス表示 させたのですが
普段使っているシナリオと同じ環境で改めて出力しました。
その結果は下記となりました。
ROW(“指定列”).ToString().Length → 0
ROW(“指定列”).ToString() →”何もなし”

この結果を見るとrow(“指定列”)はnullと判定されそうな気がするのですが
ますますわからなくなってしましました。
ちなみにROW(“指定列”).ToString <> ""はandを使って10くらいつなげています。
指定列の入力がないとwebシステムでエラーが発生するので
それを避けるために条件分岐でweb入力前に振り分けをしています。

これまでは問題なくすべて判定されていたはずなのですが
このへんに理由は考えられますでしょうか。

論理計算と各々の式の値はあっていますでしょうか?
具体的な式全体と、各条件式のそれぞれの値、期待する動作と実際の動作を
明確化いただかないと判断できませんのでこのあたり自身でチェックされるか
共有いただくと良いかと思います。

かなり長いですが条件分岐には下記式を入れています。
最初の指定列だけ1か2,残りの指定列は何か入力があればweb入力へ進む、としたいためです。

row(“指定列”).ToString = “1” or row(“指定列”).ToString =“2” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“” and row(“指定列”).ToString <>“”

これ演算子の優先順位は考慮されてるんでしょうか?

すべて"指定列"という列をチェックしているように見えますが、実際は違うということでしょうか?
可能であれば列名が違うところは違うようにしてもらった方が良いように思えます。

またOR とANDの演算優先順序を意識されていますでしょうか?ANDが優先されますので意図しない結果になっているのではないかとも思います。( row(“指定列”).ToString =“2” と後続のANDが優先されます)

まず、指定列ですが、すべて異なる列になっております。
わかりにくくてすみませんでした。

また、演算子の優先順位に関しましては全く意識しておらず知りませんでした。。。

ただ、指定列はすべて異なりますので優先順位は影響してくるのでしょうか。

恥ずかしながらプログラミングなどの知識はなく
当方営業現場レベルで最初にベンダーさんに作ってもらったシナリオを
ネットなどで検索しつつ修正を入れながら使っている状況です。

こんにちは

ANDとORの使い方が間違っているかもしれません。

問題をシンプルにして
仮にA,B,C3つの列があったとき
Thenに遷移したい条件は具体的にどれになりますか?

Aは1か2とのことでしたが、仮にAが1のときに、BとCはどのような値であってもThenにいってもよいのでしょうか?あるいはB,Cとも値が入っている必要があるのでしょうか?
あるいは
Aは空欄、Bは何らかの値がある、Cは空欄の場合はどうなりますでしょうか?

orとandを同列にかいて思った通りに動くと思っている時点でアウトかと。
(列A=1 or 列A=2) and 列B<>"" and 列C <> “” ・・・
がやりたいことではないのでしょうか?

Aが1か2且つB,C,E,F,とも必ず入力が必要となります。
Cだけが空欄の場合はnullと判定しfalseに進みたいです。

まずはminamiさんが提示してくれた
>(列A=1 or 列A=2) and 列B<>"" and 列C <> “” ・・・
を試してみます。

これまでBやC以降が未入力の場合はfalseでエラーとしてメール通知をしていたつもりでしたが
頻繁に起こるものでもなかったので私が見逃していたのかもしれません。
thenに進んだとしてもWEB入力後チェックボタン押下時に結局エラーとなり
エラーとして通知はされておりましたので。

結果またご報告します。

ありがとうございます。
早速試してみます。
結果ご報告します。

これですと、かっこは必要ですね。

OR:論理和、AND:論理積

和(+) と積(×)の計算順序と同じになります。

 1+1x0

なのか

(1+1)x0

なのかということになります。

ありがとうございます!
希望通りにnull判定が出て入力前にエラー通知が出せました。
算数のような考え方になるのですね。

ベースの知識がない中で質問自体に時間がかかってしまったことお詫びいたします。
今後質問するときには具体的に極力画像や式をそのまま投稿するようにします。

本当にありがとうございました!!