Excel VBA質問箱 IV

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

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


5942 / 13645 ツリー ←次へ | 前へ→

【48035】マルチページについて トムコ 07/4/1(日) 2:27 質問[未読]
【48041】Re:マルチページについて りん 07/4/1(日) 10:46 発言[未読]
【48045】Re:マルチページについて トムコ 07/4/1(日) 13:46 お礼[未読]
【48046】Re:マルチページについて りん 07/4/1(日) 14:10 回答[未読]
【48047】Re:マルチページについて トムコ 07/4/1(日) 15:02 お礼[未読]
【48048】Re:マルチページについて りん 07/4/1(日) 18:11 回答[未読]
【48052】Re:マルチページについて トムコ 07/4/1(日) 21:02 お礼[未読]
【48053】Re:マルチページについて りん 07/4/1(日) 21:34 発言[未読]
【48066】Re:マルチページについて トムコ 07/4/2(月) 17:51 お礼[未読]

【48035】マルチページについて
質問  トムコ  - 07/4/1(日) 2:27 -

引用なし
パスワード
   よろしくお願いします。
受講者の出席状況をユーザーフォームを使って入力しようとしています。
C列に受講者氏名(100名分)、D列からAT列までは開講講座回数があります。
ユーザーフォーム上にリストボックス、コマンドボタン、マルチページがあります。
・リストボックスはC列の受講者氏名が表示されています。
・マルチページは開講講座の内容により、5ページ用意しています。
・マルチページ上にフレームを貼りその中にオプションボタンを配置しています。
・オプションボタンは開講講座回数分あります。
・オプションボタンにチェックを入れ、リストボックスから受講者を選択して
 コマンドボタンを押すと一覧表の該当するセルに○が付くようになっています。

Private Sub CommandButton1_Click()
'################################################日曜
If OpB1.Value = True Then  'オプションボタン1にチェックがあるとき
  ST = 1: ReT = 4     ’シート1、列Dを選択 
ElseIf OpB2.Value = True Then
  ST = 1: ReT = 7
ElseIf OpB3.Value = True Then
  ST = 1: ReT = 10
ElseIf OpB4.Value = True Then
  ST = 1: ReT = 13
ElseIf OpB5.Value = True Then
  ST = 1: ReT = 16
ElseIf OpB6.Value = True Then
  ST = 1: ReT = 19
ElseIf OpB7.Value = True Then
  ST = 1: ReT = 22
ElseIf OpB8.Value = True Then
  ST = 1: ReT = 25
ElseIf OpB9.Value = True Then
  ST = 1: ReT = 28
       ・
       ・
       ・
End If
  記録 ’
End Sub

というようにしているのですが、ページ1ではうまくセルに○が付くのですが、
ページが変わると実行しません。
マルチページに関するマクロは

Private Sub UserForm_Initialize()
MultiPage1.Value = 0
Hn = 1
End Sub

これだけです。
自分の力量ではどうしてもわかりません。
どうか、よろしくお願いします。

【48041】Re:マルチページについて
発言  りん E-MAIL  - 07/4/1(日) 10:46 -

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


>If OpB1.Value = True Then  'オプションボタン1にチェックがあるとき
>  ST = 1: ReT = 4     ’シート1、列Dを選択 
>ElseIf OpB2.Value = True Then
>  ST = 1: ReT = 7
>ElseIf OpB3.Value = True Then
>  ST = 1: ReT = 10
>ElseIf OpB4.Value = True Then
>  ST = 1: ReT = 13
>ElseIf OpB5.Value = True Then
>  ST = 1: ReT = 16
>ElseIf OpB6.Value = True Then
>  ST = 1: ReT = 19
>ElseIf OpB7.Value = True Then
>  ST = 1: ReT = 22
>ElseIf OpB8.Value = True Then
>  ST = 1: ReT = 25
>ElseIf OpB9.Value = True Then
>  ST = 1: ReT = 28
>       ・
>       ・
>       ・
>End If
>  記録 ’
>End Sub
↑この分岐方法だと、ページ1でチェックが入っているものがあるとそれ以外のページでチェックが入っても無効になります(OpのNoの若いものが常に有効)。

そのフォームにCommandButton2を置いて以下のマクロを記述し、適当にチェックをつけた後にクリックしてみてください。
Private Sub CommandButton2_Click()
  Dim obj As Object
  For Each obj In Me.Controls
   If TypeName(obj) = "OptionButton" Then
     MsgBox obj.Value & vbCrLf & obj.Parent.Name, vbInformation, obj.Name
   End If
  Next
End Sub

ページ1〜5まであるとして、
 ・5つとも選ぶ(最大5つ○が入る)
 ・現在表示されているページのものだけ有効(○は一つ)
どちらでしょうか?

5つとも選ぶ場合は、上記のようにループでチェックの入ったものを取得し○、1つだけなら、Parent.Nameでページ位置を判定してそこに○・・・という漢字でしょうか。

【48045】Re:マルチページについて
お礼  トムコ  - 07/4/1(日) 13:46 -

