Excel VBA質問箱 IV

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

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


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

【40464】ユーザフォームのチェックボタンについて まっき 06/7/14(金) 11:05 質問[未読]
【40467】Re:ユーザフォームのチェックボタンについて ichinose 06/7/14(金) 11:34 発言[未読]
【40469】Re:ユーザフォームのチェックボタンについて まっき 06/7/14(金) 13:06 質問[未読]
【40471】Re:ユーザフォームのチェックボタンについて ichinose 06/7/14(金) 13:38 発言[未読]
【40472】Re:ユーザフォームのチェックボタンについて ハチ 06/7/14(金) 13:43 発言[未読]
【40476】Re:ユーザフォームのチェックボタンについて まっき 06/7/14(金) 14:22 発言[未読]
【40480】Re:ユーザフォームのチェックボタンについて ハチ 06/7/14(金) 15:30 発言[未読]
【40482】Re:ユーザフォームのチェックボタンについて ichinose 06/7/14(金) 15:43 発言[未読]
【40489】Re:ユーザフォームのチェックボタンについて gako 06/7/14(金) 22:01 質問[未読]
【40499】Re:ユーザフォームのチェックボタンについて ichinose 06/7/15(土) 7:42 発言[未読]

【40464】ユーザフォームのチェックボタンについて
質問  まっき  - 06/7/14(金) 11:05 -

引用なし
パスワード
   教えていただきたいのですが、

ユーザフォーム2にチェックボタンを20個つくり、それぞれに「01〜20」までの
値を代入して、それにチェックを入れ、コマンドボタンで入力すると
ユーザーフォーム1のテキストボックス1に、チェックを入れた値のものだけが
表示されるというのをやりたのですが、どうすればよいのでしょうか?

色々やってみたのですが、うまくいきません。
よろしくおねがいします。

ちなみに、表示の仕方は「01,02,03,・・・」といった感じにしたいです。

【40467】Re:ユーザフォームのチェックボタンについて
発言  ichinose  - 06/7/14(金) 11:34 -

引用なし
パスワード
   ▼まっき さん:
こんにちは。

>教えていただきたいのですが、
>
>ユーザフォーム2にチェックボタンを20個つくり、それぞれに「01〜20」までの
>値を代入して、それにチェックを入れ、コマンドボタンで入力すると
>ユーザーフォーム1のテキストボックス1に、チェックを入れた値のものだけが
>表示されるというのをやりたのですが、どうすればよいのでしょうか?
このユーザーフォーム1とユーザーフォーム2の関係
(ユーザーフォーム1から、ユーザーフォーム2を呼び出しているとか、
 ふたつともモードレスで表示しているとか)も記述してください。


>
>色々やってみたのですが、うまくいきません。
できたら、こんなコードにしたけど駄目だった例も記述してください。
まっき さんが記述したことも全て情報になりますから・・・。


ユーザフォーム2(Userform2)のモジュールに

'===================================
Private Sub CommandButton1_Click()
  Dim chkstr() As String
  Dim cnt As Long
  cnt = 0
  Dim idx As Long
  For idx = 1 To 20
    If Controls("checkbox" & Format(idx, "00")).Value Then
     'チェックボックスのコントロール名は
     ' checkbox01とかcheckbox02・・・・checkbox20に設定されていると
     ' とします
     ReDim Preserve chkstr(1 To cnt + 1)
     chkstr(cnt + 1) = Format(idx, "00")
     cnt = cnt + 1
     End If
    Next
  If cnt > 0 Then
    UserForm1.TextBox1.Text = Join(chkstr(), ",")
'ユーザフォーム1は、オブジェクト名がUserform1だとします
    End If
  Erase chkstr()
End Sub

試してみてください。

【40469】Re:ユーザフォームのチェックボタンについて
質問  まっき  - 06/7/14(金) 13:06 -

引用なし
パスワード
   ▼ichinose さん:
>▼まっき さん:
>こんにちは。
>
>>教えていただきたいのですが、
>>
>>ユーザフォーム2にチェックボタンを20個つくり、それぞれに「01〜20」までの
>>値を代入して、それにチェックを入れ、コマンドボタンで入力すると
>>ユーザーフォーム1のテキストボックス1に、チェックを入れた値のものだけが
>>表示されるというのをやりたのですが、どうすればよいのでしょうか?
>このユーザーフォーム1とユーザーフォーム2の関係
>(ユーザーフォーム1から、ユーザーフォーム2を呼び出しているとか、
> ふたつともモードレスで表示しているとか)も記述してください。
>
>
>>
>>色々やってみたのですが、うまくいきません。
>できたら、こんなコードにしたけど駄目だった例も記述してください。
>まっき さんが記述したことも全て情報になりますから・・・。
>
>
>ユーザフォーム2(Userform2)のモジュールに
>
>'===================================
>Private Sub CommandButton1_Click()
>  Dim chkstr() As String
>  Dim cnt As Long
>  cnt = 0
>  Dim idx As Long
>  For idx = 1 To 20
>    If Controls("checkbox" & Format(idx, "00")).Value Then
>     'チェックボックスのコントロール名は
>     ' checkbox01とかcheckbox02・・・・checkbox20に設定されていると
>     ' とします
>     ReDim Preserve chkstr(1 To cnt + 1)
>     chkstr(cnt + 1) = Format(idx, "00")
>     cnt = cnt + 1
>     End If
>    Next
>  If cnt > 0 Then
>    UserForm1.TextBox1.Text = Join(chkstr(), ",")
>'ユーザフォーム1は、オブジェクト名がUserform1だとします
>    End If
>  Erase chkstr()
>End Sub
>
>試してみてください。

