過去ログ

                                Page     498
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼オプションボタンの選択結果  みんと 02/11/7(木) 11:36
   ┗Re:オプションボタンの選択結果  Nakamura 02/11/7(木) 12:57
      ┗Re:オプションボタンの選択結果  みんと 02/11/7(木) 16:47
         ┗Re:オプションボタンの選択結果  Nakamura 02/11/8(金) 1:07
            ┗Re:オプションボタンの選択結果  みんと 02/11/8(金) 15:34
               ┗Re:オプションボタンの選択結果  Nakamura 02/11/8(金) 23:51
                  ┗ばかちんでした。  みんと 02/11/9(土) 0:27
                     ┗すごく遅くなりましたが・・・  みんと 03/1/4(土) 15:59

 ───────────────────────────────────────
 ■題名 : オプションボタンの選択結果
 ■名前 : みんと
 ■日付 : 02/11/7(木) 11:36
 -------------------------------------------------------------------------
   またまたお世話になりま〜す!
今回はコーディング以前の問題で,そもそも考え方からして分からないとゆー絶望的な
状況っす。
どなたかアドバイスをよろしくです。
1. ユーザーフォーム上のオプションボタンの選択結果をワークシートに反映する
  方法。
2. ワークシート上のデータを,ユーザーフォームに反映する方法。


詳しい状況を説明します。(すみません,長くなりました。)

<<やろうとしていること>>
(1) ワークシートへのデータ入力には「必ず」ユーザーフォームを使う。
(2) ユーザーフォームは複数あって,それぞれにコンボボックスとオプションボタン
   がある。(下の例を参照してください。)
(3) それぞれのユーザーフォームでオプションボタンはそれぞれ2つのグループ
  (フレーム)にグループ分けされている。
(4) ユーザーフォームに入力されたデータは,ワークシートの任意の場所に格納
   される。(シート上の位置は必ずしも連続していません。)
(5) データの入力が終了した時,ユーザーフォームはいったん非表示になる。
   (ユーザーフォームを閉じるとデータがワークシートに格納される。)
(6) データの再入力・修正をする場合,ユーザーフォームを開く。
(7) (6)のとき,既に入力されているデータがユーザーフォームに反映されている。

ユーザーフォームと格納場所の「例」としてはこんな感じになります。
 UserForm1
   ComboBox1                ->>A5にデータを格納
   Frame1[OptionButton1, OptionButton2] ->>B6にデータを格納
   Frame2[OptionButton3, OptionButton4] ->>D3にデータを格納
 UserForm2
   ComboBox2                ->>A6にデータを格納
   Frame3[OptionButton5, OptionButton6] ->>B8にデータを格納
   Frame4[OptionButton7, OptionButton8] ->>C3にデータを格納

<<わからないこと>>
分からないのは,(4)と(7)のところなんです。
(4)では,コンボボックスの入力結果は素直にワークシートの該当箇所に格納できそう
なんですが,オプションボタンの選択結果の取り扱いがよく分かりません。
たとえば,「有り」「無し」のボタンのいずれかの選択結果がワークシート上の一つの
セルに反映される・・・というような場合です。

(7)では,コンボボックスへはユーザーフォームを開くたびに該当セルから値を
読み込めばいいのかな?と思ってますが,オプションボタンはいったいどーすれば!?
といった感じです。


実際は,ユーザーフォームはマルチページだったりして,もっとたくさんあります。
当然,コンボボックスもさらにたくさんあるし,オプションボタンも二択だけでなく
三択以上の場合もあります。
たくさんあるコンボボックスにいちいちデータを読み込むってのもイマイチ頭が悪い気
がしてますが,いまのところそれしか方法が思いついていません。
それどころか,オプションボタンの選択結果を反映する方法については途方に暮れて
います。

VBAでここまで出来るのかどうか分かりませんが,どーなんでしょ?
全体的にもっとスッキリした考え方などあれば,あわせてお願いします。
長い質問になりましたが,よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:オプションボタンの選択結果  ■名前 : Nakamura  ■日付 : 02/11/7(木) 12:57  -------------------------------------------------------------------------
   こんにちは

オプションボタンが選択されているかどうかは
Valueプロパティで判ります。
こんな感じで使います。

If OptionButton1.Value = True then

 MsgBox "オプションボタン1が選択されています。"

End If

コンボボックスの入力先が決まっているなら、プロパティで
ControlSourceを設定するか、コードで書くならこんな感じ

ComboBox1.ControlSource = "A1"

