Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8082 / 13644 ツリー ←次へ | 前へ→

【35082】中止コードについて kayu 06/2/21(火) 10:56 質問[未読]
【35087】Re:中止コードについて Jaka 06/2/21(火) 11:50 回答[未読]
【35101】Re:中止コードについて kayu 06/2/21(火) 13:37 お礼[未読]
【35128】Re:中止コードについて ichinose 06/2/22(水) 7:04 発言[未読]
【35241】Re:中止コードについて kayu 06/2/24(金) 9:29 お礼[未読]

【35082】中止コードについて
質問  kayu  - 06/2/21(火) 10:56 -

引用なし
パスワード
   はじめまして、宜しくお願いします。
色々試したのですが、うまくいかないので教えて貰えますでしょか?
使用しているエクセルはExcel2003です。

メインのマクロからフォームを呼び出して、処理をしていくのですが
入力が"9999"の時にいつでも中止して、メインのマクロの初めから
始めたいのです…
メインマクロは終了しないのでcallで、呼び出すと最終的にはエラーに
なってしまうのでgotoで帰りたいのですが…

ちなみにフォームにボタンを付ける事て、対応することが出来ません

説明が下手ですみません。

【35087】Re:中止コードについて
回答  Jaka  - 06/2/21(火) 11:50 -

引用なし
パスワード
   こう言うのはあまりやらないけど...。

標準モジュール

Public RestrFlg As Boolean

Sub main()
STRT:
MsgBox "START"
RestrFlg = False
UserForm1.Show
If RestrFlg Then GoTo STRT
MsgBox "終了"
End Sub

フォームモジュール

Private Sub CommandButton1_Click()
RestrFlg = True
Unload Me
End Sub

【35101】Re:中止コードについて
お礼  kayu  - 06/2/21(火) 13:37 -

引用なし
パスワード
   Jaka さん ありがとう御座います。

すみません。説明が足りませんでした。
入力は1回だけじゃなくて、最低10回ぐらいあり、そのうちどこで起こっても
中止できるようにしたいのです。この方法だとその都度if…thenをしないと
いけないので…すみません

実行エラーでしようとしたのですがフレームモジュールから、標準モジュール
へうまく連携が取れなくて断念しました。

【35128】Re:中止コードについて
発言  ichinose  - 06/2/22(水) 7:04 -

引用なし
パスワード
   kayu さん、Jaka さん おはようございます。

>
>すみません。説明が足りませんでした。
>入力は1回だけじゃなくて、最低10回ぐらいあり、そのうちどこで起こっても
>中止できるようにしたいのです。この方法だとその都度if…thenをしないと
>いけないので…すみません
>実行エラーでしようとしたのですがフレームモジュールから、標準モジュール
>へうまく連携が取れなくて断念しました。

正直、まだはっきりと仕様が把握出来ません。
よって、想像がかなり入っています。

新規ブックにて
  ユーザーフォーム(Userform1)に
   テキストボックスを10個作成してください。
   テキストボックス名は自動作成されるTextbox1〜Textbox10
   を使用します。

以下に示すmainプロシジャーを実行すると

・このUserform1が表示されます。

・Textbox1〜Textbox10のテキストボックスが入力可能になっています。

・このTextbox1〜Textbox10のどのテキストボックスでも「9999」が入力されると
 Userform1は初期化表示します。

・プログラムは、ユーザーフォームの「X」ボタンのクリックで終了します。

ではコードです。

まず、クラスモジュール(クラス名は自動作成される「Class1」)

'==================================================================
Private WithEvents txt As MSForms.TextBox
Private id As Long
Private pa_obj As Object
'==================================================================
Private Sub txt_change()
  If txt.Text = "9999" Then
   pa_obj.hidemode = 0
   pa_obj.Hide
   End If
End Sub
'====================================================================
Sub set_controls(idx As Long, obj1 As MSForms.TextBox, obj2 As Object)
  Set txt = obj1
  id = idx
  Set pa_obj = obj2
End Sub


次にUserform1のモジュール

'======================================================================
Public hidemode As Long
' 0---9999が入力された  1----閉じるボタンが押された
Private ctrl(1 To 10) As Class1
'======================================================================
Private Sub UserForm_Initialize()
  Dim idx As Long
  For idx = 1 To 10
    Set ctrl(idx) = New Class1
    With ctrl(idx)
     .set_controls idx, Controls("textbox" & idx), Me
     End With
    Next
End Sub
'======================================================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode = 0 Then
    Cancel = True
    hidemode = 1
    Me.Hide
  Else
    Erase ctrl()
    End If
End Sub


最後に標準モジュールに

'======================================================================
Sub main()
  Do
   Unload UserForm1
   UserForm1.Show
   Loop Until UserForm1.hidemode = 1
  Unload UserForm1
End Sub


以上です。mainを実行してみて下さい。


上記のようなクラスモジュールの記述を私はもう本来はしませんが、
今回はコードが短くなるので採用しました。

【35241】Re:中止コードについて
お礼  kayu  - 06/2/24(金) 9:29 -

引用なし
パスワード
   ▼ichinose さん kayuです
返事が遅くなってすみません
大変参考になりました。
クラスモジュールの使い方がよくわからないですが、これで何とか出来そうです
クラスモジュールをもう少し勉強して、頑張ってみます。

ichinose さん、Jaka さん 有難う御座いました

8082 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free