Excel VBA質問箱 IV

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

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


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

【45375】ユーザーフォームを変数名で ぴかる 06/12/21(木) 8:48 質問[未読]
【45376】Re:ユーザーフォームを変数名で ichinose 06/12/21(木) 8:58 発言[未読]
【45377】Re:ユーザーフォームを変数名で Blue 06/12/21(木) 9:04 質問[未読]
【45379】Re:ユーザーフォームを変数名で ichinose 06/12/21(木) 9:13 発言[未読]
【45381】こちらでしたぁ ぴかる 06/12/21(木) 9:25 お礼[未読]
【45383】Re:ユーザーフォームを変数名で Blue 06/12/21(木) 9:47 発言[未読]
【45380】Re:ユーザーフォームを変数名で Jaka 06/12/21(木) 9:21 発言[未読]
【45382】Re:ユーザーフォームを変数名で ぴかる 06/12/21(木) 9:31 お礼[未読]
【45400】Re:ユーザーフォームを変数名で メカ大好き! 06/12/22(金) 8:36 発言[未読]
【45401】Re:ユーザーフォームを変数名で Blue 06/12/22(金) 8:50 回答[未読]
【45402】Re:ユーザーフォームを変数名で Blue 06/12/22(金) 9:00 発言[未読]
【45406】Re:ユーザーフォームを変数名で Jaka 06/12/22(金) 9:52 発言[未読]
【45407】Re:ユーザーフォームを変数名で Jaka 06/12/22(金) 10:21 発言[未読]
【45411】Re:ユーザーフォームを変数名で メカ大好き! 06/12/22(金) 13:21 お礼[未読]

【45375】ユーザーフォームを変数名で
質問  ぴかる  - 06/12/21(木) 8:48 -

引用なし
パスワード
   ユーザーフォームを変数名で表示したいと同僚から質問されました。???で困っています。よろしくお願い致します。

フォーム名.Show
  ↑
 変数で

【45376】Re:ユーザーフォームを変数名で
発言  ichinose  - 06/12/21(木) 8:58 -

引用なし
パスワード
   ▼ぴかる さん:
おはようございます。

>ユーザーフォームを変数名で表示したいと同僚から質問されました。???で困っています。よろしくお願い致します。
>
>フォーム名.Show
>  ↑
> 変数で

Sub main()
  Dim ufd As UserForm1
  Set ufd = New UserForm1
  ufd.Show
End Sub

とこんなことでしょうか?

【45377】Re:ユーザーフォームを変数名で
質問  Blue  - 06/12/21(木) 9:04 -

引用なし
パスワード
   もしかして

Dim s As String

s = "UserForm1"

s.Show

みたいな事をやりたいとか?
たぶん出来ないよなきもするけど。。。
(単純に文字列をもとに Select Case するしかなさそ。)

【45379】Re:ユーザーフォームを変数名で
発言  ichinose  - 06/12/21(木) 9:13 -

引用なし
パスワード
   おはようございます。
>もしかして
>
>Dim s As String
>
>s = "UserForm1"
>
>s.Show
>
>みたいな事をやりたいとか?
あ〜、そっちですか?

でも、それなら

Sub test()
  UserForms.Add("userform1").Show
End Sub

これで試してください。

【45380】Re:ユーザーフォームを変数名で
発言  Jaka  - 06/12/21(木) 9:21 -

引用なし
パスワード
   記事番号
18804 ← ↓の記事番号に入力してください。

【45381】こちらでしたぁ
お礼  ぴかる  - 06/12/21(木) 9:25 -

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

>>もしかして
>>
>>Dim s As String
>>
>>s = "UserForm1"
>>
>>s.Show
>>
>>みたいな事をやりたいとか?
>あ〜、そっちですか?
>
>でも、それなら
>
>Sub test()
>  UserForms.Add("userform1").Show
>End Sub
>
>これで試してください。
そのもしかしてのこっちでした。バッチリうまく出来ました。
ありがとうございました。早速、同僚に伝えてきま〜す♪