引用なし
パスワード
   りんさん、早速の回答ありがとうございます。

>↑この分岐方法だと、ページ1でチェックが入っているものがあるとそれ以外のページでチェックが入っても無効になります(OpのNoの若いものが常に有効)。

ページが変わってもチェックは外れないのですね。
りんさんの回答で疑問が解けました。

>そのフォームにCommandButton2を置いて以下のマクロを記述し、適当にチェックをつけた後にクリックしてみてください。
>Private Sub CommandButton2_Click()
>  Dim obj As Object
>  For Each obj In Me.Controls
>   If TypeName(obj) = "OptionButton" Then
>     MsgBox obj.Value & vbCrLf & obj.Parent.Name, vbInformation, obj.Name
>   End If
>  Next
>End Sub
>
>ページ1〜5まであるとして、
> ・5つとも選ぶ(最大5つ○が入る)
> ・現在表示されているページのものだけ有効(○は一つ)
>どちらでしょうか?

現在表示されているページのものだけ有効で○は一つと考えていますが、
まとめて数回分の出席を入力したい場合に、ページがまたがってしまう事があるのです。
このときに、今の分岐方法ではダメなのだということはわかりました。

前のページのチェックをはずす方法は無いのでしょうか?

上記のマクロを実行しましたが、メッセージボックスにチェックが入っていると
”True”が出ます。

>5つとも選ぶ場合は、上記のようにループでチェックの入ったものを取得し○、1つだけなら、Parent.Nameでページ位置を判定してそこに○・・・という漢字でしょうか。

1つだけなら、Parent.Nameでページ位置を判定してそこに○というようにするには、
どのようにマクロを組んだらよいのでしょうか?

ここまでくると自分の力量ではどうしたらよいのかわかりません。
どうかアドバイスをお願いします。

【48046】Re:マルチページについて
回答  りん E-MAIL  - 07/4/1(日) 14:10 -

引用なし
パスワード
   トムコ さん、こんにちわ。

>1つだけなら、Parent.Nameでページ位置を判定してそこに○というようにするには、
>どのようにマクロを組んだらよいのでしょうか?

前回のマクロをちょっと変えて。
Private Sub CommandButton2_Click()
  Dim obj As Object
  Dim PP(0 To 5) As String
  '
  For Each obj In Me.Controls
   Select Case UCase(TypeName(obj))
     Case "MULTIPAGE"
      NN% = obj.Value
     Case "OPTIONBUTTON"
      'Trueの時は配列に確保
      If obj.Value = True Then
        PP(obj.Parent.Index) = obj.Name
      End If
   End Select
  Next
  '結果表示(チェックされたものが無ければ空白が返ります)
  MsgBox PP(NN%), vbInformation, "該当ページのチェックされたオプション"
  Erase PP
End Sub
こんな感じです。

【48047】Re:マルチページについて
お礼  トムコ  - 07/4/1(日) 15:02 -

引用なし
パスワード
   りんさん、早速の回答ありがとうございます。

>前回のマクロをちょっと変えて。
>Private Sub CommandButton2_Click()
>  Dim obj As Object
>  Dim PP(0 To 5) As String
>  '
>  For Each obj In Me.Controls
>   Select Case UCase(TypeName(obj))
>     Case "MULTIPAGE"
>      NN% = obj.Value
>     Case "OPTIONBUTTON"
>      'Trueの時は配列に確保
>      If obj.Value = True Then
>        PP(obj.Parent.Index) = obj.Name
>      End If
>   End Select
>  Next
>  '結果表示(チェックされたものが無ければ空白が返ります)
>  MsgBox PP(NN%), vbInformation, "該当ページのチェックされたオプション"
>  Erase PP
>End Sub
>こんな感じです。

上記のマクロに変えてみました。
メッセージボックスに該当ページのチェックされたオプションボタンの番号が表示されるようになりました。

上記のマクロに、○を記入するマクロを組み込めばよいのでしょうか?
たびたびの質問で恐縮です。

【48048】Re:マルチページについて
回答  りん E-MAIL  - 07/4/1(日) 18:11 -

引用なし
パスワード
   トムコ さん、こんばんわ。

>上記のマクロに、○を記入するマクロを組み込めばよいのでしょうか?
If   OpB1.Value = True Then
  ST = 1: ReT = 4
ElseIf OpB2.Value = True Then
  ST = 1: ReT = 7
ElseIf OpB3.Value = True Then
  ST = 1: ReT = 10
       ・
       ・
       ・

○を記入するマクロが「記録」と考えて、最初の分岐を組み込んで有効だったら記録をCallします。
また、オプションボタンのオブジェクト名がOpB*で、列番号が3つおきのようなので、オブジェクト名から列番号を計算しています。