オプションボタンが多い場合には、こんな感じ

Sub test()

  Dim i As Integer

  For i = 1 To 6

    If Me.Controls("OptionButton" & i).Value = True Then

      Exit For

    End If

  Next i

  If i = 7 Then Exit Sub

  MsgBox "選択されているのはOptionButton" & i & "です"

End Sub

それでは
 ───────────────────────────────────────  ■題名 : Re:オプションボタンの選択結果  ■名前 : みんと  ■日付 : 02/11/7(木) 16:47  -------------------------------------------------------------------------
   ▼Nakamura さん:
コメントありがとうございます。

でも,オプションボタンが必ずしも番号順にはなっていない場合の方が多いんですけど・・・。(i_i)
とりあえず,オプションボタンの取り扱いは次のように考えています。
まずは,考え方だけですけど。(笑)

(1) フレーム毎(グループ毎)にオプションボタンをチェック
(2) Trueのときにそのボタンのcaptionを取得
(3) 取得したcaptionをワークシートの任意のセルに格納
(4) (1)〜(3)をフレーム毎に繰り返す

そうすると,セル(ワークシート)の内容をユーザーフォームに反映する場合には,上の逆になりますよね。

(1) 該当するセルのvalueを取得
(2) 該当するオプションボタンのグループから(1)とcaptionが同じものを探す
(3) (2)でヒットしたオプションボタンをTrueにする
(4)  (1)〜(3)を項目数(フレーム毎)だけ繰り返す

こーゆーのって,(まるっきし想像ですけど)クラスモジュールとかを使うと,きっとスッキリするんですよね。たぶん。(笑)


コンボボックスの方は,ちょっと説明が下手だったかもしれません。m_(. .)_m
考えているのはこういうことです。
(1) コンボボックスのソースをコードで設定しておきます。
(2) コンボボックスには最初,デフォルトの値が表示されています。
   例:バナナが表示されている。(普通は空欄ですよね)
(3) コンボボックスで項目を選択します。
   例:バナナ→リンゴに変更
(4) いったんユーザーフォームを閉じます。
(5) コンボボックスで選択された結果はワークシートに格納されます。
   例:リンゴがsheet1のA1に格納される。
(6) 次にユーザーフォームを開いたときに,(3)で選択された結果がコンボボックスのデフォルトで選択されています。
   例:リンゴが表示されている。
     なんらかの方法でA1を参照して,コンボボックスのデフォルトにしたい。
     もちろん空欄の場合もあるということで。

自分でも整理できていなかったかもしれませんが,つまるところはコンボボックスのデフォルト設定の話なのかもしれません・・・。(汗)

という訳で,引き続きよろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:オプションボタンの選択結果  ■名前 : Nakamura  ■日付 : 02/11/8(金) 1:07  -------------------------------------------------------------------------
   こんばんは

クラスモジュールについては、かじった程度なので何とも言えませんが、
コントロールオブジェクトを配列として扱ってのイベント処理に便利だと認識しています。
この場合に当てはまるかは疑問です。

こんな方法で良いのではないでしょうか

コマンドボタンを押した時とすると

Private Sub CommandButton1_Click()

  Dim ctl As MSForms.Control

  For Each ctl In Me.Frame1.Controls

    If TypeOf ctl Is MSForms.OptionButton And ctl.Value Then
    
      Worksheets("Sheet1").Range("A1").Value = ctl.Name
      
    End If
    
  Next

End Sub


Private Sub UserForm_Activate()

  Dim ctl As MSForms.Control

  For Each ctl In Me.Frame1.Controls

    If TypeOf ctl Is MSForms.OptionButton And _
       ctl.Name = Worksheets("Sheet1").Range("A1").Value Then
    
       ctl.Value = True
      
    End If
    
  Next

End Sub

コンボボックスについては
まさに、その通りの結果になると思うのですが?
別シートのセルにしたいなら

ComboBox1.ControlSource = "Sheet1!A1"

別のブックのセルなら

ComboBox1.ControlSource = "[Book1.XLS]Sheet1!A1"

と記述します。

プロパティに設定するなら
(編集時にコンボボックスを選択状態で右クリックして出てくる項目のプロパティ)
ControlSourceの項目に "Sheet1!A1" か "[Book1.XLS]Sheet1!A1"
と設定して下さい。

それでは
 ───────────────────────────────────────  ■題名 : Re:オプションボタンの選択結果  ■名前 : みんと  ■日付 : 02/11/8(金) 15:34  -------------------------------------------------------------------------
   ▼Nakamura さん:
