人に聞けない痔の悩み、これでスッキリ >>

こんばんは。VB初心者です。
VB6.0を用いてのクイズゲームを作成することになりました。
フォームの内容は以下のようなものです。
・問題文(ラベルorテキストボックス)
・ヒントの動画(MCIコントロール)
・四択選択肢(オプションボタン)
・正解不正解(ピクチャボックス)
・解説(ラベルorテキストボックス)

これを20問作るのですが、フォームを20個作らずに各コントロールの中身だけを変化させていきたいのですが、どのようなプログラムになるのか検討がつきません。
そこで、大まかなプログラムの流れだけでもいいので教えて欲しいです。
また、クイズ作成において参考になるHPがあれば教えて下さい。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

20個フォームをつくるなんてやめて~(笑)



クイズは問題数分の配列を用意すればいいです。問題文と答えは
DIM Aestion(20) As String
DIM Kotae(20) as integer

ついでに回答者の結果を格納する配列も用意しましょう。
DIM Kekka(20) As Integer

とりあえず処理の中心は上記3つの配列です。
コードの先頭において、どこでも参照できるようにした方が楽です。

問題文はファイルから読み込む方が汎用性があっていいですが、
初心者だと大変なので、とりあえずはForm_Loadに書いてしまいましょう。
20問は毎回固定になります。

慣れたらQuestionとKotaeの配列を100に増やすとかしてもいいです。
問題文は最初100題書いておいて、20題だけ出題することもできます。

選択肢はオプションボタンとありますが、これは要らない。
最初から4つのボタンを用意して、
それを押下させた方が操作性もいいしコードも楽になります。

何問目の問題かを制御するカウンターもコードの先頭に宣言しましょう。
Dim nanmonme As Integer

これら変数をコードの先頭におくと便利なのは、
VBがイベント駆動型で処理がイベントにまたがってしまうからです。

どこのSub にもFunctionにも属さないコードの先頭におけば
フォームを閉じるまで変数の値はずっと保持されています。

MCIコントロールは最後の最後。
とりあえず20問最後まで動くインタフェースを作ってからの話ですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

まずは配列ですね♪
操作性や変数のおく位置についてもありがとうございました。
また質問するかもしれません。その時は宜しくお願いします。

お礼日時:2006/08/19 18:14

A) 問題の情報をテキストファイルや Jet 方式のデータベースファイル (*.mdb) にでも書いておく。


B) 起動時に問題情報ファイルから 20問を一気に配列に読み込む。
C) 配列から「次の問題」を引っ張ってきてフォーム内の変数やコントロールに読み込む。

D) ユーザーがフォーム上の [次の問題] を押すと、先と同様に配列から「次の問題」を引っ張ってきてフォーム内の変数やコントロールに読み込む。

E) 問題の移動は以下同様に最終問題まで続く。


問題情報ファイルが持つ要素は
・問題の文章
・ヒント動画のファイルへのパス
・選択肢の番号と文字
・正解番号
・開設
といった感じ。

(B) の部分、つまり全ての問題を管理し、要求があれば「次の問題」(というかカレントの問題)を差し出す機能はクラスにしちゃってもいいんじゃないでしょうかね。
その場合クラスの機能としては(技術的に簡単に済ますなら)
・全ての問題情報を保持する配列(メンバ変数)
・全部で何問目なのかを提供するプロパティ
・現在の問題の問題文、ヒント動画パス、選択肢、などを提供するプロパティ
・次の問題に移動するメソッド
といったところでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

まず、配列とクラスについて勉強したいと思います。
また質問するかもしれません。その時は宜しくお願いします。

お礼日時:2006/08/19 18:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q4択問題のプログラムでランダムに出題する処理で困っています

現在私は画像のような4択の問題を解答し最後に何問正解していたかを表示するプログラムを作成しています。

解答を選択して「次の問題」ボタンをクリックすれば次の問題に移行する・・・というような流れです。

データテーブルに「問題(Question)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)*今質問中では使用させません」を格納しています。

