C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 表計算


(過去ログ 173 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■99763 / inTopicNo.1)  表計算
  
□投稿者/ ハム (1回)-(2022/05/27(Fri) 00:13:35)
ハム さんの Web サイト

分類:[VB.NET/VB2005 以降] 


計算するときに空欄のところは計算せずに処理するにはどのようにしたらいいでしょうか?
(例えば名前@の数学だけ入力がないとき)
エラーメッセージもどのようにさくせいしたらいいかで悩んでいます。
引用返信 編集キー/
■99764 / inTopicNo.2)  Re[1]: 表計算
□投稿者/ ハム (2回)-(2022/05/27(Fri) 00:14:15)
ハム さんの Web サイト
No99763 (ハム さん) に返信
>
> 計算するときに空欄のところは計算せずに処理するにはどのようにしたらいいでしょうか?
> (例えば名前@の数学だけ入力がないとき)
> エラーメッセージもどのようにさくせいしたらいいかで悩んでいます。

https://62.gigafile.nu/0603-c0c54e2efd2d1f61d6bc2ff54fc03fcb6
引用返信 編集キー/
■99765 / inTopicNo.3)  Re[2]: 表計算
□投稿者/ 魔界の仮面弁士 (3377回)-(2022/05/27(Fri) 03:43:57)
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



配列にすべて詰め終わったら、先の通り、縦横それぞれの合計値を求めていき、
その結果を画面に書き戻せばよいでしょう。
引用返信 編集キー/
■99766 / inTopicNo.4)  Re[3]: 表計算
□投稿者/ ハム (3回)-(2022/05/27(Fri) 08:32:09)
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で作っています。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -