VLookup関数を使ってラベルに表記させるには?

このQ&Aのポイント
  • コンボボックスから選択した顧客名によってラベルに顧客種別を表記させる方法を教えてください。
  • 顧客名を選択すると、ラベルに選ばれた顧客の顧客種別が表示されるVBAコードを記述しましたが、エラーが発生します。解決策を教えてください。
  • ユーザーフォームのコンボボックスから顧客名を選択し、VLookup関数を使用して選ばれた顧客の顧客種別をラベルに表示したいです。コードの動作を確認してください。
回答を見る
  • ベストアンサー

VLookup関数を使ってラベルに表記させるには?

●質問の主旨 1.コンボボックスから選択した顧客名によって ラベルに顧客種別を表記させるにはどのように コードを書き換えればよいでしょうか? 2.またどの顧客が選ばれても、顧客種別に  対応して表記させるにはコードが足りない  ような気がします。もしそのような対応が  できるコードがあれば、合わせてご教示  ください ●質問の補足 添付の画像のユーザーフォームのコンボボックスから 顧客名を選んで、その顧客名によって別シートの顧客 一覧表から ・「新規顧客」 ・「既存顧客」 ・「自社」 のどれに当たるかVLookup関数を使ってラベルに 表記させたいと考えております。 以下のコードを記述しましたが、 「メソッドまたはメンバが見つかりません」と エラーが返されてしまいます。 ●ユーザーフォームの構成 「顧客名」→Label3 「顧客リスト」→ComboBox1 「顧客種別」→Label4 なお、ユーザーフォームはプリントスクリーンで 貼り付けており、本来はWorksheets(1)に表示されます。 ●コード 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "NPO法人亀山社中" .AddItem "土佐商会株式会社" .AddItem "(株)薩摩示現流" .AddItem "越後屋株式会社" .AddItem "藩校コンサルティング(株)" .AddItem "株式会社ラーニングバー" .AddItem "自社"  End With End Sub '顧客リストが選択された時の顧客種別の表記 Private Sub ComboBox1_Click() Worksheets(2).Activate Label4.Value = Application.WorksheetsFunction.VLookup("B4", Range("B3:C8"), 2, 1) End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

まず、 LabelコントロールにはValueプロパティがありませんから 「メソッドまたはメンバが見つかりません」のコンパイルエラーになります。 VBEditorで[F2]キー、[オブジェクトブラウザ]を開いて <すべてのライブラリ>ではなく [ MSForms ]ライブラリの中から [ Label  ]を検索してみてください。 Label のメンバにどんなものがあるか確認する事ができます。 また、ComboBox1にアイテムを追加する時、 コード内に直値を書き込んでしまうと変動時の修正が大変です。 シートに設定するなら、そこから読み込んだほうが良いです。 どうせ読み込むなら、「顧客種別」も同時に読み込めば、 VLookup関数を使う必要もなくなります。 Private Sub UserForm_Initialize()   Dim r As Range   With Worksheets(2)     'B列基準でデータ範囲を取得     Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp))     'データ範囲以下に無関係な何かが入力してあるなら     'Set r = .Range("C3", .Range("B3").End(xlDown))   End With   With Me.ComboBox1     'Comboを2列設定し2列目は非表示     .ColumnCount = 2     .ColumnWidths = ";0"     'データ範囲 r をまとめてセット     .List = r.Value   End With   Set r = Nothing End Sub Private Sub ComboBox1_Click()   Worksheets(2).Activate   With Me.ComboBox1     'ComboBoxのListの選択行、2列目の値。(Indexは0から始まる)     Me.Label4.Caption = .List(.ListIndex, 1)   End With End Sub

dradra33
質問者

お礼

ご丁寧なご回答ありがとうございます。 ご回答について補足質問がございます。 そちらについてもご確認いただければ 幸いです。

dradra33
質問者

補足

コードの記述及び各コードのご説明ありがとうございます。 上記の通りコードを書き換えると、 顧客名と顧客種別を同時に選択することができました。 ただ Set r = Nothing というコードの存在が良く分かりません。 ネットなどで検索をかけて見ていると、 「フォームの解放処理が行われずに、 メモリ上に残ってしまう現象なのだと 想像できます」 と初心者には分かったようわからないような説明が 書いてあったりします。 end-u様のコードにあてはめて考えてみて、 もしこのコードがないとどんな不都合が生じるのでしょうか? たびたびの質問で恐縮ですが、 ご教示くだされば幸いです ちなみに私が検索したHPのアドレスは 以下の通りです。 http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_11269_1.html

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