最終的な目標はデータテーブルに問題を300問用意しその中からランダムに100問出題して最後に結果を表示するプログラムを作成することです。

今どうすればランダムに出題しつつ同じ問題が出題されないようにするプラグラムを組めばいいのか壁にぶつかっています。

下記が「次の問題」ボタンのプログラムです。


Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click

' i が -1 のとき(つまり、初回のクリック)
If i = -1 Then
'選択肢を選択可能にする
GroupBox1.Enabled = True

'NextQuestionのテキスト変換
NextQuestion.Text = "次の問題"
' i が -1以外のとき(つまり、回答後のクリック)
Else
'正誤確認
If Answer1.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "ア"
ElseIf Answer2.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "イ"
ElseIf Answer3.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "ウ"
ElseIf Answer4.Checked = True Then
DataSet1.DataTable1(i).SelectAnswer = "エ"
End If

If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then
total = total + 1
End If

End If

i += 1 ' i をインクリメント(出題を次に進める)

' i が10になった = 回答が10問終わった
If i = 10 Then
MsgBox("あなたの正解数は10門中" & total & "問です!")
Me.Close()
Else
'問題の読み込み
Question.Text = DataSet1.DataTable1(i).Question
Answer1.Text = DataSet1.DataTable1(i).Answer1
Answer2.Text = DataSet1.DataTable1(i).Answer2
Answer3.Text = DataSet1.DataTable1(i).Answer3
Answer4.Text = DataSet1.DataTable1(i).Answer4

'ラジオボタンを初期位置に戻す
Answer1.Checked = True
End If


End Sub

*変数iはPublicで宣言しています。
*最終目標は100問出題なのですが今は10問で動くプログラムを作成しています。

わかるかたがいましたら知恵をかしてください。
お願いします。

現在私は画像のような4択の問題を解答し最後に何問正解していたかを表示するプログラムを作成しています。

解答を選択して「次の問題」ボタンをクリックすれば次の問題に移行する・・・というような流れです。

データテーブルに「問題(Question)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)*今質問中では使用させません」を格納しています。

最終的な目標はデータテーブルに問題を300問用意しその中からランダムに100問出題して最後に結果を表...続きを読む

Aベストアンサー

まず「次の問題に進む時、問題の参照にiを使わず、乱数で求めた0~299の値を使う」と言うように変更しましょう。

そして「初期化時や無回答で次の問題に進んだ時の、解答(SelectAnswr)にセットする値を工夫する事で、未出題か出題済みか判定する」と言う処理をして、問題の重複を避けましょう。

ヒントだけ。

ヒントは以下の通り。

ヒント1.
「解答(SelectAnswr)」に入る値を「回答された"ア"~"エ"」「無回答でスキップした"S"」「まだ出題してない""」の3種類にする。
(無回答でのスキップが出来ない、つまり、選択肢のどれかを選ばないと「次の問題」ボタンが押せない、と言う処理の場合「無回答でスキップした"S"」は不要)

ヒント2.
最初の初期化時に「300件全部、解答(SelectAnswr)の値を""にして、すべて未出題」にする。

ヒント3.
出題時に問題を参照する時「DataSet1.DataTable1(i).ほげほげ」のように「(i)」で参照するのをやめる。
代わりに、乱数で「解答(SelectAnswr)の値が、まだ出題してない""になっている問題」を探す。
つまり「乱数で0~299の値を作り、解答(SelectAnswr)の値が""なら、その乱数が出題番号になり、解答(SelectAnswr)の値が""じゃないなら乱数の作り直し」をすればよい。

ヒント4.
変数の「i」は「最初は-1」「1題出題するごとに1を足す」「100題目が終わったら終了」の目的以外には使わない。
つまり「DataSet1.DataTable1(i).ほげほげ」っていう書き方を全部無くす。

