| 
          
            □投稿者/ ハム (3回)-(2022/05/27(Fri) 08:32:09)
              | ■99766 / inTopicNo.4) | Re[3]: 表計算 |  
 
          
            
              
                |  | ■No99765 (魔界の仮面弁士 さん) に返信 > ■No99764 (ハム さん) に返信
 > >>計算するときに空欄のところは計算せずに処理するにはどのようにしたらいいでしょうか?
 > >>(例えば名前@の数学だけ入力がないとき)
 >
 > 「計算しない」とは、データ不足として扱うことで、
 > 合計や平均点欄を空欄のままにするということでしょうか。
 >
 > 別案として、計算しないのではなく、空欄を「0 点」と同様に扱って計算してしまうという手法もありますし、
 > あるいは「欠席」として扱い、平均点を残り 4 人の値で算出するという手法もありそうです。
 >
 >
 > とりあえず、やり方は色々あろうかと思いますが、各数字項目を
 > 2 次元配列で保持してみては如何でしょうか。たとえばこんなイメージ。
 >
 >  Dim score(0 To 5, 0 To 5) As Integer?
 >
 > score(1, 1) = @の国語の点数
 > score(1, 2) = @の数学の点数
 > score(1, 3) = @の英語の点数
 > score(1, 4) = @の理科の点数
 > score(1, 5) = @の社会の点数
 > score(5, 1) = Dの国語の点数
 > score(5, 5) = Dの社会の点数
 >
 > データ型を Integer ではなく Integer? にしてあるのは、
 > 未入力値を Nothing として扱い、0 とは異なる値として区別するためです。
 >
 >
 > そしてインデックスの 0 番には、縦横それぞれの「合計点」を入れます。
 > 各科目の合計点が求まれば、あとはそれを人数で割れば平均点を求められますよね。
 >
 > score(0, 1) = score(1, 1) + score(2, 1) + score(3, 1) + score(4, 1) + score(5, 1) '国語の合計点
 > score(0, 2) = score(1, 2) + score(2, 2) + score(3, 2) + score(4, 2) + score(5, 2) '数学の合計点
 >
 > score(1, 0) = score(1, 1) + score(1, 2) + score(1, 3) + score(1, 4) + score(1, 5) '@の5科目の合計点
 > score(2, 0) = score(2, 1) + score(2, 2) + score(2, 3) + score(2, 4) + score(2, 5) 'Aの5科目の合計点
 >
 > 上記では愚直に、配列の各項目を固定的に足し算していますが、実際には人数が増えたときに備えて、
 > For ループで加算した方が良いでしょう。
 >
 >
 >>エラーメッセージもどのようにさくせいしたらいいかで悩んでいます。
 > エラーメッセージとは、数値以外が入力された場合への備えということでしょうか?
 >
 >>https://62.gigafile.nu/0603-c0c54e2efd2d1f61d6bc2ff54fc03fcb6
 > そもそも、各欄は何で作成される予定ですか?
 >
 > Web アプリで <table> 内に <input type=text> を置いているのか、
 > WinForms アプリで DataGridView を使っているのか、
 > WPF アプリで ReoGrid などの表計算コントロールを使っているとか…。
 >
 >
 > とりあえず、WinForms で TextBox を並べているのだとしたら、
 > TableLayoutPanel コントロールを使って配置した上で、
 > https://dobon.net/vb/dotnet/control/tlbeginning.html
 >
 > Dim inputText As String = TableLayoutPanel1.GetControlFromPosition(列番号, 行番号).Text
 >
 > のようにして、行番号と列番号を使って各要素にアクセスできます。
 > 番号なら For ループで処理しやすいですよね。
 >
 > あとは、 入力値が数字であるかをチェックして配列に詰めていく…と。
 >  Dim scoreValue As Integer
 >  If Integer.TryParse(inputText, scoreValue) Then
 >    Score(userNumber, subjectNumber) = scoreValue
 >  Else
 >    Score(userNumber, subjectNumber) = Nothing
 >  End If
 >
 >
 >
 > 配列にすべて詰め終わったら、先の通り、縦横それぞれの合計値を求めていき、
 > その結果を画面に書き戻せばよいでしょう。
 
 ありがとうございます!
 作成はWinForms で TextBoxで作っています。
 
 |  |