フォーム..に限った話ではないです。 が、今回は >もしこのコードがないとどんな不都合が生じるのでしょうか? 不都合は生じません。(と、思われます) この(と、思われます)部分をつっこんで検証しようとすると ちょっと大変かなぁ..という感じです。 Object型変数について。 本来、プロシージャ内の変数はそのプロシージャを抜けると 変数のメモリ参照も解放されるはずなので Set xxx = Nothing は必要ない、..というポリシーの方もいらっしゃるようです。 実経験として、Object型変数で参照したメモリ領域が解放されず、残ってしまうケースもあるようで、 確実に開放したいため、【Object型変数を初期化している】、 ..というポリシーの方もいらっしゃいます。 ポリシーの問題で片付けてはいけないのでしょうけど、 「守破離」の「守」段階であるワタシ的には先人の教えの中で 自分が一番腑に落ちるものを踏襲しているだけですので詳しく説明できるわけではありません。 ただ、実際に Set xxx = Nothing を書いておいたほうが良いケースもあるようで。で、あれば 「このケースは必要ないから書かなくていいや」 「ここ書かないとまずいかな」 なんて頭悩ませながら書くより最初から Set xxx = Object としたら同時に Set xxx = Nothing 書いておく、というコーディングスタイルを取っています。私は。 あとは、いろんな情報を仕入れて判断してみてください。 http://www.excel.studio-kazu.jp/kw/20090303232447.html http://starfleet.txt-nifty.com/blog/2008/02/excel_vba_5749.html

dradra33
質問者

お礼

補足質問にもお答えいただきありがとうございます。 end-u様の紹介HPも参考にさせていただきました。 ただ「Set xxx = Nothing」というコードについての 扱いはいろいろあるようですね。 今の私は初心者なので、 「とりあえず書いてるからかいておこう」 というスタイルにしておきます。 二度にわたるご回答ありがとうございました。