ヒント5.
選択肢を選ばずに「次の問題」を押してしまった場合「解答(SelectAnswr)」の値が「まだ出題してない""」のまま次に進んでしまっては困るので、次に進む前に「解答(SelectAnswr)の値を"S"にする」と言う処理をして「出題済み」にする。
(無回答でのスキップが出来ない、つまり、選択肢のどれかを選ばないと「次の問題」ボタンが押せない、と言う処理の場合、この処理は不要)

ヒントは以上。

なお、この方法は「300問中100問」などのように、最後の100問目に近い時も未出題の問題が多い場合は問題ありませんが「すべての問題を出題する」などの場合、最後の問題に近くなると未出題の問題が減り「残りの問題が乱数にヒットせず、次の問題に進む際に時間がかかる」と言う欠点があるので注意して下さい。今回のように「300問中100問」であれば問題はありません。

まず「次の問題に進む時、問題の参照にiを使わず、乱数で求めた0~299の値を使う」と言うように変更しましょう。

そして「初期化時や無回答で次の問題に進んだ時の、解答(SelectAnswr)にセットする値を工夫する事で、未出題か出題済みか判定する」と言う処理をして、問題の重複を避けましょう。

ヒントだけ。

ヒントは以下の通り。

ヒント1.
「解答(SelectAnswr)」に入る値を「回答された"ア"~"エ"」「無回答でスキップした"S"」「まだ出題してない""」の3種類にする。
(無回答でのスキップが...続きを読む

QVisual Basicでクイズを作成!!

Visual Basicでクイズを作成中なんですが、クイズが正解するとポイントが追加するようにしたいんですがどうすればできますか?

Aベストアンサー

#3です。補足いただきありがとうございます。
補足要求した以上、少し加えます。
ただベストとか言うものでは全くありませんので、参考に。
>作成中なんですが
着手しているようだが、私案を書いてみます。
---------
メモ帳で、3択の例. 下記の文章を改行して入力のこと。
問題1 鎌倉幕府を開いたのは次の誰ですか
(1)平 清盛
(2)源 頼朝
(3)北条 時宗
正解 2
・・・
以下問題の数だけ順次1問あたり5行をセットにして、下行へ追加して(5行で1問分)入力して作る。
ファイル保存。テキストで保存になります。
ーーーーー
VBのフォームの上にラベル4個(問い1個+三択の3個、(他に正解・間違い表示1個、合計点数1個など必要と思うが)を貼り付ける。
このソフトを開始したら、上記テキストファイルの5レコードを順次読み、4つのラベルに問題をLabel1、3択をLabel2,3,4
の.Captionとしてセットする。
第5レコードは正解番号として、変数(下記ではseikai)に記憶する。
ラベル2-3のどれかをクリックすると
Private Sub Label1_Click()
If seikai = 1 Then
Label4.Caption = "正解です"
tensu = tensu + 1
Label5.Caption = "合計点数=" & tensu
Else
Label4.Caption = "間違いです"
End If
End Sub
というようなのを、Label2,3,4に入れておく
If seikai = 1 Then
の1は2,3に変える。
「次へ」ボタンを設けておき、クリックすると
次から上記テキストファイルを5レコード読んで、上記の処理を
する。以下繰り返し。「途中終了ボ」タンを作るのも良い。
正解番号を表示する「正解番号」ボタンも作るべきかも。

#3です。補足いただきありがとうございます。
補足要求した以上、少し加えます。
ただベストとか言うものでは全くありませんので、参考に。
>作成中なんですが
着手しているようだが、私案を書いてみます。
---------
メモ帳で、3択の例. 下記の文章を改行して入力のこと。
問題1 鎌倉幕府を開いたのは次の誰ですか
(1)平 清盛
(2)源 頼朝
(3)北条 時宗
正解 2
・・・
以下問題の数だけ順次1問あたり5行をセットにして、下行へ追加して(5行で1問分)入力して作る。
ファ...続きを読む

QVB2008にて4択クイズ作成

質問させていただきます。
現在VB2008にて4択クイズを作成しています。
以下のサイトを参考に作成しているのですが、不明な点がありますのでご回答お願い致します。

http://www.microsoft.com/japan/msdn/student/challengeV2/chap2_vb/

上記のページでは、Web用?に開発されてるみたいで一部ないコントロールがあります。私はVB2008のwindowsアプリケーションフォームというテンプレートから開始しているのですが、これが問題なのでしょうか。
私の開発環境では「Literal」というコントロールが見当たりません。私が見落としているだけなのかも知れませんが。。

とりあえず、コントロールはURL先とほぼ同様にしています。テーブルの作成(テーブルの挿入の仕方も分かりませんでした)とLiteral、imageコントロールは省いています。
そして、プログラムの内容は最後の項の「さらに一歩進んだテクニック」のものをほとんどそのまま使っています。
以下にそのまま貼り付けます。

Public Class Form1
'正解のボタンを表す変数を定義
Dim Answer As Button
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
' 問題文を設定する
TextBox1.Text = "Web ブラウザと Web サーバーの間で Web ページなどをやり取りする際に用いられる通信プロトコルは?"
' 回答の選択肢を設定する
ButtonA.Text = "HTML"
ButtonB.Text = "HTTP"
ButtonC.Text = "XML"
ButtonD.Text = "URL"

' 正解のボタンを設定する
Answer = ButtonB

End Sub
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click, ButtonD.Click, ButtonC.Click, ButtonB.Click
' 押されたボタンが正解のボタンかどうか調べる
Dim senderButton As Button = CType(sender, Button)
' 正解のボタンを赤くする
Answer.BackColor = System.Drawing.Color.Red

End Sub

End Class

以上です。

上記のプログラムに追加したい項目を挙げます。

1.問題文を複数用意し、ランダムに出題する。(ランダムに出題するという機能は乱数を使えば実現できるのはなんとなく分かるのですが、実際のプログラムが分かりません。

2.用意した問題全てを解答したら終わり。

以上のような流れにしたいのですが、実際にはどのようにプログラミングすれば良いのでしょうか?部分でも良いのでご指摘お願い致します。

質問させていただきます。
現在VB2008にて4択クイズを作成しています。
以下のサイトを参考に作成しているのですが、不明な点がありますのでご回答お願い致します。

http://www.microsoft.com/japan/msdn/student/challengeV2/chap2_vb/

上記のページでは、Web用?に開発されてるみたいで一部ないコントロールがあります。私はVB2008のwindowsアプリケーションフォームというテンプレートから開始しているのですが、これが問題なのでしょうか。
私の開発環境では「Literal」というコントロールが見当...続きを読む

Aベストアンサー

参考にされているサイトは#1さんのおっしゃるとおり、Webページを作成するサンプルですので、リテラルコントロールのようにweb専用のコントロールはVBで使うことはできません。

literalコントロールはVBではlabelコントロールと類似しています。
違いとしてはスタイルシートに関するプロパティの有無です。
literalはWebページのデザインや基本設定を定義するスタイルシートに関するプロパティを持っていますが、labelにはないといったところです。

基本的には文字を表示したいというだけですのでほぼ同じものです。

サンプルを作ってみましたので掲載します。
フォームにLabelコントロールを追加してください。
内容がわからない場合はお礼欄に御質問ください。

Public Class Form1
'正解のボタンを表す変数を定義
Private Const QuestionCount As Integer = 5
Private Answer As Button
Private QuestionNum() As Integer
Private Question() As String = {"Web ブラウザと Web サーバーの間で Web ページなどをやり取りする際に用いられる通信プロトコルは?", _
"問2", "問3", "問4", "問5"}
Private AnswerValue() As String = {"HTML,HTTP,XML,URL,1", "答え1,答え2,答え3,答え4,3", _
"答え1,答え2,答え3,答え4,3", "答え1,答え2,答え3,答え4,3", _
"答え1,答え2,答え3,答え4,3"}
Private ButtonArray As New System.Collections.ArrayList
Private NowQuestionNum As Integer = 0
Private Point As Integer = 0

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click, ButtonD.Click, ButtonC.Click, ButtonB.Click
' 押されたボタンが正解のボタンかどうか調べる
Dim senderButton As Button = DirectCast(sender, Button)
' 正解のボタンを赤くする
Answer.BackColor = System.Drawing.Color.Red
If senderButton.BackColor = System.Drawing.Color.Red Then
MessageBox.Show("正解!!")
Point += 1
Else
MessageBox.Show("はずれ")
End If
Answer.BackColor = System.Drawing.SystemColors.Control
If NowQuestionNum = QuestionCount - 1 Then
MessageBox.Show(Point & "門正解です、お疲れ様でした。")
End
End If
NowQuestionNum += 1
Call SetQuestion()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
QuestionNum = GetRandoms(0, QuestionCount - 1)
'配列にボタンを格納
ButtonArray.Add(Me.ButtonA)
ButtonArray.Add(Me.ButtonB)
ButtonArray.Add(Me.ButtonC)
ButtonArray.Add(Me.ButtonD)

Call SetQuestion()
End Sub
Private Sub SetQuestion()
' 問題文を設定する
Label1.Text = "問" & StrConv(NowQuestionNum + 1, VbStrConv.Wide)
TextBox1.Text = Question(QuestionNum(NowQuestionNum))
Dim Answers() As String = AnswerValue(NowQuestionNum).Split(",")

' 回答の選択肢を設定する
For i As Integer = 0 To ButtonArray.Count - 1
ButtonArray(i).text = Answers(i)
Next
' 正解のボタンを設定する
Answer = ButtonArray(Answers(4))
End Sub
Public Function GetRandoms(ByVal L As Integer, ByVal U As Integer) As Integer()
'LからUの範囲の重複の無い乱配列を返す。
Dim M As Integer
Dim a() As Integer
Dim i As Integer
Dim N As Integer
Dim V As Integer

M = U - L
ReDim a(M)

For i = 0 To M
a(i) = i + 1
Next

Randomize()
For i = M To 2 Step -1
N = Int(Rnd() * i)
V = a(N)
a(N) = a(i)
a(i) = V
Next

For i = 0 To M
a(i) = a(i) + L - 1
Next

GetRandoms = a
End Function
End Class

参考にされているサイトは#1さんのおっしゃるとおり、Webページを作成するサンプルですので、リテラルコントロールのようにweb専用のコントロールはVBで使うことはできません。

literalコントロールはVBではlabelコントロールと類似しています。
違いとしてはスタイルシートに関するプロパティの有無です。
literalはWebページのデザインや基本設定を定義するスタイルシートに関するプロパティを持っていますが、labelにはないといったところです。

基本的には文字を表示したいというだけですのでほぼ同じ...続きを読む

Qエクセルのマクロでゲームを作成したいのですが

タイトルの通りです office2002ですが visual vasic editorに入力しています。
Sub quiz1()
MsgBox "[OK]ボタンを押すと、なぞなぞが始まります"
MsgBox "自分が動物だと言っているような飲み物は?"
MsgBox "サイダー"
MsgBox "話をすることの大好きな道具は?"
MsgBox "シャベル"
MsgBox "やぶれば、やぶるほど、ほめられるものは?"
MsgBox "記録"
End Sub
と入力しましたが メッセージボックスのタイトル部分が Microsoft Excelとなっていますが 例えば "問題1"とかに変えたいのですが 
どうすればいいのでしょうか お願いします

Aベストアンサー

おもしろそうなので、寄せてもらいます。Sheet2に、データをセットして、そこから問題と答えを呼び出します。Sheet2の1列目は、問題番号、2列目は問題、3列目は答えとして、2 行目から、データが入っているとします。

次のコードを、標準モジュールにコピペしてください。


Sub quiz()
Dim ans As Variant
Dim Question, Answer, H(3) As String
Dim i As Integer
Dim WS As Object
Set WS = Worksheets("Sheet2")
H(1) = "ぴんぽ~ん!"
H(2) = "当たり!"
H(3) = "残念"
MsgBox "[OK]ボタンを押すと、なぞなぞが始まります", , "クイズ"
i = 1
While WS.Cells(i + 1, 2) <> ""
Question = WS.Cells(i + 1, 2).Value
Answer = WS.Cells(i + 1, 3).Value
ans = InputBox(Question, "問題" & i)
If ans = Answer Then
MsgBox H(1), , H(2)
Else
MsgBox Answer & "でした。", vbCritical, H(3)
End If
i = i + 1
Wend
End Sub

おもしろそうなので、寄せてもらいます。Sheet2に、データをセットして、そこから問題と答えを呼び出します。Sheet2の1列目は、問題番号、2列目は問題、3列目は答えとして、2 行目から、データが入っているとします。

次のコードを、標準モジュールにコピペしてください。


Sub quiz()
Dim ans As Variant
Dim Question, Answer, H(3) As String
Dim i As Integer
Dim WS As Object
Set WS = Worksheets("Sheet2")
H(1) = "ぴんぽ~ん!"
H(2) = "当たり!"
H(3) = "残念"
MsgBox "[OK]ボタンを押...続きを読む

QCommandButtonのCaptionを変化させたい

VBAを始めたばかりの初心者です。
sheet1にコントロール(CommandButton)を10個ほど配置しました。各CommandButtonのCaptionにsheet2~11のセルA1の値を表示させたいと思っています(このA1の値は変化します)。
Private Sub Workbook_Open()
Dim Mrang1 As String
Mrang1 = Worksheet(2).Range("a1").Value
CommandBottan1.Caption = Mrang
End Sub
上記のようなものを考えてみましたが、ダメでした。
根本的に何か間違っているのでしょうか。
よろしくお願いします。

Aベストアンサー

質問の真意というか、困っている状況が良く伝わりませんが推定して
私も試行してみました。上手く行かない原因は「イベント」の捕らえ方
選び方にあると思います。イベントとは「クリックしたら」とか「ワークブックを開いたら」とか言うプログラムが実行される「きっかけ」のことですよね。
以下回答を済ませてから良く見ると質問はコマンドボタン
を貼りつけるものでした。済みません置き換えてください。変わりはないと思います。
新規WorkbookのSheet1を開き、メニューバーの右余白部分で
右クリック-コントロールツールボックス-ラベル(Aの表示のあるもの)とクリックし、ラベルをSheet1上にドラッグして貼りつけました。
それを3回繰り返し3つラベルを貼りつけました。その後
ツール-マクロ-VisualBasicEditor-コードをクリックします。
イベントとしてWorksheetのActivateを選びました。
コーディングの本体は貴殿と同じです。
Private Sub Worksheet_Activate()
Label1.Caption = Worksheets("sheet1").Range("a1")
Label2.Caption = Worksheets("sheet2").Range("a1")
Label3.Caption = Worksheets("sheet3").Range("a1")
End Sub
そしてメニューの「実行」をクリックします。その後Worksheetに切り替えてSheet2のA1に文字列値(ロとする)を入れ、Sheet3のA1に文字列値(ハとする)を入れSheet1に戻ります。最後にSheet1のA1に文字列(イ)値を入れると、Sheet1の3つのラベルの文字がそれぞれイ、ロ、ハになります。
Sheet2を開いてA1の値を変えたり、Sheet3を開いてA1の値を変えたりして、Sheet1に戻るとSheet1の3つラベルは変えたように変わります。
ただこのWorksheetはSheet1を指すようで、Sheet2のA1に「ロ」を
入れた時やSheet3のA1に「ハ」を入れた時に、Sheet1のラベル
が変わるのではないようです。
しかし貴殿の意図のケースではSheet1にもどった時に変わっていれ
ば差し支えないのではないでしょうか。

質問の真意というか、困っている状況が良く伝わりませんが推定して
私も試行してみました。上手く行かない原因は「イベント」の捕らえ方
選び方にあると思います。イベントとは「クリックしたら」とか「ワークブックを開いたら」とか言うプログラムが実行される「きっかけ」のことですよね。
以下回答を済ませてから良く見ると質問はコマンドボタン
を貼りつけるものでした。済みません置き換えてください。変わりはないと思います。
新規WorkbookのSheet1を開き、メニューバーの右余白部分で
右クリック-...続きを読む

QVBA:ユーザフォームのラベルの指定の仕方教えてください。

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。
--------------------------------------------
Sub セルの値をラベル表示する()
For i = 1 To 20
With UserForm1.Label(i)
.Caption = Cells(1, i)
End With
Next i
End Sub

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号...続きを読む

Aベストアンサー

 Excel VBAではコントロール配列はサポートされていませんが、ラベルの名前をLabel1, Label2,・・・ Label20とすると、以下のコードでほぼ同じことを実現できます。

Sub セルの値をラベル表示する()
 For i = 1 To 20
  With UserForm1.Controls("Label" & i)
   .Caption = Cells(1, i)
  End With
 Next i
End Sub

QVBでボタンを押すと画像をランダム表示させる

VisualBasic2005ExpressEditionで「ボタンを押すとピクチャーボックスに画像をランダムで表示」させたいんですが、どうやるかわかりません教えてください。何件か探しては見たんですが見つかりませんでした。もしかしてVBでは、そういったプログラムはできないんでしょうか?

Aベストアンサー

えっと、やり方は他にもあると思いますが、楽なやつで。

まず、それぞれの画像ファイルの名前を格納する配列を用意します。
Dim strPicture(10) As String
strPicture(0) = "pic1.jpg"
strPicture(1) = "pic2.jpg"
strPicture(2) = "pic3.jpg"



という風にやります。配列の数は表示させたい画像分だけ作ります。

次に、ランダムに表示させるということなので
乱数を発生させる必要がありますね。

' 0 以上 a 未満の乱数を取得する
Dim intResult As Integer = hRandom.Next(a)

とやります。 aはランダムに表示させたい画像の最大枚数-1ですね。
すると、intResultに、ランダムな数値が入ります。

そうしたら

PictureBox1.image = Image.FromFile(strPicture(intResult))

とします。

上記のコードを、ボタンをクリックしたときのイベントに追加すれば
OKです。

ただ、上記のように画像ファイル名のみだと
プログラムがあるフォルダ内に画像ファイルがないと読み込めないので
フルパスで書いた方がいいかもです。

strPicture(0) ="C:\~" という具合です。

えっと、やり方は他にもあると思いますが、楽なやつで。

まず、それぞれの画像ファイルの名前を格納する配列を用意します。
Dim strPicture(10) As String
strPicture(0) = "pic1.jpg"
strPicture(1) = "pic2.jpg"
strPicture(2) = "pic3.jpg"



という風にやります。配列の数は表示させたい画像分だけ作ります。

次に、ランダムに表示させるということなので
乱数を発生させる必要がありますね。

' 0 以上 a 未満の乱数を取得する
Dim intResult As Integer = hRandom.Next(a)

...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qエクセル・VBAでテキストボックスに入力された文字を

エクセル・VBAでテキストボックスに入力された文字を
B列から検索し、結果をユーザーフォームのリストbox
に表示したいのですがうまくいきません
検索は部分一致・大文字小文字無視で行いたいです
よろしくお願いします

Aベストアンサー

部分的に一致していても、リストに追加するように出来ますか?
If Range("B" & i).Value = TextBox1.Value Then

If Range("B" & i).Value Like "*" & TextBox1.Value & "*" Then
にするとか

また、表示された1・2列目をクリックすると、そのセル
をアクティブに出来ると良いのですが・・・
No1の方のコードをお借りします。
Private Sub ListBox1_Click()
Range("C:C").Find(what:=ListBox1.Value, LookIn:=xlValues, lookat:=xlPart, MatchCase:=False).Activate
End Sub
とかでは?

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


人気Q&Aランキング