Excel VBA質問箱 IV

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

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


9127 / 13646 ツリー ←次へ | 前へ→

【29189】ユーザーフォーム 年寄り 05/9/27(火) 12:13 質問[未読]
【29191】Re:ユーザーフォーム Statis 05/9/27(火) 12:40 発言[未読]
【29194】Re:ユーザーフォーム 年寄り 05/9/27(火) 13:38 発言[未読]
【29200】Re:ユーザーフォーム Statis 05/9/27(火) 14:32 回答[未読]
【29203】Re:ユーザーフォーム 年寄り 05/9/27(火) 16:46 発言[未読]
【29216】Re:ユーザーフォーム ichinose 05/9/27(火) 19:22 発言[未読]
【29219】Re:ユーザーフォーム 年寄り 05/9/27(火) 20:21 お礼[未読]

【29189】ユーザーフォーム
質問  年寄り E-MAILWEB  - 05/9/27(火) 12:13 -

引用なし
パスワード
   ユーザーフォームが二つあります。
    UserForm1,UserForm2

UserForm1にはTextBox1があります。
UserForm2にはCommandButton1があります。

UserForm1のTextBox1に、最初の文字が "z" と入力されると、UserForm1を消し、UserForm2を表示させます。
UserForm2でCommandButton1をクリックすると、UserForm1のTextBox1の値を消し、UserForm2を消し、UserForm1を表示させます。

私のコードを下記に記します。

Private Sub TextBox1_Change()
If TextBox1.Value = "z" Then
  Unload Me
  UserForm2.Show
End If
End Sub

Private Sub CommandButton1_Click()
Unload Me
UserForm1.Show
End Sub

ところがUserForm2から戻ったUserForm1のTextBox1に文字 "z" を入れても、イベントが発生しません。

間違えを厳しく指摘してください。

【29191】Re:ユーザーフォーム
発言  Statis  - 05/9/27(火) 12:40 -

引用なし
パスワード
   こんにちは
UserForm1もコマンドボタンで処理しては如何ですか?

Private Sub CommandButton1_Click()

If TextBox1.Value = "z" Then
  Unload Me
  UserForm2.Show
End If

End Sub

【29194】Re:ユーザーフォーム
発言  年寄り E-MAILWEB  - 05/9/27(火) 13:38 -

引用なし
パスワード
   ▼Statis さん:
ありがとうございます。

>UserForm1もコマンドボタンで処理しては如何ですか?

TextBox1では名前検索で絞込みを行ないます。シート上に下記のようなデータがあるとします。

...        ...
...        ...
yamaguti         山口
yamasita         山下
yosida        吉田
...        ...
...        ...

文字 "y" を入れると上の三人の漢字表記がUserForm1に出現します。さらに文字 "o" を入れTextBox1の値が "yo" になると『吉田』に絞られてUserForm1に表します。目的の人を見つけたところで、UserForm1の該当する人の文字をクリックするとその人の個人情報がUserForm2に出てきます。

残念ながらそのような事情があります。

【29200】Re:ユーザーフォーム
回答  Statis  - 05/9/27(火) 14:32 -

引用なし
パスワード
   こんにちは
例です
データはSheet1のA列にローマ字,B列に漢字とします
UserForm1にTextBox1と Label1(少しい大きめ)に作成
UserForm2にコマンドボタンを用意

UserForm1のモジュールに記載

Private Sub Label1_Click()
Unload Me
UserForm2.Show
End Sub

Private Sub TextBox1_Change()
Dim Fi As Range, Ad As String, Da As String
With Worksheets("Sheet1")
   Set Fi = .Range("A1", .Range("A65536").End(xlUp)) _
     .Find(Me.TextBox1.Value, , xlValues, xlPart, , xlPrevious)
   If Not Fi Is Nothing Then
    Me.Label1.Caption = ""
    Ad = Fi.Address
    Do
     Set Fi = .Range("A1", .Range("A65536").End(xlUp)).FindNext(Fi)
     Da = Da & Fi.Offset(, 1).Value & Chr(10)
    Loop Until Ad = Fi.Address
    Me.Label1.Caption = Da
   End If
End With
End Sub

UserForm2のモジュールに記載
Private Sub CommandButton1_Click()
Unload Me
UserForm1.Show
End Sub


動作:
UserForm1をShowさせTextBoxにローマ字を1文字づつ入れ
ラベルに名前が表示される一人になった時点で
ラベルをクリックするとUserForm2が表示される
コマンドボタンをクリックすると再度UserForm1が表示され
同じ事を繰り返すことが出来ます。
まずは、試してみてください。

【29203】Re:ユーザーフォーム
発言  年寄り E-MAILWEB  - 05/9/27(火) 16:46 -

引用なし
パスワード
   ▼Statis さん:
丁寧に対応していただきましてありがとうございます。

あなたのようにスマートではないのですが、私も絞込みの方法は出来上がっています。そして該当する人が存在し、その人の名前をクリックして情報を出し、更新し、UserForm1に戻って同じ作業を繰り返すことは出来ています。

私のデータには文字 "z" で始まる人は存在しないので、新規の登録ということになります。新規登録のフォームがUserForm2ということになりますね。(更新のフォームも実際はUserForm2です。)データに存在しない文字列が入力されると、新規登録のイベントを発生させているのです。新規登録を終えてからUserForm1に戻るとこのイベントが発生しないのです。

もう一度整理します。該当する人が存在するときは、私が始めに示したコードで目的通り機能しています。すなわちUserForm1のLabelで名前をクリックするという手順を踏むと出来るのです。

【29216】Re:ユーザーフォーム
発言  ichinose  - 05/9/27(火) 19:22 -

引用なし
パスワード
   ▼年寄り さん:
こんばんは。


>ユーザーフォームが二つあります。
>    UserForm1,UserForm2
>
>UserForm1にはTextBox1があります。
>UserForm2にはCommandButton1があります。
>
>UserForm1のTextBox1に、最初の文字が "z" と入力されると、UserForm1を消し、UserForm2を表示させます。
>UserForm2でCommandButton1をクリックすると、UserForm1のTextBox1の値を消し、UserForm2を消し、UserForm1を表示させます。
>
標準モジュールに
'=================================================
Sub test()
  Load UserForm1
  Do While UserForm1.unload_flg = False
   UserForm1.Show
   Loop
  Unload UserForm1
End Sub


Userform1のモジュールで
'==================================================
Public unload_flg As Boolean
'==================================================
Private Sub TextBox1_Change()
  If TextBox1.Text = "z" Then
   Me.Hide
   UserForm2.Show
   TextBox1.Text = ""
   End If
End Sub
'==================================================
Private Sub UserForm_Initialize()
  unload_flg = False
End Sub
'=======================================================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode <> 1 Then
   Cancel = True
   Me.Hide
   unload_flg = True
   End If
End Sub


Userform2のモジュールで
'===========================================================
Private Sub CommandButton1_Click()
  Unload Me
End Sub


として、testを実行してみてください。

尚、

>UserForm1のTextBox1に、最初の文字が "z" と入力されると、UserForm1を消し、UserForm2を表示させます。

とありますが、

Userform1を消さなくてもよいのなら、もっと簡単なんですけど・・。
(つまり、Userform1の上にUserform2がオーバーライドされる仕様)

これでも良いのではないですか?

【29219】Re:ユーザーフォーム
お礼  年寄り E-MAILWEB  - 05/9/27(火) 20:21 -

引用なし
パスワード
   ▼ichinose さん:

いつもながらありがとうございます。おかげさまで解決しました。

また示していただいたコードから多くのことを学びました。

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