【45382】Re:ユーザーフォームを変数名で
お礼  ぴかる  - 06/12/21(木) 9:31 -

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

>記事番号
>18804 ← ↓の記事番号に入力してください。
確認させて頂きました。バッチリです。ありがとうございました。

【45383】Re:ユーザーフォームを変数名で
発言  Blue  - 06/12/21(木) 9:47 -

引用なし
パスワード
   ▼ichinose さん:
>  UserForms.Add("userform1").Show
へぇ〜、こんな方法があるんですね。勉強になりました。

ただ、UserForms("UserForm1") のようなのはやはり無理ですね。
(UserForm1ってのは複数Addできますからね)

Show以外に何かするということを考えているのであれば、
UserForms.Addの戻り値を覚えておくしかないですね。
(もしくは何番目に登録されているかのインデックスを覚えておく)

【45400】Re:ユーザーフォームを変数名で
発言  メカ大好き!  - 06/12/22(金) 8:36 -

引用なし
パスワード
   横からで申し訳有りません。
このスレを読んでいて、疑問に思ったもので…

"UserForm" & (i).Show

↑ …みたいな書き方は、できないのでしょうか?
現在の私には、「i」の変数の宣言の仕方が良く判りませんが…
( Dim i As Integer や、Public i As Integer ではダメ?)
こういう事ができると、単純なループ式や、 Select Case 式、
どこかのオプションボタンの値を元に UserForm を起動させる式…の様に
応用が広く使える様な気がしまして、追加質問させていただきました。
(不可な場合には、私の疑問がスッキリします…)

【45401】Re:ユーザーフォームを変数名で
回答  Blue  - 06/12/22(金) 8:50 -

引用なし
パスワード
   Dim i As Integer

For i = 1 To 3
  UserForms.Add("UserForm" & CStr(i)).Show
Next

UserFormsは表示中のUserFormなんじゃないかな。
だから何も表示していない状態では

UserForms.Count

は 0 だから、当然そこからインデックスや名前を渡して
オブジェクトを取得ということは出来ません。
もっとも、【45383】 でレスしたように、名前で取得はありえません。
なぜならば、

UserForms.Add("UserForm1").Show vbModeless
UserForms.Add("UserForm1").Show vbModeless

としたときに、同じオブジェクト名のものが2つUserFormsに登録できるので
どちらを取得すればいいか決まらないからです。
(ですので、インデックスでしか指定できない。UserForms(1)みたいに)

UserForms.Add("UserForm1").Show vbModeless
UserForms.Add("UserForm1").Show vbModeless

' UserForms("UserForm1").Caption = "ほげ" ←は出来ない!
UserForms(1).Caption = "ほげ"

【45402】Re:ユーザーフォームを変数名で
発言  Blue  - 06/12/22(金) 9:00 -

引用なし
パスワード
   訂正
>UserFormsは表示中のUserFormなんじゃないかな。
じゃないですね。
Hideにしても含まれますな。

MsgBox UserForms.Count
UserForm1.Show vbModeless
MsgBox UserForms.Count
UserForm1.Hide
MsgBox UserForms.Count

ただ、VBは暗黙のインスタンス化(っていうのか微妙)があるので、
常態がものすごくわかりづらいです。
# 一般的には【45376】 のレスのように New してインスタンスを作ってから
# メソッドを呼ぶのが普通。

UserForm1.Show vbModeless
UserForm1.Show vbModeless

だと1つしか表示できないが、

Dim f As UserForm1
Set f = New UserForm1
f.Show vbModeless
Set f = New UserForm1
f.Show vbModeless

もしくは

UserForms.Add("UserForm1").Show vbModeless
UserForms.Add("UserForm1").Show vbModeless

では2つ表示できる。

【45406】Re:ユーザーフォームを変数名で
発言  Jaka  - 06/12/22(金) 9:52 -