Private Sub CommandButton2_Click()
  Dim obj As Object
  Dim PP(0 To 5) As String
  '
  For Each obj In Me.Controls
   Select Case UCase(TypeName(obj))
     Case "MULTIPAGE"
      NN% = obj.Value
     Case "OPTIONBUTTON"
      'Trueの時は配列に確保
      If obj.Value = True Then
        PP(obj.Parent.Index) = obj.Name
      End If
   End Select
  Next
  '結果表示(チェックされたものが無ければ空白が返ります)
  If PP(NN%) = "" Then
   MsgBox "チェックを入れてからクリックしてね", vbExclamation
  Else
   '列番号計算
   Ret = Val(Replace(UCase(PP(NN%)), "OPB", "")) * 3 + 1
   St = 1 'これは分岐しなくていいのかな?
   If Ret > 1 Then
     MsgBox Ret, vbInformation, PP(NN%) 'Retの計算結果
     '
     記録 '記録をよぶならここ
   Else
     MsgBox PP(NN%), vbExclamation, "オブジェクト名確認"
   End If
  End If
  Erase PP
End Sub

こんな感じです。

【48052】Re:マルチページについて
お礼  トムコ  - 07/4/1(日) 21:02 -

引用なし
パスワード
   りんさんたびたびのご回答ありがとうございます。

りんさんの考えていただいたマクロを使わせていただいたところ、ページが変わっても
○を記入することができるようになりました。
大変感謝しております。

ただ、一つだけ問題がありまして、これは、私の最初の質問で説明が足りなかったのですが、列が単純に並んでいないのです。

ST1 ’前期
第1回 第2回・・・第9回   特別講習    試験   補習
日月火 日月火・・・日月火 12345678 1234 1234

ST2 ' 後期
第1回 第2回・・・第9回   特別講習    試験   補習
日月火 日月火・・・日月火 12345678 1234 12345

オプションボタン

  ページ1      ページ2    ページ3   ページ4  ページ5
   前期        後期      特別講習    試験    補習
 日  月  火    日  月  火   前  後   前  後
OpB1 OpB10 OpB19 OpB44       OpB28    OpB40    OpB36
OpB2 OpB11 OpB20  ・       OpB29    OpB41    OpB37前
 ・ ・  ・   ・        ・     OpB42    OpB38期
 ・ ・  ・             ・     OpB43    OpB39分
OpB9 OpB18 OpB27          OpB35          OpB79後
                                OpB80期
                                 ・
見にくいですが、このように単純には並んでいないのです。

>また、オプションボタンのオブジェクト名がOpB*で、列番号が3つおきのようなので、オブジェクト名から列番号を計算しています。
>
>   '列番号計算
>   Ret = Val(Replace(UCase(PP(NN%)), "OPB", "")) * 3 + 1
>   St = 1 'これは分岐しなくていいのかな?
>   If Ret > 1 Then
>     MsgBox Ret, vbInformation, PP(NN%) 'Retの計算結果
>     '

↑このりんさんに考えていただいたマクロでは対応できませんでした。
複雑にしてしまった私が悪いのでしょうが、このように複雑に並んだ場合の対処法は
どのようにしたらよいのでしょうか?
何かお知恵を拝借したいのですが。
再三のお願いで大変恐縮ですがよろしくおねがいします。

【48053】Re:マルチページについて
発言  りん E-MAIL  - 07/4/1(日) 21:34 -

引用なし
パスワード
   トムコ さん、こんばんわ。

>ただ、一つだけ問題がありまして、これは、私の最初の質問で説明が足りなかったのですが、列が単純に並んでいないのです。
>どのようにしたらよいのでしょうか?

パターンがよくわからないので、列とシートの分岐を元のコードを修正して使いましょう。
トムコさんの元のコードのIf文を、以下のようなSelectCase文に直していってください。オブジェクト名を””ではさんでください。また、エラー回避の為に大文字で比較しているので、全部大文字で書いてください。

途中からですが==========
  '結果表示(チェックされたものが無ければ空白が返ります)
  If PP(NN%) = "" Then
   MsgBox "チェックを入れてからクリックしてね", vbExclamation
  Else
   '列番号分岐
   Select Case UCase(PP(NN%))
     Case "OPB1": ST = 1: ReT = 4
     Csse "OPB2": ST = 1: ReT = 7
     Case "OPB3": ST = 1: ReT = 10
     Case "OPB4": ST = 1: ReT = 13
          ・
     (ボタンの数だけ分岐を付ける)
          ・
    Case Else
     ST = 0: ReT = 0
   End Select
   '
   If St = 0 then
     MsgBox PP(NN%), vbExclamation, "オブジェクト名確認"
   Else
     記録 '記録をよぶならここ
   Else
  End If
  Erase PP
End Sub

ボタンのならびによっては纏められそうな気もしますが、とりあえず。

【48066】Re:マルチページについて
お礼  トムコ  - 07/4/2(月) 17:51 -

引用なし
パスワード
   りんさん、こんばんは。

大変お世話になりました。


>ボタンのならびによっては纏められそうな気もしますが、とりあえず。

↑ボタンの並びを変えて、マクロも短くすることができました。
ちゃんと実行されるとうれしいものですね。
もっと勉強しなければ!

これからもよろしくお願いします。

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