関連するQ&A

  • エクセルVBA コンボボックスの値の転記

    エクセルVBAの質問です。 ユーザーフォームを表示し 年を選択するコンボボックス1 月を選択するコンボボックス2 を入力してもらい ユーザーフォームを閉じるときに sheet1のワークシートのC2セルに 「コンボボックス1の値」+「年」+と「コンボボックス2の値」+「月」をつなげて 入力できるというようなマクロを考えています。 下記の様に考えてみたのですが、 うまく入力できませんでした。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "2021" .AddItem "2022" .AddItem "2023" .AddItem "2024" End With With ComboBox2 .AddItem "1" .AddItem "2" .AddItem "3" .AddItem "4" .AddItem "5" .AddItem "6" .AddItem "7" .AddItem "8" .AddItem "9" .AddItem "10" .AddItem "11" .AddItem "12" End With Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 'ユーザーフォームの値をセルC2に入力 With Worksheets("sheet1") .Cells(2, 3).Value = "ComboBox1.Text" & "月" & "ComboBox2.Text" & "日" End With End Sub どのように修正すればいいでしょうか? よろしくお願いします。

  • EXCEL VBA 多種のコンボボックス操作

    こんばんは。 現在ユーザーフォーム上に10個のコンボボックスを配置しています。 1-8は共通リストを、9と10は別々のリストを表示させたいのですが・・ Private Sub UserForm_Initialize() Dim X, No, Y As Integer With UserForm2 For No = 1 To 8 For X = 0 To 7 .Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next For Y = 0 To 7 .ComboBox9.AddItem Worksheets("Letter").Cells(Y + 1, 11).Value .ComboBox10.AddItem Worksheets("Letter").Cells(Y + 1,12).Value Next End With End Sub 上記のコードですが、エラーが出てどうにも行き詰っています。 Private Sub UserForm_Initialize() Dim X, No As Integer For No = 1 To 8 For X = 0 To 7 UserForm2.Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next End Sub ↑だと1-8まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • コンボボックスにリストが表示されません・・・

    ユーザーフォーム(UserForm)にコンボボックス(ComboBox1)を作ってリストを入れました。 しかしユーザーフォームを実行してもコンボボックスに何もリストが出てきません。 なにが悪いのでしょうか?チュートリアルどおりにやっているのですが・・・(T T) Private Sub UserForm_Initialize() With ComboBox1 .AddItem "東京" .AddItem "名古屋" .AddItem "福岡" End With End Sub Windows2000+Excel2000です。

  • VBA コンボボックスのコード記述位置について

    初心者です。初歩的な質問でお恥ずかしいのですが、コンボボックス用のコードを 記述するには「Private Sub UserForm_Initialize()」の下に記述するしかないのでしょうか。 例えば、縦長のユーザーフォームに上からコンボボックス1、コマンドボタン、コンボボックス2を 配置した場合、コードの記述をコンボボックス1の処理、コマンドボタンの処理、コンボボックス2の処理と、順番通りに記述することは出来るのでしょうか? 現在はこのようにコードを記述しています。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "赤色" .AddItem "青色" .AddItem "黄色" End With With ComboBox2 .AddItem "緑色" .AddItem "黒色" .AddItem "紫色" End With End Sub Private Sub CommandButton1_Click() MsgBox "テスト" End Sub 本当であれば、下記のように順番通りに記述したいです。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "赤色" .AddItem "青色" .AddItem "黄色" End With End Sub Private Sub CommandButton1_Click() MsgBox "テスト" End Sub With ComboBox2 .AddItem "緑色" .AddItem "黒色" .AddItem "紫色" End With End Sub With ComboBox2の上に、必要なコードを記述すればできるのでしょうか。 ご教示下さい。

  • ユーザーフォームをWorkSheet(1)に固定

    ●質問の主旨 WorkSheet(1)(「柴田8月分」)にユーザーフォームを固定的に 表示させつつ、WorkSheet(1)以降のWorkSheet(2)、 WorkSheet(3)、WorkSheet(4)の表を参照しながら ComboBox1、ComboBox2、ComboBox3にリストを 選択して、データベースに入力したいと考えています。 以下のコードをどのように書き換えれば良いでしょうか? ご教示のほどよろしくお願い申し上げます。 ●質問の補足 現在のコードでは、ComboBox1、ComboBox2、ComboBox3を それぞれ選択しているとユーザーフォームがそれぞれ WorkSheet(2)、WorkSheet(1)(顧客リスト)、WorkSheet(3)(社員名)、 WorkSheet(4)(大分類)にとんでしまいます。 転記入力が終了すると、また手作業でWorkSheet(1)に戻らなければなりません。 その手作業を回避したいと考えています。 なお添付画像はComboBox1の選択前なのでWorkSheet(1) に留まってくれています。 ●コード Option Explicit 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() Dim r As Range Dim n As Range Dim d As Range With Worksheets(2) Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox1 .ColumnCount = 2 .ColumnWidths = ";0" .List = r.Value End With With Worksheets(3) Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox2 .ColumnCount = 2 .ColumnWidths = ";0" .List = n.Value End With With Worksheets(4) Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox3 .ColumnCount = 2 .ColumnWidths = ";0" .List = d.Value End With Set r = Nothing Set n = Nothing Set d = Nothing TextBox3.Value = Worksheets(1).Range("A2").Value + 1 txtdate = Date OptionButton1.Value = True End Sub 'ComboBox1をクリックしたときの処理 Private Sub ComboBox1_Click() Worksheets(2).Select With Me.ComboBox1 Me.Label19.Caption = .List(.ListIndex, 1) Worksheets(2).Select Replace:=False End With End Sub 'ComboBox2をクリックしたときの処理 Private Sub ComboBox2_Click() Worksheets(3).Select With Me.ComboBox2 Me.Label20.Caption = .List(.ListIndex, 1) Worksheets(3).Select Replace:=False End With End Sub 'フォームからデータベースへの転記 Private Sub CommandButton3_Click() Dim Rowpos As Long Dim ColPos As Long Rowpos = Worksheets("柴田8月分").Range("a10000").End(xlUp).Row ColPos = 1 Rowpos = Rowpos + 1 With Worksheets("柴田8月分") .Cells(Rowpos, ColPos) = TextBox3.Value .Cells(Rowpos, ColPos + 1) = txtdate.Value .Cells(Rowpos, ColPos + 2) = Label19.Caption .Cells(Rowpos, ColPos + 3) = ComboBox1.Text .Cells(Rowpos, ColPos + 4) = ComboBox2.Text .Cells(Rowpos, ColPos + 5) = Label20.Caption .Cells(Rowpos, ColPos + 6) = ComboBox3.Text End With 'Noの加算 Dim i As Long For i = 1 To 1 Step 1 TextBox3.Value = TextBox3.Value + 1 Next Call Clearcmb End Sub 'データベース入力後にコンボボックスを空欄にする Private Sub Clearcmb() ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" End Sub 'ユーザーフォームの終了 Private Sub CommandButton5_Click() Unload UserForm1 End End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

  • エクセル 複数のComboBoxの連携

    エクセルでフォームを使い、社内各部署での案件の一覧の検索データベースを作成中です。 その際、ComboBoxを3つ使い、1「支店名」2「課名」3「チーム名」を選択するようにしたいのですが、支店により課名やチーム名が異なるため、1で選択した支店名と合致する課やチーム名が選べるようにしたく、以下のようなマクロを組みました。が、実行すると、支店名は表示されるものの、何故か選択できません。また、2つ目(課)の結果から3つ目(チーム名)も得る方法もいまいちよくわかりません。ご教示お願いいたします。 Option Explicit Private Sub ComboBox5_Change() Dim si As Integer With UserForm1 .ComboBox5.Text = "" si = .ComboBox5.ListIndex Select Case si Case 0 .ComboBox6.AddItem "A課" .ComboBox6.AddItem "B課" .ComboBox6.AddItem "C課" 以下必要分続く ’ComboBox6の結果から7を得るには? End Select End With End Sub Private Sub UserForm_Initialize() ' ComboBox がアクティブの時の処理 With UserForm1 .ComboBox5.AddItem "A支店" .ComboBox5.AddItem "B支店" .ComboBox5.AddItem "C支店" .ComboBox6.AddItem "A課" .ComboBox6.AddItem "B課" .ComboBox6.AddItem "C課" .ComboBox7.AddItem "Aチーム" .ComboBox7.AddItem "Bチーム" .ComboBox7.AddItem "Cチーム" End With End Sub

  • Excel:コンボボックスの値をセルにセットする場合

    Excel2000を使っています。 コンボボックスで選択した内容をアクティブなセルに入力するために、以下のようなコードを作成しました。 (ユーザフォームにコンボボックスを1つ作成しています) ------------------------------------------ Private Sub UserForm_Initialize() ComboBox1.ColumnCount = 2 For I = 0 To 10 ComboBox1.AddItem Worksheets("元ネタ").Cells(I + 2,1).Value ComboBox1.List(I, 1) = Worksheets("元ネタ").Cells(I + 2,2).Value Next End Sub ------------------------------------------ Private Sub ComboBox1_Change() Worksheets("入力用").Activate ActiveCell.Value = ComboBox1.Text End Sub ------------------------------------------ このコンボボックスは、2列を表示させています。最後にセルに値を入力すると、今のコードでは1列目の値が入りますが、実際には2列目の値だけを入れたいんです。でもコンボボックスの選択時は、先頭列に1列目の値を表示させたいんです。 どうすれば、2列目の値をアクティブセルに入力できるでしょうか?

  • VLOOKUP関数とテキストボックスの連携

    エクセルでユーザーフォームを作成しています。 「テキストボックス11」に、以下のように、VLOOKUP関数を入れたいのですが、 どのようにしたら良いのか、わかりません。 ●入れたい関数は ISERROR関数とVLOOKUP関数を組み合わせたもの。 =if(iserror(vlookup(「コンボボックス1」の値,マスタ!A80:D90,4,false)),""vlookup(「コンボボックス1」の値,マスタ!A80:D90,4,false)) (1)「コンボボックス1」の値を検索値とする。 (2)参照範囲は「マスタ」シートの「A80:D90」 失敗しているVBAは以下の通りです。 Private Sub UserForm_Initialize() TextBox11.Value = Application.WorksheetFunction.if(iserror(VLookup(ComboBox1.Value, Range("A85:D94"), 4)),"",VLookup(ComboBox1.Value, Range("A85:D94"), 4)) End Sub 教えていただけると助かります。

  • VBA ユーザーフォーム

    こんばんわ。 VBA、ユーザーフォームで、ListBoxか、Comboboxで、セルの値を参照し、そこから1つ選択するようにするにはどういうコードがりますか? Private Sub Userform_Initialize   Listbox1.AddItem "700" Listbox1.AddItem "701"   ・・・・・   ・・・・・   ・・・・・ End Sub と、やると、ListBoxには反映しますが、列が多すぎて、作成するのに手間が掛かる為、例えば、"700" の値に、Sheets(1)のC2から、C500の値を入れるようなコードはありますか? 宜しくお願いします。

  • エクセルVBAユーザーフォームの変数の設定方法について

    すいません、エクセルVBAのユーザーフォームの変数の設定方法について質問があります。 1 ユーザーフォームを2つ用意する。 2 それぞれにComboBox1をおく。 3 立ち上げたユーザーフォームについて、UserForm_InitializeでComboBox1に"a"のAddItemを作る。 この、「立ち上げたフォームのComboBox1に"a"のAddItemを作る」 という作業を各々のユーザーフォームに記載するのではなく、標準モジュールでまとめて記載する方法で躓いています。 Public m As String Private Sub UserForm_Initialize() ’フォーム1を立ち上げた場合   m = "UserForm1"   Call Test1(m) End Sub Private Sub UserForm_Initialize() ’フォーム2を立ち上げた場合   m = "UserForm2"   Call Test1(m) End Sub ↓ 標準モジュールに記載 Sub Test1(m As String) VBA.UserForms.Add(m).ComboBox1.AddItem "a" End Sub これだとUserForm_InitializeとTest1の間で無限ループが始まってしまい、うまく進んでくれません。 ヘルプを見ましたが、Add(変数)でユーザーフォームを変数で指定できるということ以上のことは発見できず行き詰っています。  それぞれのフォームに書けばいいだけの話なのかもしれませんが、メンテを考えると出来ればまとめて記述しておきたいと考えています。 解決方法がありましたらどうぞよろしくご教示願います。

専門家に質問してみよう