tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルラジオボタンやチェックボックスの返す値(?)について
記事No10244
投稿日: 2010/10/05(Tue) 01:58
投稿者Seira
初めまして。Seiraと申します。
VBに関しては参考書なしではコードが書けない程度の能力です。
パソコンのOSはWinXP、Microsoft Visual Basic 2005 Express Editionを使っています。


今、ラジオボタンやチェックボックスで質問に回答し、「入力完了」のボタンを押すと結果をエクセルに出力するプログラムを作っています。

・ラジオボタンはグループボックスでまとめてあり、RadioButton1を選択したら「1」を、RadioButton2を選択したら「2」を、選択しなかった場合は「0」を返す、といった感じです。
・チェックボックスは、チェックを入れた場合は「1」を、チェックを入れなかった場合は「2」を返す
・ラジオボタンの質問とチェックボックスの質問はタブで分けてある
・入力完了ボタンを押すと「保存されました。」と出るが、プログラムは終了しない。入力内容を変えて再度ボタンを押せば、前のデータの下の行に保存できる

以上を踏まえて自分なりにプログラムを組んでみたのですが、選択したラジオボタンやチェックボックスに関わらず「0」が出力されてしまいます。
(出力されたファイルを見ると、返すべき値の数だけ0がエクセルのA列にひたすら出力されます・・・。)


以下ソースです。
長くなってしまうので、ラジオボタンの質問は2択が1問、チェックボックスの質問も2問にしてあります。


Public Class Form1

'ラジオボタン
Dim GB1 As Integer

Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter
If RadioButton1.Checked = True Then
          GB1 = 1
          ElseIf RadioButton2.Checked = True Then
          GB1 = 2
          Else
          GB1 = 0
End If
End Sub


'チェックボックス
Dim CB1,CB2 As Integer

Private Sub GroupBox2_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox2.Enter
If CheckBox1.Checked = True Then
          CB1 = 1
          Else
          CB1 = 0
End If
If CheckBox2.Checked = True Then
          CB2 = 1
          Else
          CB2 = 0
End If
End Sub


'出力
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim filename As String = "Testing.csv"
Dim fileNo As Integer = FreeFile()

'ファイルを開く
FileOpen(fileNo, filename, OpenMode.Append)

'出力部
PrintLine(fileNo, GB1)
PrintLine(fileNo, CB1)
PrintLine(fileNo, CB2)

'ファイルを閉じる
FileClose(fileNo)
MessageBox.Show("保存されました。", "通知")

End Sub

End Class


(ここまで)


また、これで実行すると
0
0
0
と、毎回改行されてしまうのですが、これを
0 0 0
と改列(?)することはできないでしょうか?



すみませんが、よろしくお願いします。
長文失礼致しました。

[ツリー表示へ]
タイトルRe: ラジオボタンやチェックボックスの返す値(?)について
記事No10245
投稿日: 2010/10/05(Tue) 08:08
投稿者花ちゃん
> 以上を踏まえて自分なりにプログラムを組んでみたのですが、選択したラジオボタンやチェックボックスに関わらず「0」が出力されてしまいます。

調査しているイベントが悪いだけでは。ブレークポイントを設定して調べてみたら
取得したい時にイベントが発生しているか解るかと思います。
イベントを利用して調べるのなら下記のようにするとか、又は値を知る必要がある
時にその場で調べるとか(下記の中のIF文だけ実行)

Private Sub RadioButton1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged
If RadioButton1.Checked = True Then
          GB1 = 1
          ElseIf RadioButton2.Checked = True Then
          GB1 = 2
           Else
          GB1 = 0
End If

End Sub

但し、上記の場合、初期値は、RadioButton3 にチェックをしておいて下さい。


> (出力されたファイルを見ると、返すべき値の数だけ0がエクセルのA列にひたすら出力されます・・・。)

下記のように出力したいのかな。

'出力部
PrintLine(fileNo, GB1 & "," & CB1 & "," & CB2)
'PrintLine(fileNo, CB1)
'PrintLine(fileNo, CB2)

[ツリー表示へ]
タイトルRe: ラジオボタンやチェックボックスの返す値(?)について
記事No10247
投稿日: 2010/10/05(Tue) 16:46
投稿者shu
GB1,CB1,CB2 の値を都度設定するのは処理の無駄です。
Button1のクリック時に判定するようにした方が良いと思います。
Button1のクリック以外でも頻繁にGB1,CB1,CB2の内容を使用するのであれば別ですが。


ファイル操作ですがFileNoを使う方法は旧式の方法なのでStreamを使用する方法を奨めます。
参考URL  http://dobon.net/vb/dotnet/file/writefile.html


後、GB1,CB1,CB2の宣言でDimを使用していますが、private GB1 as Integerのようにprivateを用いた方がクラス内(Form内)で有効な変数であることが分かりやすいかと思います。

[ツリー表示へ]
タイトルRe: ラジオボタンやチェックボックスの返す値(?)について
記事No10248
投稿日: 2010/10/05(Tue) 17:13
投稿者Seira
花ちゃんさん、shuさん、ありがとうございます。


ひたすら0が入力されてしまう問題は
Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter

Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Leave
とすることで解決しました。

また、ラジオボタンのSubに関しては
また、Subの中身は、ラジオボタンそれぞれにTagで値を設定し
For Each sb In GroupBox1.Controls
          If sb.Checked Then
                    GB1 = sb.Tag
          End If
Next
とすることで少しスマートになりました。


改列は・・・ちょっと説明が下手だったのですが
A列の1行、2行、3行・・・と出力されてしまうのを
1行のA列、B列、C列・・・と出力したかったのです。(これでもまだ説明下手かもしれませんが)
こちらは
Print(fileNo, GB1.ToString, ", ")
Print(fileNo, CB1.ToString, ", ")
PrintLine(fileNo, CB2.ToString, ", ")
とすることで解決できました。
エクセルで表示すると1つのセルに1つの値が入り、テキストファイル(メモ帳など)で見るとひたすらカンマ区切りになっているように出ました。


問題自体は解決したのですが、ソースがゴチャゴチャでまだ見づらいので、shuさんの挙げてくださった方法も試してみようと思います。
この度はありがとうございました。

[ツリー表示へ]