質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

298閲覧

VBAについての質問です。

koarakko

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2017/12/02 05:41

編集2017/12/02 05:55

クイズソフトを作成してるのですが、スタートというボタンを押すと、フォーム1からフォーム2に移動するみたいなのを作成したいのですが、どうすればいいのでしょうか?
見よう見まねで作成したのですが、実行するとユーザ定義型は定義されていません。と出てきます。

Private Sub CommandButton1_Click()
Dim frm As Form2
frm = New Form2
frm.Show
End Sub

補足です。
ソースの2行目のFrom2をFrom1に変えたところ、プロパティが不正ですってでてきました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2017/12/02 07:37

`Form2`というフォームは存在していますか?またユーザーフォームはオブジェクトですが、オブジェクトの代入はどのように記述しますか?
guest

回答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
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ExcelVBAer

2017/12/04 09:47 編集

差し出がましいとは思いますが、 「モーダル」の方が一般的かと思います。
hatena19

2017/12/04 10:55

あら、(。>﹏<。) さっそく、修正しておきます。
ExcelVBAer

2017/12/05 01:18

なんかすいません ^^;
hatena19

2017/12/05 02:44

いえいえ、指摘されなかったら、この先ずっと恥をかきつづけるところでした ^^;
guest

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

yamashita_yuich

総合スコア316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問