[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォーム上のコンボボックスから値の取得』(贅沢みかん)
お世話様です。
ある案件別(お客様別)に情報を表示するフォームを作成しており、
フォーム上に、項目別に業者を登録するコンボボックスが複数あります。
担当者が、「この項目は、この業者を使用した」という事をコンボボックス内の
リストから選択して記録している次第です。
クレーム等が生じた場合、
起因する項目の業者に連絡を行うのですが、
現状では、フォーム上で使用業者を確認し、
業者名から別のブック(業者一覧)を見て、
業者の担当・連絡先の情報を入手している為、手間がかかっております。
よって、
コンボボックスの隣に、業者の詳細情報を呼び出すコマンドボタンを設置し、
コマンドボタンから、業者詳細情報が記載された新たなフォームを表示させたいと
考えております。
まず、やりたい事として、
1.コンボボックスの業者名を取得し、業者詳細情報フォーム上にある、
ラベル(業者名)に表示したい。
です。
その後、
2.取得した業者名から業者一覧シート(同ブックに追加作成予定です)にある
業者の情報(住所、TEL等)を取り出して、業者詳細情報フォーム上にある
ラベル(住所、TEL等)に表示したい。
と考えております。
まだ初心者の為、ネットで色々検索しているのですが、
会社のPCであることから、ブロックされて調べられない状況です。
アドバイス等でも構いませんので、どなたかお教え頂ければと思います。
宜しくお願い致します。
< 使用 Excel:Excel2010、使用 OS:WindowsXP >
既に情報を表示したり業者を登録したりすり事は出来ているようなので・・・
1は「コマンドボタンから、業者詳細情報が記載された新たなフォームを表示」
する際に、
Private Sub UserForm_Initialize()
Me.Label1.Caption = UserForm1.ComboBox1.Value End Sub
のようにセットするだけでいいのでは?
2も取得した業者名から検索してユーザーフォーム上に転記するだけで良さそうですけど、
何が分からないのですか?
(ウッシ) 2015/08/24(月) 14:40
こんにちは
コメントありがとうございます。
情報を表示したり登録したりするのは、
ネットで調べたり、お教え頂いたりして完成させております。
(その当時は、ブロックされなかったんです。)
よって、基礎が全く出来てないので、
今回も調べながら且つ、お教えもらいながら作ってる次第です。
ラベルへの表示ですが、お教え頂いた、
Me.Label1.Caption = UserForm1.ComboBox1.Value
で上手く取り出せました!
ありがとうございます!!
それで、過去にお教え頂いて検索方法を合体させて、
よく分からないまま、なんとなくの感じで作ってみました。
一応、上手く動作していますが、無駄や問題点が多々あると思いますので、
お時間あるときにでも、コードの問題点とかないか見て頂けないでしょうか??
Private Sub CB1_Click()
Dim sadr As String
フォーム業者詳細.Label8.Caption = フォーム項目.ComboBox1.Value
Worksheets("Sheet6").Activate
If Not フォーム業者詳細.Label8 = Empty Then
Set tSh = ThisWorkbook.Worksheets("Sheet6") With tSh.Range("A2").CurrentRegion.Offset(1) Set 検索 = Cells.Find(What:=フォーム業者詳細.Label8, LookAt:=xlPart, MatchByte:=False) End With If Not 検索 Is Nothing Then sadr = 検索.Address Do 検索.Select フォーム業者詳細.Label9 = Cells(ActiveCell.Row, 3).Value フォーム業者詳細.Label10 = Cells(ActiveCell.Row, 4).Value フォーム業者詳細.Label12 = Cells(ActiveCell.Row, 2).Value フォーム業者詳細.Label13 = Cells(ActiveCell.Row, 5).Value フォーム業者詳細.Label14 = Cells(ActiveCell.Row, 7).Value フォーム業者詳細.Label15 = Cells(ActiveCell.Row, 6).Value フォーム業者詳細.Label16 = Cells(ActiveCell.Row, 8).Value Set tSh = ThisWorkbook.Worksheets("Sheet6") With tSh.Range("A2").CurrentRegion.Offset(1) Set 検索 = Cells.FindNext(検索) End With If sadr = 検索.Address Then Exit Do End If Find = Find + 1 Loop While Find <= Count
フォーム業者詳細.Show
Else MsgBox "業者登録されていません。" End If End If Worksheets("Sheet1").Select End Sub
(贅沢みかん) 2015/08/24(月) 17:40
QAを詳細に読んでいないのですべっているかもしれませんが。
1.このコードが書かれたユーザーフォームはフォーム項目だと思いますが、ちょっとコードが煩雑ですね。 フォーム業者詳細を短めにわかりやすい変数に格納してその変数名.Control名という記述がすっきりするかも。 あるいは With でくくって参照するとか。
2.With tSh.Range("A2").CurrentRegion.Offset(1) これが2か所に登場していますが、Withでくくったにもかかわらず その参照がないですね。Cells.Find や Cells.FindNext というコードでは、アクティブシート(つまりSheet6)のすべてのセルが検索対象になりますよ。
3.実際の検索領域はどこでしょうか?
tSh.Range("A2").CurrentRegion この記述が気になります。シートのセルの記入状況が、(贅沢みかん)さんの思惑通りならいいのですが。
4.このコードが実行される時点で、フォーム業者詳細はメモリー内にあるというか表示された状況なんだろうと思いますが このコードの下のほうで、フォーム業者詳細.Show がある意味がよくわかりません。 (Hideされた状態というならわかります)
★いずれにしても シート.Select (あるいは、シート.Activate)を記述して、アクティブシートを前提にしたコードは あまり感心しません。 ましてや、あるコードは、アクティブシートを前提にしたもの、あるコードは tSh. とシート修飾したコードというのが 混在している状態は、可読性、保守性で問題ありますねぇ。
(β) 2015/08/24(月) 19:38
あといくつか追加コメント。
5.変数の宣言がないものがありますがモジュールレベルで宣言されているのですか? そうでないのなら、変数はすべて宣言しましょう。VBE画面のツール->オプションの編集タブの 「変数の宣言を強制する」にチェックを入れて起きましょう。そうしておけば、モジュールを作成すると 自動的に、先頭に Option Explicit が挿入されますので。
6.ということで変数がどうなっているのかよくわかりませんが count って 何が入っているんでしょね?
7.Find という変数(なんですよね?)、名前が感心しません。特に、Findメソッドを使っているコードで このような変数名の使用は避けましょう。(FIndメソッドを使っていないコードだとしても、感心しません)
8.で、要件がよくわかりませんが、検索領域を Find/FindNextで、次々に検索して、ヒットすればそれを 「同じ場所」にセット? この意味がよくわかりません。一番最後にヒットしたものを抽出したいなら Find-->FindNextのループは、全く必要ないですよね? 具体的には何がしたいのでしょうか?
9.フォーム業者詳細.Label8 が空白じゃなかったら処理ということですが、フォーム業者詳細.Label8 の元ネタは フォーム項目.ComboBox1.Value のようですから、先頭に、フォーム項目.ComboBox1.Valueが空白なら Exit Sub。 これがわかりやすいと思いますが。
(β) 2015/08/24(月) 21:20
突っ込みついでに、もっと教えて下さい!
やりたい事は、簡単に言うと、
コンボボックスに表示されている業者名を、Sheet6から検索して、
詳細情報のフォームのラベルに表示するってことなんです。
動作として、
1.コマンドボタンを押す(コンボボックスに業者名が表示されている状態)
2.詳細情報表示用のフォームが立ち上がる
3.業者名をSheet6から検索する
4.一致業者をラベルに表示する(付随して住所等も表示する)
って感じです!
(贅沢みかん) 2015/08/25(火) 09:01
検索領域は With tSh.Range("A2").CurrentRegion.Offset(1) から推測して A3〜A列データ最終行までにしました。 また Label8.Caption は、コンボボックスの値ではなく、ヒットしたSheet6のA列の値にしてあります。 (検索は xlPart なんですよね?)
Private Sub CB1_Click() Dim msg As String Dim 検索 As Range Dim tSh As Worksheet
If ComboBox1.Value = "" Then msg = "業者が未選択です" Else Set tSh = ThisWorkbook.Worksheets("Sheet6") Set 検索 = tSh.Range("A3", tSh.Range("A" & Rows.Count).End(xlUp)).Find(What:=ComboBox1.Value, LookAt:=xlPart) If 検索 Is Nothing Then msg = "業者登録されていません。" End If
If msg <> "" Then MsgBox msg Exit Sub End If
With フォーム業者詳細 .Label8.Caption = 検索.Value .Label9 = 検索.EntireRow.Range("C1").Value .Label10 = 検索.EntireRow.Range("D1").Value .Label12 = 検索.EntireRow.Range("B1").Value .Label13 = 検索.EntireRow.Range("E1").Value .Label14 = 検索.EntireRow.Range("G1").Value .Label15 = 検索.EntireRow.Range("F1").Value .Label16 = 検索.EntireRow.Range("H1").Value .Show End With
End Sub
(β) 2015/08/25(火) 13:47
教えて貰ったのを見てたら、なんとなく理解は出来るんですが、
自分一人でってなったら混乱して、分けわかんなくなるんですよね。。。
それにしても、キレイなコードありがとうございました。
コードから推測して、A型ですね。
(贅沢みかん) 2015/08/25(火) 14:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.