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

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

ただいまの
回答率

91.35%

  • VBA

    1126questions

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

VBAについての質問です。

受付中

回答 3

投稿 2017/12/02 14:41 ・編集 2017/12/02 14:55

  • 評価
  • クリップ 0
  • VIEW 130

koarakko

score 1

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • imihito

    2017/12/02 16:37

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

    キャンセル

回答 3

+2

「質問への追記」でも指摘されていますが、「ユーザ定義型は定義されていません。」というエラーは、単純に、Form2 というフォームが存在しないからでしょう。また、「プロパティが不正です」というエラーは、オブジェクトを代入するときの構文が間違っているからです。オブジェクトの代入にはSetが必要になります。
Form2 が存在しているなら、下記のコードでエラーなく表示できます。

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


また、フォームを一つ表示するだけなら、slashさんの回答の回答のコードでもOKです。

ではどのよう時に上記のようなコードを使うかというと、Form2 を同時に複数表示させたいという時に使います。

例えば、コードを下記のように書き換えると、ボタンをクリックするたびに Form2 が表示されます。
(Form1 の ShowModalプロパティは False に設定しておくこと)

Private Sub CommandButton1_Click()
    Dim frm As Form2
    Set frm = New Form2
    frm.Show False
End 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 15:18

編集 2017/12/04 19:57

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/04 18:47 編集

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

    キャンセル

  • 2017/12/04 19:55

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

    キャンセル

  • 2017/12/05 10:18

    なんかすいません ^^;

    キャンセル

  • 2017/12/05 11:44

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

    キャンセル

+1

スタートボタンがあるフォームを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 18:32

編集 2017/12/02 18:34

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

slashさんの回答で概ね正しいですが、フォームについて理解して置くべき点があると思いましたので
補足させてください。

VBAにおいて、フォーム(今回でいうForm1, Form2)には、
ShowModal
というプロパティがあります。
このプロパティは「同時に複数のインスタンスの生成を認めるかどうか」を設定するプロパティです。

これは初期状態ではFalseになっています。
この状態では、インスタンスの生成は出来ません。
つまり、この状態では型宣言や New は出来ません。
なので、VBAで「ユーザ定義型は定義されていません。」(=自分で作ったクラス、かつインスタンス生成できるものにないよ)というエラーが出ます。

しかし、このプロパティを True にした場合、koarakko様が記載された
「型宣言をしてインスタンスを生成する」
という行為ができるようになります。

もしかすると、クイズの場合、
同じフォームを使いまわして文言だけを変更したりするなど、
同じフォームを同時に表示したいケースがあるかもしれません。
その場合、上記プロパティを True にした上で New を実施すれば良いです。

投稿 2017/12/03 18:38

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    Symfony2で、formの値を変更するには?

    Symfony2を使っています。 例えば、アイテムを編集しているアクションがあるとして ページに表示される前にコントローラー内のフォームフィールドの値を変更したいと思っています。

  • 解決済

    javascript evalでのNaNエラーについて

    <SCRIPT LANGUAGE="JavaScript">   <!--   function dsp_calc() {     document.frm.result.valu

  • 解決済

    VBA

    お尋ねします。ACCESSのformのテキストBOXで クリックやファイルを開いたときに PCのコンピュウター名を自動取得したいです ①Sub Sample()     D

  • 受付中

    ユーザーフォームの表示ついて

    前提・実現したいこと Excelを最小化しても、ユーザーフォームを表示させたい。 <詳細> ユーザーフォームを vbModeless で表示しています。 Excelを最

  • 解決済

    PHPでフォームから受け取ったデータを任意のファイルに渡したい

    フォームから書き込まれたデータを「bbs,dat」ファイルに渡したいのですがうまくいきません $dataFile = "bbs.dat"; if($_SERVER['

  • 解決済

    Jazzy formの値をMW WP formに受け渡したい。もしくはMW WP formで計算した...

    実現したいこと WordPressで以下の機能を持った注文フォームを作成したい ・商品の合計金額を計算できる ・送信前確認画面 ・自動返信メール ・管理者宛自動お知らせメ

  • 解決済

    AccessVBAの類似フォームのプロシージャコピー

    前提・実現したいこと Accessで類似フォームのプロシージャのコピーですが、効率のいい方法を教えて下さい。同じイベントを名前の違うフォームにコピーするのですが、同じコードの繰り

  • 解決済

    VBAにてFollowHyperlinkを使うと遅くなる。

    VBAを使ってオブジェクトの位置とサイズの情報をある範囲に書き込むマクロを組んだのですが、このマクロを普通にボタンから呼び出せば快適な速度で処理させれるのですが、ハイパーリンクから

同じタグがついた質問を見る

  • VBA

    1126questions

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