- ベストアンサー
EXCELのVBの質問です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
処理内容はそんなに難しくありません。 今回の回答を ダウンロードできるように期間限定で公開します。 ファイルの取得期限は 2010年1月12日 7時50分15秒 JST です。 https://www.datadeliver.net/receiver/fileBox.do?fb=caee773b38304354a38c425d7473662e&rc=4835c82750fc4dcab2816fe28ea3b76f&lang=ja 「BBQ」というファイル(Excel)をここからダウンロードしてください. ===================================================================== サンプルデータのとおりで B列が問題、C列が回答です。 問題を TEXTBOX TXT問題 に読み込み、フレームないのチェックボックス(回答CHKボタン1から4) のいずれかがチェックを入れると C列に値を設定(1から4)しているだけです。 次へのボタンを押すと 列インデックス を+1 し、行を変更し、問題を新たに取得しているのです。 前へのボタンを押すと 列インデックス を-1 し、行を変更し、問題を新たに取得しているのです。 終了ボタンを押すと 回答を保存し、Excelシートを保存(名前をつけて保存)するようにしています。 >>チェックを入れるとその解答がC列に書き込まれるということなのでしょうか、、、 C列に値が 1から4 チェックボックスの回答CHKボタン1から4がチェックされたときに値を 設定しています。 セットしているのは ローカルサブルーチン S_回答Save() の処理です。 ====== 各、画面のコントロールの名称は以下の通り。 Txt問題 : 問題の入るエリア TEXTBOX 回答Grp : フレーム 回答CHKボタン1 : ラジオボタン チェックすると 1 を C列に設定する。 回答CHKボタン2 : ラジオボタン チェックすると 2 を C列に設定する。 回答CHKボタン3 : ラジオボタン チェックすると 3 を C列に設定する。 回答CHKボタン4 : ラジオボタン チェックすると 4 を C列に設定する。 Prevボタン :「前へ」のボタン 押されると 前の行の問題を取得し、表示する Fowerdボタン:ボタン :「次へ」のボタン 押されると 次の行の問題を取得し、表示する 終了ボタン : 現在の回答を書き込み、Excelシートを保存(名前をつけて保存)する。 ====================== なお VBAのコードのスキルがどのくらいなのかにもよりますが コードが理解できないと難しいと思います。
その他の回答 (5)
- NOBNNN
- ベストアンサー率50% (93/186)
A No.4 のつづき ================================================== Private Sub 回答CHKボタン1_Click() Call S_回答Save End Sub Private Sub 回答CHKボタン2_Click() Call S_回答Save End Sub Private Sub 回答CHKボタン3_Click() Call S_回答Save End Sub Private Sub 回答CHKボタン4_Click() Call S_回答Save End Sub Private Sub 終了ボタン_Click() Dim Fname As String F = MsgBox("問題を終了しますよろしいですか?", vbYesNo) If F = vbNo Then Exit Sub End If Call S_回答Save ChDir (G_MyDocument) Fname = Application.GetSaveAsFilename(Filefilter:="Excelファイル,*.Xls,すべてのファイル,*.*") If Fname = "False" Then Exit Sub End If ActiveWorkbook.SaveAs Filename:=Fname End Sub Private Sub S_回答ChkBox_Set(P_VALUE As Integer) 回答CHKボタン1 = False 回答CHKボタン2 = False 回答CHKボタン3 = False 回答CHKボタン4 = False Select Case P_VALUE Case 1 回答CHKボタン1.Value = True Case 2 回答CHKボタン2.Value = True Case 3 回答CHKボタン3.Value = True Case 4 回答CHKボタン4.Value = True End Select End Sub Private Sub S_回答Save() Dim I As Integer Dim Ans(4) As Boolean Ans(1) = 回答CHKボタン1.Value Ans(2) = 回答CHKボタン2.Value Ans(3) = 回答CHKボタン3.Value Ans(4) = 回答CHKボタン4.Value With Range("C" & G_IDX) For I = 1 To 4 .Value = I If Ans(I) = True Then Exit For End If Next End With End Sub ===================================== 以上が回答です。 A.No4 の最初の1文字がかけています。 Const C_Sheet = "Sheet1" '問題が入っているシート に訂正してください。
補足
申し訳ないです、、、 必死に考えているのですが、できません。 どういう意味なんでしょうか? チェックを入れるとその解答がC列に書き込まれるということなのでしょうか、、、 教えていただいた通りにやっているのですが、問題が出てこなかったり、解答のラジオボタンを押すとエラーが出たりで、、、 なかなかうまくいきません。
- NOBNNN
- ベストアンサー率50% (93/186)
A No.1 です。 >>解答はラジオボタンで出来ませんか? すみません。 画像が小さくて見逃しました。 添付画像のようにできます。 以下、長文です。 回答ボタンは 削除しました。 フレームをひとつ追加し、その中にチェックボックスを4つ 追加します。 フレームの名称は 回答Grp、チェックボックスの名前は回答CHKボタン1から4 となります。 フレームとチェックボックスについては以下参照、 参照:■ Excel VBA 入門講座 http://excelvba.pc-users.net/fol10/10_5.html 以下、サンプルソースです。 ==================================================== onst C_Sheet = "Sheet1" '問題が入っているシート Const C_StGYO = 2 '問題が入っている開始行 Public G_IDX As Integer Public G_MyDocument As String Private Sub UserForm_Activate() 終了ボタン.Enabled = False G_IDX = C_StGYO Worksheets(C_Sheet).Select Me.Txt問題 = Range("B2").Value Call S_回答ChkBox_Set(Range("C2").Value) Dim WSH As Variant, OpenFileName As String Set WSH = CreateObject("WScript.Shell") G_MyDocument = WSH.SpecialFolders("MyDocuments") & "\" End Sub Private Sub Prevボタン_Click() Worksheets(C_Sheet).Select If G_IDX > C_StGYO Then G_IDX = G_IDX - 1 Me.Txt問題 = Range("B" & G_IDX).Value Call S_回答ChkBox_Set(Range("C" & G_IDX).Value) End If If Len(Trim(Range("B" & (G_IDX + 1)).Value)) = 0 Then Me.終了ボタン.Enabled = True Else Me.終了ボタン.Enabled = False End If End Sub Private Sub Fowerdボタン_Click() Worksheets(C_Sheet).Select If Len(Trim(Range("B" & (G_IDX + 1)).Value)) > 0 Then G_IDX = G_IDX + 1 Me.Txt問題 = Range("B" & G_IDX).Value Call S_回答ChkBox_Set(Range("C" & G_IDX).Value) If Len(Trim(Range("B" & (G_IDX + 1)).Value)) = 0 Then Me.終了ボタン.Enabled = True End If End If End Sub ==================================================== つづく A No.5 へ
- NOBNNN
- ベストアンサー率50% (93/186)
A No.2 のつづき =========== Private Sub 終了ボタン_Click() Dim Fname As String ChDir (G_MyDocument) Fname = Application.GetSaveAsFilename(Filefilter:="Excelファイル,*.Xls,すべてのファイル,*.*") If Fname = "False" Then Exit Sub End If ActiveWorkbook.SaveAs Filename:=Fname End Sub ==================== ■ サンプルデーター 番号 問題 回答 1 1+1 の答えは 2 2+3 の答えは 3 3*4 の答えは 4 10÷2の答えは 5 1+4 の答えは 6 1+7 の答えは 7 1+9 の答えは 8 1 + 45の答えは 上記のデータを Sheet1に作成してください。 A列が問題の番号、B列が問題、C列が回答です ================ 使い方は データをワークシートに記入して保存してください。 後はExcel のブックを開くと問題が開始されます。 以上
- NOBNNN
- ベストアンサー率50% (93/186)
A No.1 のつづき ===== 次に UserForm1 のコード ・プロジェクト エクスプローラ ウィンドウで、UserForm1k オブジェクトを右クリックし、 ショートカット メニューの [コードの表示] をクリックします。 以下のコードを記入してください。 Const C_Sheet = "Sheet1" '問題が入っているシート Const C_StGYO = 2 '問題が入っている開始行 Public G_IDX As Integer Public G_MyDocument As String Private Sub UserForm_Activate() 終了ボタン.Enabled = False G_IDX = C_StGYO Worksheets(C_Sheet).Select Me.Txt問題 = Range("B2").Value Dim WSH As Variant, OpenFileName As String Set WSH = CreateObject("WScript.Shell") G_MyDocument = WSH.SpecialFolders("MyDocuments") & "\" End Sub Private Sub Prevボタン_Click() Worksheets(C_Sheet).Select If G_IDX > C_StGYO Then F = MsgBox("前の問題を表示します。" & vbCrLf & _ "保存されていない回答は破棄します。" & vbCrLf & _ "よろしいですか?", vbYesNo) If F = vbNo Then Exit Sub End If G_IDX = G_IDX - 1 Me.Txt問題 = Range("B" & G_IDX).Value End If If Len(Trim(Range("B" & (G_IDX + 1)).Value)) = 0 Then Me.終了ボタン.Enabled = True Else Me.終了ボタン.Enabled = False End If End Sub Private Sub Fowerdボタン_Click() Worksheets(C_Sheet).Select If Len(Trim(Range("B" & (G_IDX + 1)).Value)) > 0 Then F = MsgBox("次の問題を表示します。" & vbCrLf & _ "保存されていない回答は破棄します。" & vbCrLf & _ "よろしいですか?", vbYesNo) If F = vbNo Then Exit Sub End If G_IDX = G_IDX + 1 Me.Txt問題 = Range("B" & G_IDX).Value If Len(Trim(Range("B" & (G_IDX + 1)).Value)) = 0 Then Me.終了ボタン.Enabled = True End If End If End Sub Private Sub 回答ボタン_Click() F = MsgBox("回答はこれでいいですか?", vbYesNo) If F = vbNo Then Exit Sub End If With Range("C" & G_IDX) .Value = Me.Txt回答 End With End Sub '================================= ◆つづく A No.3 へ
- NOBNNN
- ベストアンサー率50% (93/186)
>>VBでは、テキストボックスかなんかにシートから入力することは可能なのでしょうか? 可能です. ユーザーフォーム を自分で作ればよいかと思います。 ■ 参考:http://www.serpress.co.jp/excel/vba016.html できれば Access のほうが作りやすいと思いますけど。 Excel でもできなくはないです。 まずは ツール/マクロ/Visual Basic editor を表示させてください 挿入/ユーザーフォーム でUserForm1 を作成します。 デザインは 添付した画像を見てください。 問題のTextBox と回答のTextBox 、 ボタン(次へ、前へ、終了、回答を保存) を作成してください。 次にコード ・プロジェクト エクスプローラ ウィンドウで、ThisWorkbook オブジェクトを右クリックし、 ショートカット メニューの [コードの表示] をクリックします。 ・コード ウィンドウの上部の Object の一覧で、[Workbook] を選択します。 これにより、次のような Open イベントの空白のプロシージャが作成されます。 Private Sub Workbook_Open() End Sub このプロシージャに、次の行を追加します。 Private Sub Workbook_Open() UserForm1.Show End Sub ===== つづく (A No.2 へ)
補足
解答はラジオボタンで出来ませんか? こんなにも詳しく書いてくださってありがとうございます。
お礼
ホントにホントにどうもありがとうございました。 出来ました。 なんとお礼を申してよいやら、、、 こんなにも詳しく書いてくださってホントにありがとうございました。