Excel VBA質問箱 IV

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

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


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

【37606】ユーザーフォームのオブジェクト指定方法 わいわい 06/5/12(金) 20:13 質問[未読]
【37608】Re:ユーザーフォームのオブジェクト指定... neptune 06/5/12(金) 20:45 発言[未読]
【37609】Re:ユーザーフォームのオブジェクト指定方法 ichinose 06/5/12(金) 21:05 発言[未読]
【37636】Re:ユーザーフォームのオブジェクト指定方法 Kein 06/5/13(土) 13:45 発言[未読]
【37667】Re:ユーザーフォームのオブジェクト指定... わいわい 06/5/15(月) 9:35 お礼[未読]

【37606】ユーザーフォームのオブジェクト指定方法
質問  わいわい  - 06/5/12(金) 20:13 -

引用なし
パスワード
   いつも質問に答えて頂き、お世話になっております。
以下に示すようなメインフォーム内のA列のComboBoxA_**を選択すると
その選択内容によって計算X or 計算Y or 計算Zのフォームが開くプログラムを作成しています。

 ┌────────────┐
 │メインフォーム     │  ┌──────┐┌──────┐
 │┌──┐┌──┐┌──┐│  │計算X    ││計算Y    │
 ││A_01││B_01││C_01││  │┌─┐┌─┐││┌─┐┌─┐│
 │└──┘└──┘└──┘│  ││BB││CC││││BB││CC││
 │┌──┐┌──┐┌──┐│  │└─┘└─┘││└─┘└─┘│
 ││A_02││B_02││C_02││  └──────┘└──────┘
 │└──┘└──┘└──┘│  ┌──────┐
       ・         │計算Z    │
       ・         │┌─┐┌─┐│
       ・         ││BB││CC││
 │┌──┐┌──┐┌──┐│  │└─┘└─┘│
 ││A_10││B_10││C_10││  └──────┘ 
 │└──┘└──┘└──┘│ ※実際は計算種類はもっと多いです。
 └────────────┘

各計算フォームを呼び出し計算することは出来たのですが、計算結果をメインフォームに記述する際に上手くいかずに困っています。どなたかお知恵をお貸し下さい。
例えば、A_01で計算Xを選択した場合
UserForm 「計算X」内で
Private Sub Button_OK_Click()
  Unload 計算X
  メインフォーム.B_01 = Format(BB, "#,##0.0")
  メインフォーム.C_01 = Format(CC, "#,##0.0")
End Sub
と記述すれば、動作的には問題のですが、これですとA_01〜A_10の全ての対応を記述しなければなりません。計算種類も多いことから、この出力部を整理したいのです。
UserForm「メインフォーム」内で
Private Sub A_01_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  ComboName = 1
  Call ChangeItem(A_01)
End Sub
Private Sub A_02_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  ComboName = 2
  Call ChangeItem(A_02)
End Sub



Private Sub A_10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  ComboName = 10
  Call ChangeItem(A_10)
End Sub
を記述し、UserForm 「計算X」内で
Private Sub Button_OK_Click()
  Unload 計算X
  Call Calc_Output(ComboName)
End Sub
とする。
標準モジュールに
Public Sub Calc_Output(C_Name)
  With Worksheets("DATA").Cells(1, 1)
    .Offset(C_Name, 0).Value = "計算X"  ←こちらは出来ました。
    .Offset(C_Name, 1).Value = BB
    .Offset(C_Name, 2).Value = CC
  End With

  If C_Name < 10 Then
    Set BB_tmp = "メインフォーム.B_0" & C_Name
  Else
    Set BB_tmp = "メインフォーム.B_" & C_Name
  End If
   If C_Name < 10 Then
    Set CC_tmp Q = "メインフォーム.B_0" & C_Name
  Else
    Set CC_tmp = "メインフォーム.B_" & C_Name
  End If
  BB_tmp = Format(BB, "#,##0.0")
  CC_tmp = Format(CC, "#,##0.0")
End Sub
とすれば、出来るかな?と思ったのですが、ダメでした。
どうか回答宜しくお願いいたします。

【37608】Re:ユーザーフォームのオブジェクト指定...
発言  neptune  - 06/5/12(金) 20:45 -

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

>以下に示すようなメインフォーム内のA列のComboBoxA_**を選択すると
>その選択内容によって計算X or 計算Y or 計算Zのフォームが開くプログラムを作成し
>ています。
ここまでは理解できるようです。