ご返事ありがとうございます。でも、
If Controls("checkbox" & Format(idx, "00")).Value Thenの部分で
「オブジェクトが見つかりません」とエラーがでます。

チェックボックスの名前もちゃんと合っています。

【40471】Re:ユーザフォームのチェックボタンについて
発言  ichinose  - 06/7/14(金) 13:38 -

引用なし
パスワード
   >
>ご返事ありがとうございます。でも、
>If Controls("checkbox" & Format(idx, "00")).Value Thenの部分で
>「オブジェクトが見つかりません」とエラーがでます。

チェックボックスのオブジェクト名が
「checkbox01」ではない
としか言えません。

既定の名前はcheckbox1と01ではないですが、
このあたりは問題ないですか?

又は、全角と半角などの確認もしてみて下さい。
それでも確認が出来ない場合は、

試しにUserform2にボタンをもう一つ作って

Private Sub CommandButton2_Click()
  Dim ctrl As msforms.Control
  For Each ctrl In Controls
    If UCase(TypeName(ctrl)) = UCase("Checkbox") Then
     Debug.Print ctrl.name
     End If
    Next
End Sub

上記のコードの実行で

イミディエイトウインドウに表示された結果を

見せてください

【40472】Re:ユーザフォームのチェックボタンについて
発言  ハチ  - 06/7/14(金) 13:43 -

引用なし
パスワード
   ▼まっき さん:
>ご返事ありがとうございます。でも、
>If Controls("checkbox" & Format(idx, "00")).Value Thenの部分で
>「オブジェクトが見つかりません」とエラーがでます。
>
>チェックボックスの名前もちゃんと合っています。

