「教えて!ピックアップ」リリース!

こんばんわ!

エクセルのVBAを使った管理システムを作ろうと思うのですが、色々考えて下記のような状態にしてみたのですが、ユーザーフォームをモードレスにするとスタック容量が足りなくなります。

Sub aaa_date()
If Range("a1") = 1 Then
bbb_date.Show
ElseIf Range("a1") = 2 Then
ccc_date.Show
ElseIf Range("a1") = 3 Then
ddd_date.Show
End If
Call aaa_date
End Sub

bbb_date(ユーザーフォーム)に↓
Private Sub CommandButton1_Click()
Range("a1") = 2
Unload Me
End Sub
Private Sub CommandButton2_Click()
Range("a1") = 3
Unload Me
End Sub

ccc_date(ユーザーフォーム)に↓
Private Sub CommandButton1_Click()
Range("a1") = 1
Unload Me
End Sub
Private Sub CommandButton2_Click()
Range("a1") = 3
Unload Me
End Sub

ddd_date(ユーザーフォーム)に↓
Private Sub CommandButton1_Click()
Range("a1") = 1
Unload Me
End Sub
Private Sub CommandButton2_Click()
Range("a1") = 2
Unload Me
End Sub

※bbb_dateとccc_dateとddd_dateはそれぞれにあるボタンを押すとA7セルの値を変更するようにして、aaa_dateでどのフォームを表示するのかを選択しています。
※実際にはもっと沢山ユーザーフォームがあります。

上記の状態では動作するのですが、エクセルの表に値を入力したいので、bbb_dateとccc_datとddd_datをvbModeless(モードレス状態)にすると、スタック容量が足りませんと出ます。

別のやり方でもよいですので、ユーザーフォームを切り替える良い方法があったらお願いします。

A 回答 (2件)

はじめまして、


下記のプロシージャのCall aaa_date の部分は自分自身を呼び出しているので、
再帰呼び出しになるかな、VBAではエラーになる若しくはなりやすい処理の仕方です。

※実際にはもっと沢山ユーザーフォームがあります。
とのことですが、もしデザインが同一であれば雛形を作り中のデータなど
はコード内から変更します。フォームの表題であれば、.caption = 何何 となるはず。 

メインフォーム
  ↓
項目を選択 →   コード
  ↓        ↓   ユーザーフォームのデザインを選択 
  ↓        ↓   雛形のデータを変更
  ↓        ←
ユーザーフォーム表示


Sub aaa_date()
If Range("a1") = 1 Then
bbb_date.Show
ElseIf Range("a1") = 2 Then
ccc_date.Show
ElseIf Range("a1") = 3 Then
ddd_date.Show
End If
Call aaa_date
End Sub
    • good
    • 0

>Sub aaa_date()


>If Range("a1") = 1 Then
>bbb_date.Show
>ElseIf Range("a1") = 2 Then
>ccc_date.Show
>ElseIf Range("a1") = 3 Then
>ddd_date.Show
>End If
>Call aaa_date
>End Sub
このコードは実際のコードですか?
どういう意図で書きました?
Sub aaa_date()の中で
Call aaa_date
自分自身をCallしていて、終了条件がありません。
bbb_dateやccc_dateをモードレスで開くと無限Loopですからスタック不足になります。
コードもそうですが
>※実際にはもっと沢山ユーザーフォームがあります。
どれくらい沢山なのかにもよりますが
TabStripやMultiPageコントロールを使うなどして仕様も見直したほうが良いのかもしれません。
    • good
    • 0

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


人気Q&Aランキング