Excel VBA質問箱 IV

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

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


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

【37469】同じようなコードをまとめる HIRO 06/5/8(月) 22:01 質問[未読]
【37474】Re:同じようなコードをまとめる ichinose 06/5/9(火) 8:32 発言[未読]
【37477】Re:同じようなコードをまとめる Jaka 06/5/9(火) 11:33 発言[未読]
【37510】Re:同じようなコードをまとめる HIRO 06/5/9(火) 21:35 お礼[未読]
【37507】Re:同じようなコードをまとめる HIRO 06/5/9(火) 21:23 お礼[未読]
【37521】Re:同じようなコードをまとめる ichinose 06/5/9(火) 22:41 発言[未読]
【37534】Re:同じようなコードをまとめる HIRO 06/5/10(水) 20:30 お礼[未読]

【37469】同じようなコードをまとめる
質問  HIRO  - 06/5/8(月) 22:01 -

引用なし
パスワード
   こんにちは、いつもお世話になっております。今回お力になってほしい件は

UserForm UF1、UF2 があり、それぞれのUserFormに同じ名前の
TextBox T1、T2、T3 があります。
UF1、UF2のどちらかが起動しているときに、リストボックスやコンボボックスの
ある別なUserForm(仮にfrmLB)を起動させ、frmLBが閉じるときに(Unload)
選択したリストやコンボボックスの内容をT1、T2、T3 に書き込むようにして
いるのですが、その時のコードに
If UF1.Visible = True Then
 With UF1
   .T1-----
   .T2-----
   .T3-----
 End With
ElseIf UF2.Visible = True Then
 With UF2
   .T1-----
   .T2-----
   .T3-----
 End With
End If
と言うように書いているのですが、With 以下が多くなってくると
同じことを書いているのが多くなるのでまとめることが出来ないかと
思っております。変数を使ってみましたが、上手くできませんでした。
何か良い方法がありませんでしょうか?

【37474】Re:同じようなコードをまとめる
発言  ichinose  - 06/5/9(火) 8:32 -

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


> With UF1
>   .T1-----
>   .T2-----
>   .T3-----
> End With
>と言うように書いているのですが、With 以下が多くなってくると
>同じことを書いているのが多くなるのでまとめることが出来ないかと
>思っております。変数を使ってみましたが、上手くできませんでした。
まず、これ、↑実際にどのように変数を使ってうまくいかなかったのか
記述するようにしてください。
直接のご質問内容に関しては、
frmLBにあるデータを移行するコントロールが10個程度なら、

Dim mycont As Variant

Private Sub UserForm_Initialize()
  mycont = Array(ComboBox1, ComboBox2, ListBox1)
’これは、3個の例ですが、10個でも同様です。

End Sub

'等と配列に格納すれば、

 For idx = 0 To 2
  UF1.Controls("T" & idx + 1).Text = mycont(idx).Text
  Next

こんなコードでよいと思います。
他には、frmLB内のコントロール名の命名を工夫するという方法です。

上記の例の

Combobox1 ---- FCtrl1
Combobox2 ---- FCtrl2
Listbox1 ----- FCtrl3

というオブジェクト名にします。

そうすると、
For idx = 1 To 3
 UF1.Controls("T" & idx).Text = Controls("FCtrl" & idx).Text
 Next

でOKですが・・・。
これは、検討していただくとして・・・。


ご質問を拝見して、

> With 以下が多くなってくると
>同じことを書いているのが多くなるのでまとめることが出来ないかと
>思っております。
これ、With以下だけでなく、場合によっては
UF1、UF2と処理を分けずに記述できそうなんです。
(そうしないと将来、例えばUF3、UF4、UF5なんて出てきた場合、
似たようなコードの記述を繰り返すことになりますよね?)


又、はっきりとは判断できませんが、
そもそもUF1、UF2とユーザーフォームを二つ用意する必要があるのか
という疑問もあります。

状況説明を詳細に記述すれば、
この辺りもすっきりするかもしれませんよ!!

【37477】Re:同じようなコードをまとめる
発言  Jaka  - 06/5/9(火) 11:33 -

引用なし
パスワード
   ichinose さんに付け足し
(今だに決定的な決断力が無く、止められないJaka)

例えば
ユーザーフォーム

Private Sub UserForm_Click()
 Dim FRM As Object
 Call sss(Me)
End Sub

標準モジュール

Sub sss(FRM As Object)
 With FRM
  .TextBox1.Value = 1
  .TextBox2.Value = 2
  .TextBox3.Value = 3
  .TextBox4.Value = 4
 End With
End Sub

【37507】Re:同じようなコードをまとめる
お礼  HIRO  - 06/5/9(火) 21:23 -

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