横から失礼します。
Controls("checkbox" → Checkbox となっているのではないですか?

UserForm2チェックボックス全部が
対象ならこんな感じでもできると思います。
コマンドボタンはForm1とForm2どっちにあるのでしょうか?


'UserForm2モジュール
Option Explicit

Private Sub UserForm_Initialize()

Dim Obj As Object
Dim i As Integer

i = 1
For Each Obj In Me.Controls
  If TypeName(Obj) = "CheckBox" Then
    Obj.Tag = Format(i, "00")
    i = i + 1
  End If
Next Obj

End Sub


'コマンドボタンのあるFormモジュールへ
Private Sub CommandButton1_Click()

Dim Str As String
Dim Obj As Object

For Each Obj In UserForm2.Controls
  If TypeName(Obj) = "CheckBox" Then
    If Obj.Value = True Then
      Str = Str & "," & Obj.Tag
    End If
  End If
Next Obj

UserForm1.TextBox1.Value = Mid(Str, 2)

End Sub

【40476】Re:ユーザフォームのチェックボタンについて
発言  まっき  - 06/7/14(金) 14:22 -

引用なし
パスワード
   ▼ハチ さん:
>▼まっき さん:
>>ご返事ありがとうございます。でも、
>>If Controls("checkbox" & Format(idx, "00")).Value Thenの部分で
>>「オブジェクトが見つかりません」とエラーがでます。
>>
>>チェックボックスの名前もちゃんと合っています。
>
>横から失礼します。
>Controls("checkbox" → Checkbox となっているのではないですか?
>
>UserForm2チェックボックス全部が
>対象ならこんな感じでもできると思います。
>コマンドボタンはForm1とForm2どっちにあるのでしょうか?
>
>
>'UserForm2モジュール
>Option Explicit
>
>Private Sub UserForm_Initialize()
>
>Dim Obj As Object
>Dim i As Integer
>
>i = 1
>For Each Obj In Me.Controls
>  If TypeName(Obj) = "CheckBox" Then
>    Obj.Tag = Format(i, "00")
>    i = i + 1
>  End If
>Next Obj
>
>End Sub
>
>
>'コマンドボタンのあるFormモジュールへ
>Private Sub CommandButton1_Click()
>
>Dim Str As String
>Dim Obj As Object
>
>For Each Obj In UserForm2.Controls
>  If TypeName(Obj) = "CheckBox" Then
>    If Obj.Value = True Then
>      Str = Str & "," & Obj.Tag
>    End If
>  End If
>Next Obj
>
>UserForm1.TextBox1.Value = Mid(Str, 2)
>
>End Sub

ありがとうございます。
コマンドボタンは2のほうにあります。
ちなみに、文字間違いは確認いたしましたがないです。

【40480】Re:ユーザフォームのチェックボタンについて
発言  ハチ  - 06/7/14(金) 15:30 -

引用なし
パスワード
   ▼まっき さん:
>ちなみに、文字間違いは確認いたしましたがないです。

オブシェクト名とCaptionを混同しているとか?
どちらにしても、ichinoseさんのコードを実行してみれば
答えはハッキリすると思います。

>コマンドボタンは2のほうにあります。

では、さっき書いたコードをすべてUserForm2に入れると、
チェックボックスの個数、オブジェクト名に関係なく
処理できるように作った(つもり)です。

【40482】Re:ユーザフォームのチェックボタンについて
発言  ichinose  - 06/7/14(金) 15:43 -

引用なし
パスワード
   一応、

Private Sub CommandButton1_Click()
  Dim chkstr() As String
  Dim cnt As Long
  cnt = 0
  Dim idx As Long
  For idx = 1 To 20
    If Controls("checkbox" & idx).Value Then
     'チェックボックスのコントロール名は
     ' checkbox01とかcheckbox02・・・・checkbox20に設定されていると
     ' とします
     ReDim Preserve chkstr(1 To cnt + 1)
     chkstr(cnt + 1) = Format(idx, "00")
     cnt = cnt + 1
     End If
    Next
  If cnt > 0 Then
    UserForm1.TextBox1.Text = Join(chkstr(), ",")
'ユーザフォーム1は、オブジェクト名がUserform1だとします
    End If
  Erase chkstr()
End Sub

に変更しても試してみてください。

気が付いたのはこんなところかな!!

【40489】Re:ユーザフォームのチェックボタンについて
質問  gako  - 06/7/14(金) 22:01 -

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

質問させていただいてもよろしいでしょうか。
UserForm2を出すための「UserForm1.Show」のコードを入れる
必要は無いのでしょうか。
Form1が出ないので、

>    UserForm1.TextBox1.Text = Join(chkstr(), ",")
>'ユーザフォーム1は、オブジェクト名がUserform1だとします

の部分をUserForm2に変更するとTextBox1に反応が表示されました。
UserForm1に表示させるにはどのようにすると良いのでしょうか。

【40499】Re:ユーザフォームのチェックボタンについて
発言  ichinose  - 06/7/15(土) 7:42 -

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

>質問させていただいてもよろしいでしょうか。
>UserForm2を出すための「UserForm1.Show」のコードを入れる
>必要は無いのでしょうか。

[#40467] にも少し記述しましたが、このご質問には、

Userform1とUserform2の関係が明確に記述されていません。
ちょっと考えると、

1 モーダルモードでUserform1から、何かのタイミングでUserform2が呼び出される
(Showメソッドが使われる)場合

2 逆にgako さんが仰られているようにモーダルモードでUserform2から、何かのタイミングでUserform1が呼び出される(Showメソッドが使われる)場合

3 メインプロシジャーからモーダレスモードでUserform1,Userform2が表示される場合

Userform1とuserform2の関係によって、今回の事例ではわずかですが、
それでもコードの記述を変えなければならない箇所が出てきます。
今回私が提示したUserform2のコマンドボタンのクリックイベントプロシジャーは
予めUserform1は表示されているという想定でのコードです。

gako さんは上記の「2」のような想定をされていたのでしょうね?

この質問を読んだ人によって想定が様々ですよね?

だからこそ、Userform1とUserform2の関係をこの質問を読んだ人が
少しでも同一の想定ができるような記述が必要なんです。


上記の「2」を想定して考えると、

Userform2のモジュールに

'=============================================
Private Sub CommandButton1_Click()
  Dim chkstr() As String
  Dim cnt As Long
  cnt = 0
  Dim idx As Long
  For idx = 1 To 20
    If Controls("checkbox" & idx).Value Then
     'チェックボックスのコントロール名は
     ' checkbox1とかcheckbox2・・・・checkbox20に設定されていると
     ' とします
     ReDim Preserve chkstr(1 To cnt + 1)
     chkstr(cnt + 1) = Format(idx, "00")
     cnt = cnt + 1
     End If
    Next
  If cnt > 0 Then
    With UserForm1
     .TextBox1.Text = Join(chkstr(), ",")
     .Show
     End With
    End If
  Erase chkstr()
End Sub


こんなコードでUserform1は、表示されます。

尚、Userform1には、Textbox1のみ配置で

Userform1には、Initializeイベントが記述されていないものとします。

確認してみて下さい。

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