こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル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
を記載してみたものの、コンパイルエラーが出てしまいます。
(スイマセン、あまり意味が分かっていないで書きました)

リストビューで選択した項目を別のユーザーフォームに
反映させるにはどうしたら良いでしょうか?
どなたかヒントをいただけると助かります。

投稿日時 - 2015-05-07 16:50:24

QNo.8970695

困ってます

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

こんにちは。

> 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, ,,, 等を扱う場合は、
使えない環境もあるということを意識しておいた方が好いでしょう。

とりあえず、以上です。
補足があれば、書いてみて下さい。
環境を用意するのに時間が掛かるので、短時間での返信は難しいですが、
不足があれば、なるべく、お応えします。

投稿日時 - 2015-05-10 16:11:19

お礼

realbeatinさん

相変わらず質問がダメダメでお手数をおかけし申し訳ありませんでした。

Userform2を開いた時にUserform1のリストビューでの選択情報を
読み込んでくる・・というのをやりたかったのですが
Userform1のPrivate Sub CommandButton1_Click()にて
Userform1を閉じてUserform2を開く、をやってしまっていたので
UserForm_Initializeで何とかやるしかない、
でもUserform1は閉じちゃってるし・・・と延々と悩んでいました。

Private Sub CommandButton1_Click()に
[行ラベル]:[駅名][顧客名][店舗名]のような配置である、という場合の方の
やり方を記載してやりたい動作が出来ました。

言葉足らずの質問でここまで読み解いて回答していただき感謝しています。
自分のやりたい事は決まっているのに
何をやれば良いのか、何が分からないか分からない・・・
こんな状態で藁にもすがる思いで質問してしまいましたが
もしまた行き詰って質問する場合がございましたら
もっと分かりやすい質問が書けるように気を付けます。

この度は本当にありがとうございました。

投稿日時 - 2015-05-11 09:22:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問