引用なし
パスワード
   標準モジュール

Public AddUFM(1 To 3) As Variant

Sub fftest()
For i = 1 To 3
  Set AddUFM(i) = VBA.UserForms.Add("UserForm" & i)
  AddUFM(i).Show 0
Next
End Sub


各フォームモジュール
(エラーについては、手向きでエラートラップで逃げました。)

Private Sub CommandButton1_Click()
On Error Resume Next
Unload AddUFM(1)
End Sub

Private Sub CommandButton1_Click()
On Error Resume Next
Unload AddUFM(2)
End Sub

Private Sub CommandButton1_Click()
On Error Resume Next
Unload AddUFM(3)
End Sub


予断ですが、
Unload UserForm1
とかできないので注意。
Unload Me はできますが。
なんか、実際のUserForm1とは違うみたいな感じ、詳しくは説明できないけど....。
でもこんな感じにすると、各フォームにあるコントロールが取れます。
キャプションの無いものは、エラーになります。
それについてのエラー対応は入れてません。
(On Error Resume Nextで逃げたら良いと思います。)
他サイトで回答した物そのまんまだけど・・・。

Sub kame()
  Dim VBC As Object
  Range("A1").Value = "コントロール名"
  Range("B1").Value = "コントロール種類"
  Range("C1").Value = "キャプション "
  With ThisWorkbook.VBProject
    For Each VBC In .VBComponents
      If VBC.Type = 3 Then
        G = G + 2
        Cells(G, 1).Value = VBC.Name
        Set AdUF = VBA.UserForms.Add(VBC.Name)
        For Each FCN In AdUF.Controls
          G = G + 1
          Cells(G, 1).Value = FCN.Name
          Cells(G, 2).Value = TypeName(FCN)
          On Error Resume Next
          Cells(G, 3).Value = FCN.Caption
          On Error GoTo 0
        Next
      End If
    Next
  End With
  Set AddUF = Nothing
End Sub

【45407】Re:ユーザーフォームを変数名で
発言  Jaka  - 06/12/22(金) 10:21 -

引用なし
パスワード
   何度も書き換えると、ここにアクセスできなくなりそうなので...。

>キャプションの無いものは、エラーになります。
>それについてのエラー対応は入れてません。
>(On Error Resume Nextで逃げたら良いと思います。)
エラートラップしてありました。

追加
        For Each FCN In Aduf.Controls
          G = G + 1
          Cells(G, 1).Value = FCN.Name
          Cells(G, 2).Value = TypeName(FCN)
          On Error Resume Next
          Cells(G, 3).Value = FCN.Caption
          On Error GoTo 0
        Next
        Unload Aduf '←入れたほうが良いかも。

【45411】Re:ユーザーフォームを変数名で
お礼  メカ大好き!  - 06/12/22(金) 13:21 -

引用なし
パスワード
   Blueさん、Jakaさん、Resありがとうございます。

何か私の頭が、かなりこんがらかっていますが、
とにかく、「普通では "UserForm" & (i).Show みたいな書き方は無理だ」
…という事は判りました。VBAって本当に難しいです。
『この場合、名前では無理で、インデックスでのみ可能になる』
…という事も、なんとなく理解できました。

UserForm 上から、何かのオブジェクトを操作する時には…
  Me.Controls("TextBox" & i).Value = "なんたら"
…みたいな書き方をするので、もしかして UserForm にもそういう書き方が
有るのかも知れない…と思ったのですが、違う…という事が判りました。
割り込み質問にも関わらず、丁寧に解説していただきまして、
ありがとうございました。

>>UserForms.Add("UserForm1").Show vbModeless
>>UserForms.Add("UserForm1").Show vbModeless
>>
>>では2つ表示できる。

え?同じ UserForm を、2つ同時に表示ですか?…これは知りませんでした。
やってみます。 ( ^ ^ ; )

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