エクセルVBA リストビュー選択項目を別フォームへ

このQ&Aのポイント
  • エクセル2013のVBA初心者ですが、リストビューで選択した項目を別のユーザーフォームに反映させる方法が分かりません。
  • リストビューの情報がネット上にも少なく、正しいコードがわからないため困っています。
  • Userform1上のListview1で選択した項目の駅名・顧客名・店舗名をUserform2のTextbox1・Textbox2・Textbox3に反映させたいです。どなたかヒントをいただけますか?
回答を見る
  • ベストアンサー

エクセルVBA リストビュー選択項目を別フォームへ

皆さんこんにちは。 エクセル2013使用のVBA初心者です。 エクセルVBAのリストビューについて教えてください。 Userform1上にListview1とコマンドボタン1があります。 Listview1はSheet1を呼び込んだものが反映されており 左から駅名・顧客名・店舗名が記載されています。 Listview1でどれかを選択してコマンドボタン1を押したら Listview1で選択した項目の 駅名をUserform2のTextbox1に 顧客名を〃のTextbox2に 店舗名を〃のTextbox3に反映したいのですが リストビューの情報がネット上にも少なく コードをどのように書いたら良いか見当がつきません。 Userform2のPrivate Sub UserForm_Initialize()に TextBox1 = UserForm1.ListView1.FocusedItem.SubItems(0).Text を記載してみたものの、コンパイルエラーが出てしまいます。 (スイマセン、あまり意味が分かっていないで書きました) リストビューで選択した項目を別のユーザーフォームに 反映させるにはどうしたら良いでしょうか? どなたかヒントをいただけると助かります。

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

  • ベストアンサー
回答No.1

こんにちは。 > Listview1はSheet1を呼び込んだものが反映されており > 左から駅名・顧客名・店舗名が記載されています。 > Listview1でどれかを選択してコマンドボタン1を押したら > Listview1で選択した項目の > 駅名をUserform2のTextbox1に > 顧客名を〃のTextbox2に > 店舗名を〃のTextbox3に反映したいのですが こんな感じのこと? ' ' /// Private Sub CommandButton1_Click()   With Me.ListView1.SelectedItem     UserForm2.TextBox1.Value = .Text     UserForm2.TextBox2.Value = .SubItems(1)     UserForm2.TextBox3.Value = .SubItems(2)   End With '  UserForm2.Show vbModeless End Sub ' ' /// UserForm_Initialize に書く場合は、   Me を UserForm1 に   UserForm2. を 省く だけで要領は一緒です。 ただ、以上は、行ラベルが[駅名]である場合の話で、 [駅名]:[顧客名][店舗名]のような配置を想定しています。 説明にはないけれど、もしも、行ラベルが他にあって、 [行ラベル]:[駅名][顧客名][店舗名]のような配置である、という場合は、 ' ' /// Private Sub CommandButton1_Click()   With Me.ListView1.SelectedItem     UserForm2.TextBox1.Value = .SubItems(1)     UserForm2.TextBox2.Value = .SubItems(2)     UserForm2.TextBox3.Value = .SubItems(3)   End With '  UserForm2.Show vbModeless End Sub ' ' /// というようなことなのかも知れません。 その違いを判断する情報がなくて回答が付き難かったのかも知れませんが、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10144671605 知恵袋の方では[施主]:[駅][店舗]という配置だったりもして、 尚更混乱してしまいました。 リンク先のコードを例に(以下、リンク先より引用・抜粋)   With ListView1     .ColumnHeaders.Add , "施主", Sheet1.Range("B2").Value, 120     .ColumnHeaders.Add , "駅", Sheet1.Range("A2").Value, 50     .ColumnHeaders.Add , "店舗", Sheet1.Range("C2").Value, 80     For i = 2 To LastRow       With .ListItems.Add         .Text = Sheets("検索").Cells(i, 2).Text ' ★1         .SubItems(1) = Sheets("検索").Cells(i, 1).Text ' ★2         .SubItems(2) = Sheets("検索").Cells(i, 3).Text ' ★3       End With     Next   End With (以上、リンク先より引用・抜粋)   ★1の記述の左辺に対応して     ListView1.SelectedItem.Text   ★2の記述の左辺に対応して     ListView1.SelectedItem.SubItems(1)   ★3の記述の左辺に対応して     ListView1.SelectedItem.SubItems(2) のように、実際のリスト設定の記述を参照するようにすれば、 迷うことなく、求めるプロパティが取得できるのではないでしょうか。 蛇足ですが、一応、この手の質問では、   実際の記述を見た人  か   開発者本人 にしか判らない情報については、 質問を読んだ人が状況を再現できる程度に、はっきり示せるよう、 これから質問する際には留意してみてください。 尚、当方のメインの開発環境(xl2010 x64 = 64ビットエクセル)では、 common controls(mscomctl.ocx) は標準的に使用不可です。 ProgressBar, TreeView, ListView, ,,, 等を扱う場合は、 使えない環境もあるということを意識しておいた方が好いでしょう。 とりあえず、以上です。 補足があれば、書いてみて下さい。 環境を用意するのに時間が掛かるので、短時間での返信は難しいですが、 不足があれば、なるべく、お応えします。

harumama0430
質問者

お礼

realbeatinさん 相変わらず質問がダメダメでお手数をおかけし申し訳ありませんでした。 Userform2を開いた時にUserform1のリストビューでの選択情報を 読み込んでくる・・というのをやりたかったのですが Userform1のPrivate Sub CommandButton1_Click()にて Userform1を閉じてUserform2を開く、をやってしまっていたので UserForm_Initializeで何とかやるしかない、 でもUserform1は閉じちゃってるし・・・と延々と悩んでいました。 Private Sub CommandButton1_Click()に [行ラベル]:[駅名][顧客名][店舗名]のような配置である、という場合の方の やり方を記載してやりたい動作が出来ました。 言葉足らずの質問でここまで読み解いて回答していただき感謝しています。 自分のやりたい事は決まっているのに 何をやれば良いのか、何が分からないか分からない・・・ こんな状態で藁にもすがる思いで質問してしまいましたが もしまた行き詰って質問する場合がございましたら もっと分かりやすい質問が書けるように気を付けます。 この度は本当にありがとうございました。

関連するQ&A

  • EXCEL VBA リストビューの項目編集

    質問させさせていただきます。 EXCEL VBAで、フォーム上にEcxelシートのような表形式のコントロールを貼り付けて、編集したいと考えています。 調べたら、見た目はリストビューが良かったのですが、2列目以降が選択できないとの事なので、 他にグリッド系コントロール(無料)で良いものがあったら教えていただきたいと思います。 また、リストビューを使った場合でも、何か案があれば助言いただきたいと思います。 リストビューに期待しただけに、ショックは大きいです・・・

  • リストビューの項目の追加と選択されている項目

    ソースから動的にリストビューの項目の追加方法 またそのうち選択されているもの(複数選択は行わない)が変わった時に どの項目が選択されているか取得する方法の2つが知りたいのですが。 加えてコンボボックスの項目をソースから動的に追加する方法を教えていただけると嬉しいです。

  • リストビューで罫線を表示

    リストビューで罫線を表示させるにはどうしたら良いのでしょうか?Excelのような表を表示したいのですが。 あと、同じリストで特定の項目だけを色を変えたいのですが、ListView_GetItemRect、ListView_GetSubItemRectで項目ごとの範囲を取得、その範囲を塗りつぶすようにしているのですが、上手く変わってくれません。 教えてください。よろしくお願いします。

  • Excel VBA ある値が入力されたときだけユーザーフォームを出したいです

    ExcelのVBAを教えてください。 D15は、リストで入力する値を選択できるようになっています。 D15で選択された値によって、B15に反映されるようになっています。 たとえば、 D15の値をリストで105を選んだら、B15に「AAA」と入り、 D15の値をリストで109を選んだら、B15に「ccc」と入ります。 これらは、B15にIF関数が入っていて制御されています。 ところが、D15の値をリストで108と選んだ時だけ、B15に「BBB」と入る場合と「DDD」と入る場合の2パターンあり、これは人間の判断でどちらにするか考えるので、IF関数を使えません。 なので、 D15のリストボックスで108を選んだときだけ、 ユーザーフォームを出し(UserForm1.Show)、ユーザーフォームにBBBとDDDのコマンドボタンがあって、Tabでコマンドを選択し、Enterで確定し(マウスは使いたくない)、確定したコマンドの値をB15に反映させるようにしようと思いました。 ・・・が、ユーザーフォームを出すタイミングのVBAの組み方がわかりません。 D15の値をリストから選択する・・・というのは、他の方が作った仕組みなので変えることはできません。

  • エクセル VB: フォーム内のリストボックスの項目

    エクセルVBなのですが、フォームをつくってその中にリストボックスを配置しました。 コマンドボタンで呼び出して、シート内にあるリストから項目を抽出し反復を省略したリストを フォーム内のリストボックスに作りたいのですが。 Private Sub CommandButton1_Click() UserForm1.Show (このあとリスト項目のコード) End Sub コマンドボタンをクリックすると、UserForm1が現れますが、リストの中身は空です。一度Unload meでフォームを終わらせて、2回目クリックするとリストの中身が現れます。 一回目のクリックでエラーは出ません。 一回目のクリックでリストを配置したいのですが、何が問題なんでしょうか? Excel2003 Windows Xp です。 よろしくご教示下さい。

  • エクセルVBAのAutoFilterについて

    はじめまして。今回初めてエクセルVBAに挑戦していますが、行き詰まってしまいました。 エクセルで顧客管理データベースを作っています。シートの一番上の行に、ID、顧客名、依頼内容、依頼日、処理終了日・・・・などデータベースでいう「フィールド名」を入力し、2行目以下に顧客データを打ち込む形です。 当社では週一回会議で、前の週の新規顧客名の一覧と前の週に処理終了した顧客名の一覧をリストにして配りますが、エクセルVBAを使ってそのリストを作るプログラムを作ろうと試みました。  まず、UserFormを用いて、抽出したい期間(何年何月何日から何年何月何日)をそれぞれTextBox1、TextBox2の値で所得します。そして、開始年月日をDateFromという変数に代入、終了年月日をDateToという変数に代入し、AutoFilterで検索して別シートにコピーするという流れです。  前置きが長くなりましたが、質問です。 1 この変数の定義、つまり DateFrom = UserForm1.TextBox1.value という文で所得しようと思いますが、うまくいきません。書式がおかしいのでしょうか? 2 AutoFilterの使い方を「新しいマクロの記録」を使って見てみると Selection.AutoFilter Field:=10 _ , Criteria1:=">=2004/4/27", Operator:=xlAnd _ , Criteria2:="<=2004/5/10" というかたちになるようですが、>=2004/4/27の部分を変数を使って指定するには、書式はどのようにしたらいいのでしょうか。このまま>=DateFromの形ではうまくいかないようです。

  • エクセル vba userform について

    現在USERFORMを使用してますが、つまずいています。 たとえば、TEXTBOX1がブランクならばコマンドボタンにフォーカス?をもっていきたいのです。 IF TEXTBOX1="" THEN コマンドボタン1.SETFOCUS ELSE TEXTBOX2.SETFOCUS END IF のような形にしてますが、うまくいきません コマンドボタンを押すとシートにそれぞれ反映されるように作成はできております。 余計なタブ操作をしたくありません。 よろしくお願いします

  • エクセルVBA UserFormで選択リスト

    VBAは多少はかじりましたが、UserFormを使うのは初めてです。これまではDialogSheetでやってました。 しかし今回は、DialogSheetでは大分類小分類に分けたリストはできそうもないのでUserFormならマルチページ機能があるのでなんとかなるのではと思いました。 やりたいことは約千種類あるデータを、まず大分類のカテゴリーに10区分し、マルチページとします。 大分類の各ページをさらにマルチページで小区分し、各5区分とします。都合10*5で50ページとなります。 小区分の各ページにそれぞれリストボックスを配置し、エクセルシートのデータリストからデータを表示し、エクセル使用者が選択できるようにします。 こんなことはマルチページで可能でしょうか?それともタブストリップですか? 参考となるコードなどもご教示いただけると幸いです。 よろしくお願いします。

  • ユーザフォーム上のVLookUp関数について教えていただきたいのですが。

    UserForm1にTextBox1とTexrBox2があり、 TextBox1に顧客コードを入力すると、勝手にTextBox2に顧客名が入るということがしたいのです。引っ張ってくるデータは実際UserForm1を実行するbook1のアクティブシートではなく、別のbook2.sheets("顧客リスト")から反映させたいのですが、可能でしょうか。TextBoxでなく、Labelでないと不可能なんでしょうか。 検索値=TextBox1.Value 検索範囲=Workbooks("顧客情報").Sheets("顧客リスト").Range("A:B") 列番号=2 計算方法=False といったかんじなのですが、どうかよろしくお願いいたします。

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

専門家に質問してみよう