ichinose さん有り難うございます。

>変数を使ってうまくいかなかったのか
>記述するようにしてください。

変数の使い方が悪く、そのコントロールはサポートしてません
と出てしまいました。

Dim FRM as Variant
If UF1.visible = True Then
FRM = UF1



With FRM
  .T1----
  .T2----

といった感じで、コードはそのままでWithのところを変数にすれば
同じコードを何度も書かずに済むかと思っていましたが、
無理なようでした。

>状況説明を詳細に記述すれば、
>この辺りもすっきりするかもしれませんよ!!

別なシートにデータを入力するときに入力の項目が多少違うので
それぞれのユーザーフォームを用意しました。
しかしながら、その入力項目の内容が同じものである部分を
リストボックスやコンボボックスから選択する点を共通に
しようとしたものです。


売掛→ 品名 単価 数量 販売日
買掛→ 品名 単価 数量 仕入日 支払日 支払先

たとえばカレンダーを起動して日付の入力をしようとするとき
起動しているユーザーフォームに日付が入るようにしたい。
そのように考えた訳です。

>UF1、UF2と処理を分けずに記述できそうなんです。
>(そうしないと将来、例えばUF3、UF4、UF5なんて出てきた場合、
>似たようなコードの記述を繰り返すことになりますよね?)

この点は最初に考えまして、−−−−−−結論はこれ以上
ユーザーフォームを増やさない。−−−だと良いのですが??
その時に対処できるように考え、このような質問をさせていただきました。


丁寧なご回答有り難うございました。

【37510】Re:同じようなコードをまとめる
お礼  HIRO  - 06/5/9(火) 21:35 -

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

Jaka さん 有り難うございます。

呼び出されるSubにユーザーフォームそれぞれの
コードを書かなければいけないような気がして
コードを見ておりました。もう少し検証してみます。

【37521】Re:同じようなコードをまとめる
発言  ichinose  - 06/5/9(火) 22:41 -

引用なし
パスワード
   ▼HIRO さん:
こんばんは。

>
>例
>売掛→ 品名 単価 数量 販売日
>買掛→ 品名 単価 数量 仕入日 支払日 支払先

問題になっているのは、あるユーザーフォームから、
別のユーザーフォームを表示したときのインターフェースだと思います。


極々、簡単な例題を考えましょう。

新規ブックにユーザーフォームをふたつ作成します。

最初のユーザーフォーム
  データ入力用のユーザーフォーム
  ユーザーフォーム名  −−Userform1
      テキストボックス  Textbox1
      コマンドボタン   Commandbutton1

二つ目のユーザーフォーム
  データ選択用のユーザーフォーム
  ユーザーフォーム名  −−Userform2
      コンボボックス   ComboBox1
      コマンドボタン   Commandbutton1


という二つのユーザーフォームを作成してください。
では、コードです。


Useform2のモジュール

'============================================================
Public wtxt As MSForms.TextBox
'↑コンボボックスで選択した内容を反映するテキストボックス
' これがこのUserform2が外部とのI/Oに使用する変数です
' これを
' public Frm as userform
' としてユーザーフォームそのもを変数として設定する方法もありますが、
' そうするとUserfrom2の機能が限定されてしまいます。
' 限定されても使い勝手が良いという場合もありますから、ここは
' よく本来の仕様を検討してください 
'=============================================
Private Sub CommandButton1_Click()
  wtxt.Text = ComboBox1.Text
  Unload Me
End Sub
'=============================================
Private Sub UserForm_Initialize()
  With ComboBox1
    .List() = Array("A商品", "B商品", "C商品", "D商品", "E商品")
    .ListIndex = 0
    End With
End Sub


Usefrom1のモジュール

'===================================================================
Private Sub CommandButton1_Click()
  Load UserForm2
  With UserForm2
    Set .wtxt = TextBox1
    .Show
    End With
End Sub


標準モジュールに

sub main()
  userform1.show
end sub


として、mainを実行して見てください。


Userform1が表示されます。

コマンドボタンをクリックしてください。

Userform2が表示されます。

コンボボックスから、適当な商品を選択し、コマンドボタンをクリックしてください


コンボボックスで選択した内容がUserform1のテキストボックスに
表示されます。


この考え方を実際のプログラムに応用してください。

まずは、試してみてください。

【37534】Re:同じようなコードをまとめる
お礼  HIRO  - 06/5/10(水) 20:30 -

引用なし
パスワード
   ▼ichinose さん:
ichinose さん 大変親切な回答有り難うございます。
Userform3も作って(Userform1と同じコード)
試してみましたが、バッチリです。
このコードを応用させていただき、何とかすっきりしたものに
仕上げたいと思います。
本当に有り難うございました。

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