コメントありがとうございます。

オプションボタンの方は,もちっと研究してトライしてみますです。
ん〜,難しいっす。>クラスモジュール
まだよく理解できてません。
もう少し研究してから,また質問させていただきたいと思います。(汗)

コンボボックスの方ですが,コメントの方法だと,ソースが固定
されてしまいませんか?
あくまで「バナナ,リンゴ,ミカン,メロン」といったリストは
残しておきたいのですが。
その上で,デフォルト表示をワークシートと連動させたいのです。
たとえば,
最初にユーザーフォームを開いたとき
  コンボボックスの表示:空欄 => バナナを選択
  コンボボックスの表示はバナナ変わる
  ユーザーフォームを閉じる
2回目にユーザーフォームを開いたとき
  コンボボックスの表示:バナナを表示 => メロンを選択
  コンボボックスの表示はメロン変わる
  ユーザーフォームを閉じる
3回目にユーザーフォームを開いたとき
  コンボボックスの表示:メロンを表示
てな具合なんですが。
もちろんフォームを閉じる度にコンボボックスで選択した結果を
ワークシートに反映します。
やっぱし,説明が下手なのかしらん?(涙)
 ───────────────────────────────────────  ■題名 : Re:オプションボタンの選択結果  ■名前 : Nakamura  ■日付 : 02/11/8(金) 23:51  -------------------------------------------------------------------------
   こんばんは

先ず、前レスのコンボボックスのコードもしくは、プロパティを設定して
実行して頂けたのでしょうか?
ControlSourceプロパティはコンボボックスのリストに影響を及ぼす物では有りません。設定したワークシートのセルと連動させる為の物です。

>その上で,デフォルト表示をワークシートと連動させたいのです。

はこの設定で良いはずですが・・・

Private Sub UserForm_Activate()

  ComboBox1.ControlSource = "A1"
  
End Sub
または
Private Sub UserForm_Initialize()

  ComboBox1.ControlSource = "A1"

End Sub

とすれば
1 ユーザーフォームを開く
2 セルA1が空欄ならコンボボックスの表示は空欄
3 バナナを選択
4 コンボボックスからフォーカスが外れるとセルA1にバナナが入る
5 ユーザーフォームを閉じる
6 セルA1はバナナのまま
7 ユーザーフォームを開く
8 コンボボックスの表示はバナナ
9 メロンを選択
10 コンボボックスからフォーカスが外れるとセルA1にメロンが入る
11 ユーザーフォームを閉じる
12 セルA1はメロンのまま
13 ここでセルA1にキィウイと入力してみる。
14 ユーザーフォームを開く
15 コンボボックスの表示はキィウイ
16 リストは「バナナ,リンゴ,ミカン,メロン」のまま

上記の様に、ControlSourceプロパティを設定すると
セル、コンボボックスいずれを変えても、反映されますし、リストの
内容が変わる事は有りません。
注意点はコンボボックスのStyleプロパティをfmStyleDropDownListに設定していると
セルとコンボボックスの内容が一致していないとエラーとなります。

それでは
 ───────────────────────────────────────  ■題名 : ばかちんでした。  ■名前 : みんと  ■日付 : 02/11/9(土) 0:27  -------------------------------------------------------------------------
   ▼Nakamura さん:

なんか,すんごいカンチガイ野郎だったみたいっす・・・。
オレってば。(滝汗)
ControlSourceとRowSourceをカンペキ勘違いしてました。
お許しくださいまし〜〜〜〜。m_(. .)_m
アドバイス通りで,思った通りの結果になりました。
むちゃむちゃカンタンなことだったんすね。
何度も,何度もすみませんです。ホント。
めっちゃ,感謝ですっ!!!

でも,分かってみると,悩んでたのがアホみたいっす。>オレ(自爆)

あ,クラスモジュールは引き続き研究中っす。
でわっ!
 ───────────────────────────────────────  ■題名 : すごく遅くなりましたが・・・  ■名前 : みんと  ■日付 : 03/1/4(土) 15:59  -------------------------------------------------------------------------
   ▼Nakamura さん:
むちゃくちゃ遅くなってしまいましたが,お礼のカキコです。
去年のうちにカキコするつもりが,年を越してしまいました。
すいませんです。

最終的には,なんとかなったようです。
結局,クラスモジュールを使いました。
(ちとゴーインでしょうか?)

いろいろアドバイスをいただき,ありがとうございました。

コードは長くなっちゃったので,コピペするのは
やめにしました。(笑)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 498