クイズソフトを作成してるのですが、スタートというボタンを押すと、フォーム1からフォーム2に移動するみたいなのを作成したいのですが、どうすればいいのでしょうか?
見よう見まねで作成したのですが、実行するとユーザ定義型は定義されていません。と出てきます。
Private Sub CommandButton1_Click()
Dim frm As Form2
frm = New Form2
frm.Show
End Sub
補足です。
ソースの2行目のFrom2をFrom1に変えたところ、プロパティが不正ですってでてきました
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
「質問への追記」でも指摘されていますが、「ユーザ定義型は定義されていません。」というエラーは、単純に、Form2 というフォームが存在しないからでしょう。また、「プロパティが不正です」というエラーは、オブジェクトを代入するときの構文が間違っているからです。オブジェクトの代入にはSet
が必要になります。
Form2 が存在しているなら、下記のコードでエラーなく表示できます。
VB
1Private Sub CommandButton1_Click() 2 Dim frm As Form2 3 Set frm = New Form2 4 frm.Show 5End Sub
また、フォームを一つ表示するだけなら、slashさんの回答の回答のコードでもOKです。
ではどのよう時に上記のようなコードを使うかというと、Form2 を同時に複数表示させたいという時に使います。
例えば、コードを下記のように書き換えると、ボタンをクリックするたびに Form2 が表示されます。
(Form1 の ShowModalプロパティは False に設定しておくこと)
VB
1Private Sub CommandButton1_Click() 2 Dim frm As Form2 3 Set frm = New Form2 4 frm.Show False 5End Sub
frm.Show False
と引数にFalseを設定することで、モードレス(ShowModal=False)で開きます。
ちなみに、ShowModalプロパティは 「同時に複数のインスタンスの生成を認めるかどうか」を設定するプロパティというのは微妙に間違っています。
ShowModal=True はモーダル、ShowModal=False はモードレス、という状態で開くということです。
モーダルは、そのフォームが開いている間はVBAコードは進まない、ユーザーはそのフォーム以外は触ることができないという動作、モードレスはその逆の動作(コードは進む、触ることができる)という違いです。
下記の2つのコードでモーダルとモードレスの動作の違いを確認してください。
Private Sub モーダルで開く() Dim Frm As UserForm2, Frm2 As UserForm2 'ShowModalの設定に関係なく複数インスタスの生成は可能 Set Frm = New UserForm2 Set Frm2 = New UserForm2 Frm.Show True 'モーダル 'Frmを閉じるとFrm2が表示される Frm2.Show True 'モーダル End Sub Private Sub モードレスで開く() Dim Frm As UserForm2, Frm2 As UserForm2 'ShowModalの設定に関係なく複数インスタスの生成は可能 Set Frm = New UserForm2 Set Frm2 = New UserForm2 Frm.Show False 'モードレス Frm2.Show False 'モードレス '重なって表示されるので、Frm2の位置を少しずらす Frm2.Top = Frm.Top + 50 Frm2.Left = Frm.Left + 50 End Sub
投稿2017/12/04 06:18
編集2018/01/14 07:22総合スコア33699
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/04 09:47 編集
2017/12/04 10:55
2017/12/05 01:18
2017/12/05 02:44
0
スタートボタンがあるフォームをForm1
と仮定した場合、
何らかの方法で、form1.show
としますね。
で、その後に
form1
の中のCommandButton1(スタートボタン)
をクリックするイベントが発動するわけですね。
Private Sub CommandButton1_Click() msgbox "pwnd" End sub
ここで、thisworkbook
の中にForm1
のほかに、thisworkbookにForm2
があるとすれば、下のコードは不要になりますね。たぶんAs Form2
の部分がVBAにとって「Form2
という型って何?」を引き起こしています。
Dim frm As Form2
frm = New Form2
frm.Show
具体的には、(走らせていませんが)以下の通りで行けるはずです。
Private Sub CommandButton1_Click() Form2.show End sub
投稿2017/12/02 09:32
編集2017/12/02 09:34退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
slashさんの回答で概ね正しいですが、フォームについて理解して置くべき点があると思いましたので
補足させてください。
VBAにおいて、フォーム(今回でいうForm1, Form2)には、
ShowModal
というプロパティがあります。
このプロパティは「同時に複数のインスタンスの生成を認めるかどうか」を設定するプロパティです。
これは初期状態ではFalseになっています。
この状態では、インスタンスの生成は出来ません。
つまり、この状態では型宣言や New は出来ません。
なので、VBAで「ユーザ定義型は定義されていません。」(=自分で作ったクラス、かつインスタンス生成できるものにないよ)というエラーが出ます。
しかし、このプロパティを True にした場合、koarakko様が記載された
「型宣言をしてインスタンスを生成する」
という行為ができるようになります。
もしかすると、クイズの場合、
同じフォームを使いまわして文言だけを変更したりするなど、
同じフォームを同時に表示したいケースがあるかもしれません。
その場合、上記プロパティを True にした上で New を実施すれば良いです。
投稿2017/12/03 09:38
総合スコア316
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。