リストボックスの選択行を、シート上の行数で取得するExcelVBA

リストボックスの選択行を、シート上の行数で取得するExcelVBA

Excelのシートに書いてあるリストをリストボックス内に表示して、そこで選択したアイテムの、Excelシート上での行数を取得するというVBAです。日本語難しい。伝わりますかね…?リストボックスの中身が毎回変わる場合によく使うのでまとめてみました。


リストボックスをつくる

120420-1

ユーザーフォームを作って、その中にリストボックスを作ります。ユーザーフォームの作り方はこちらの記事を参考にどうぞ。

120420-2

ExcelBookのSheet1にこんな感じのものを作ります。これがリストボックスの中身になります。

120420-3

後で使う「処理」ボタンも付けてみました。では肝心のリストボックスを選択して、プロパティを見てみます。

120420-4

赤枠の中を変えてみます。ColmunWidthはホントは50で設定したんですが、勝手に変わっちゃうっぽいです。

  • ColumnCount・・・リストボックスに表示する列の数
  • ColumnHeads・・・見出しの有無。RowSourceの直前の行が使われる
  • ColumnWidth・・・列幅。複数の場合は“;”で区切る
  • RowSource・・・リストボックスの中身
120420-5

プロパティを設定すると、こんな感じに!

120420-6

デフォルトだとリストボックスはひとつしか選択できないので、複数選択が必要な場合はこちらの項目をMultiSelectに変えておきましょう。

起動のためのコード

120420-7

処理ボタンを押した時に動くプログラムを先に設定してしまいます。ボタンをダブルクリックして、出てきたUserForm1のコードに

と記述して、Module1のほうに

こう記述します。(中身は後で書きます。)ボタンを押すと、Module1の処理に飛ぶという流れです。

ところで、ExcelVBAはプロシージャ名や変数名などに日本語を使うことができます。プログラムといえば半角英数が基本ですが、昔と違ってそうエラーが起こるものでもない、そして可読性が良いという面から、私としては(規模が小さい、限られた人しか使わない、などの場面に限って)「有り」じゃないかなと思っています。

ただし、別の言語でプログラムを組みたいとか、不特定多数の人が使う、関わるものは多数の人が「常識」と思える形のほうが受け入れやすいのは確かです。

120420-8

ExcelBookのほうには、ボタンを押したらUserForm1が表示できるボタンを作ります。詳しくはこちらの記事もどうぞ。

フォームを表示させる前に、RowSorceをデータのあるところだけに再設定すると、リストの中身が変わっても、空白を読み込まずに無駄なスクロールバーを出さずに済みます。

選択されている位置を取得するコード

やっと本題です。長くてすみません。さっき作った“処理”のコードの中身を書きます。

1行だけならrowsはintegerでいいんですが、複数の場合を想定してStringで宣言しています。リストボックス上での0行目はシート上での3行目に当たるので、i+3 が行数になります。

動作

選択なし

120420-9 120420-10

1行選択

120420-11 120420-12

リストボック内では3つめですが、Excelのシート上では5行目です。

複数選択

120420-13 120420-14

行さえ分かれば、Cells(row,○)とかで他の値は簡単に指定できますね!

データベースなどからExcelにデータを抽出して、それをフォームで選択してまた処理をする、なんてときにリスト内の位置じゃなくてシート上での位置が欲しいんだよ!と思って作りました。どなたかのお役に立てれば幸いです。

公開日:2012/04/20

2件のコメント

  1. iichoy より:

    初心者です。
    欲しいと思っていたコードだったのでとても助かりました。有難うございます。

    • *you より:

      iichoyさん、コメントありがとうございます! こんな昔の記事でもお役に立てるなんて書いておいてよかったですー!!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)