図までを見たところまでで、
質問1.B_01、C_01 などはコンボボックスですか?
    BB,CCなどは何のコントロールですか?

>各計算フォームを呼び出し計算することは出来たのですが、計算結果をメインフォームに記述する際に上手くいかずに困っています。
>Private Sub Button_OK_Click()
質問2.このプロシージャは計算後にクリックするものですね?

>この出力部を整理したいのです。

ChangeItemってどんな処理をしているのですか?

Public Sub Calc_Output(C_Name)
  With Worksheets("DATA").Cells(1, 1)
    .Offset(C_Name, 0).Value = "計算X"  ←こちらは出来ました。
    .Offset(C_Name, 1).Value = BB
    .Offset(C_Name, 2).Value = CC
  End With
のBB,CCってなんですか?

コントロールのイベント処理を纏めるにはクラスを使用したりすることが
多いですが、検討はされましたか?

一応最後まで見ましたけど、どこから「出力部」でしょうか?
見方によると全部だし、Calc_Outputだけがそうも見えるし?

私の理解力が不足しているのかもしれません^ ^;;

【37609】Re:ユーザーフォームのオブジェクト指定...
発言  ichinose  - 06/5/12(金) 21:05 -

引用なし
パスワード
   こんばんは。
いくつも問題がありそうですが、

>例えば、A_01で計算Xを選択した場合
>UserForm 「計算X」内で
>Private Sub Button_OK_Click()
>  Unload 計算X
>  メインフォーム.B_01 = Format(BB, "#,##0.0")
>  メインフォーム.C_01 = Format(CC, "#,##0.0")
>End Sub
>と記述すれば、動作的には問題のですが、これですとA_01〜A_10の全ての対応を記述しなければなりません。計算種類も多いことから、この出力部を整理したいのです。
この問題ですが、

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=37469;id=excel

ここに同じようなご質問がありました。
参考にして下さい。

メインフォームと計算Xというふたつユーザーフォーム
二つのユーザーフォ−ムは、出来る限り独立したオブジェクトとして
作成することを考えましょう!!

上記のコードだと

>  メインフォーム.B_01 = Format(BB, "#,##0.0")

計算Xのモジュール内でメインフォームというオブジェクトの記述がありますよね?
こういう記述をしてしまうと、
出力先が限定されてしまいます。
よって、メインフォームと計算Xという二つのオブジェクトの結合度が
強くなってしまい、汎用性が失われてしまうのです。

リンクしたスレッドで上記のコードより、結合度を弱くしている
コード例を記述していますから、応用してみて下さい。
そうすれば、

>と記述すれば、動作的には問題のですが、これですとA_01〜A_10の全ての対応を記述し
>なければなりません。
この問題は、解決できると思います。

まずは。ここまで、検討してみて下さい。

【37636】Re:ユーザーフォームのオブジェクト指定...
発言  Kein  - 06/5/13(土) 13:45 -

引用なし
パスワード
   よく分からないけど、ナンかたくさんのユーザーフォームを挿入してる
みたいですね・・。メモリの消費量が多くなって、いつかトラブルが
発生しそうな予感がします。マルチページなどを使えば一つにまとめる
ことが出来ますから、検討してみて下さい。使い勝手も良くなると思います。

【37667】Re:ユーザーフォームのオブジェクト指定...
お礼  わいわい  - 06/5/15(月) 9:35 -

引用なし
パスワード
   皆様いつも回答いただきありがとうございます。
私の質問自体は、紹介いただいた
> http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=37469;id=excel
を参考にして
  メイン.Controls("B_" & C_Name).Text = Format(BB, "#,##0.0")
  メイン.Controls("C_" & C_Name).Text = Format(CC, "#,##0.0")
で、実現いたしました。
ただ皆さんからアドバイスのあった
>メインフォームと計算Xというふたつユーザーフォーム
>二つのユーザーフォ−ムは、出来る限り独立したオブジェクトとして
>作成することを考えましょう!!

>よく分からないけど、ナンかたくさんのユーザーフォームを挿入してる
>みたいですね・・。メモリの消費量が多くなって、いつかトラブルが
>発生しそうな予感がします。マルチページなどを使えば一つにまとめる
>ことが出来ますから、検討してみて下さい。使い勝手も良くなると思います。
については、これから上記参考アドレスを熟読して改良していきます。
今後とも宜しくお願いいたします。

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