[[20150824095743]] 『フォーム上のコンボボックスから値の取得』(贅沢みかん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォーム上のコンボボックスから値の取得』(贅沢みかん)

お世話様です。

ある案件別(お客様別)に情報を表示するフォームを作成しており、
フォーム上に、項目別に業者を登録するコンボボックスが複数あります。
担当者が、「この項目は、この業者を使用した」という事をコンボボックス内の
リストから選択して記録している次第です。

クレーム等が生じた場合、
起因する項目の業者に連絡を行うのですが、
現状では、フォーム上で使用業者を確認し、
業者名から別のブック(業者一覧)を見て、
業者の担当・連絡先の情報を入手している為、手間がかかっております。

よって、
コンボボックスの隣に、業者の詳細情報を呼び出すコマンドボタンを設置し、
コマンドボタンから、業者詳細情報が記載された新たなフォームを表示させたいと
考えております。

まず、やりたい事として、
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.