none
コンボボックスを使用して範囲選択 RRS feed

  • 質問

  • vb超初心者です。どなたかご教授お願いいたします!

    年代   事項 

    1世紀  漢から金印が贈られる

    3世紀  邪馬台国

    5世紀  倭の五王

     

    上のような、レコードが135個あります。

    二つのコンボボックスを使用して、年代フィールドの範囲選択をしたいのですが、どうしても、二つのコンボボックスが連動してしまって、範囲選択ができません。

    ◎◎年~○○年を選択 のように、二つのコンボボックスを使用して、範囲選択するにはどうすればいいのでしょうか?

     

    2007年1月24日 18:50

回答

  • おっしゃることがかなり意味不明なので聞きたいのですが、2 つのコンボボックスが配置され、コンボボックスで選択した範囲でテーブルのデータを抽出したいということですか?
    それと 2 つのコンボボックスが連動してしまってというところの意味が全く意味不明です。

    再現できるコードを提示してもらえますか?

    2007年1月24日 21:11
  • たぶん、同じBindingSourceをデータソースに指定しているからだと思います。それぞれのコンボボックスに、それぞれ違うBindingSourceを割り当てて下さい。
    2007年1月25日 0:54
    モデレータ
  • 一つのWindowsフォームの中で、同じデータテーブルを共有する全てのコントロールは、全て連動して動きます。詳しくは、CurrencyManagerを調べてみて下さい。この場合、中身は全く同じであるMainTable2を作って、

      ComboBox1.DataSource = MainTable
        ComboBox1.DisplayMember =
    "名前"
      ComboBox2.DataSource = MainTable2
        ComboBox2.DisplayMember =
    "名前"

    のようにしてあげれば良いでしょう。

    2007年1月26日 0:45
    モデレータ
  • VBからExcelのシートにアクセスし、範囲を選択したいということでしょうか? get_Rangeで検索してみて下さい。

    #違う話題は別スレッドに分けましょう。

    2007年1月28日 7:03
    モデレータ

すべての返信

  • おっしゃることがかなり意味不明なので聞きたいのですが、2 つのコンボボックスが配置され、コンボボックスで選択した範囲でテーブルのデータを抽出したいということですか?
    それと 2 つのコンボボックスが連動してしまってというところの意味が全く意味不明です。

    再現できるコードを提示してもらえますか?

    2007年1月24日 21:11
  • たぶん、同じBindingSourceをデータソースに指定しているからだと思います。それぞれのコンボボックスに、それぞれ違うBindingSourceを割り当てて下さい。
    2007年1月25日 0:54
    モデレータ
  • おがわさん、ご返答ありがとうございます。

    おがわさんのおっしゃるとおり、二つのコンボボックスで選択した範囲でテーブルのデータを抽出したいのです。

    二つのコンボボックスが連動してしまうというのは、

      ComboBox1.DataSource = MainTable
        ComboBox1.DisplayMember =
    "名前"
      ComboBox2.DataSource = MainTable
        ComboBox2.DisplayMember =
    "名前"
    のように指定すると、片方のコンボボックスの値を変更すると、もう一つも同じ値を取得してしまうということなのですが、おわかりいただけるでしょうか?

    なんせ、VBをいじくり始めて1週間しかたっていないので、どうコードを表示すればいいのやら…というレベルです。

    ちなみに、以前はエクセルを使って、VBAでマクロを組んで同じようなものを作っていました。ですが、エクセルがなくても使えるようにしてみたいと思い、プログラミングを始めてみました。レベルが低くて、おしかりを受けるのを覚悟での投稿です。なにとぞご容赦ください!

     

    2007年1月25日 16:49
  • 一つのWindowsフォームの中で、同じデータテーブルを共有する全てのコントロールは、全て連動して動きます。詳しくは、CurrencyManagerを調べてみて下さい。この場合、中身は全く同じであるMainTable2を作って、

      ComboBox1.DataSource = MainTable
        ComboBox1.DisplayMember =
    "名前"
      ComboBox2.DataSource = MainTable2
        ComboBox2.DisplayMember =
    "名前"

    のようにしてあげれば良いでしょう。

    2007年1月26日 0:45
    モデレータ
  • trapemiya さん、ご返答、ありがとうございます。

    なんだか、はっきりとは理解していないのですが、ホームページやヘルプで検索をしているうちに、思い通りに動くようになりました!

    本当にありがとうございました。まだまだたくさんわからないことがあるので、また質問することもあるかと思います。そのときは是非

    よろしくお願いいたします!!

    ちなみに、こんな風になりました!

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\!database\年代.mdb")
            'Dim Cn2 As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\!database\年代.mdb")

            Dim SQLCm As OleDbCommand = Cn.CreateCommand
            ' Dim SQLCm2 As OleDbCommand = Cn.CreateCommand

            Dim Adapter As New OleDbDataAdapter(SQLCm)
            '  Dim Adapter2 As New OleDbDataAdapter(SQLCm)

            Dim Table As New DataTable
            Dim Table2 As New DataTable

            SQLCm.CommandText = "SELECT * FROM 年代"
            Adapter.Fill(Table)
            Adapter.Fill(Table2)

            '▼値の表示
            ComboBox1.DataSource = Table
            ComboBox1.DisplayMember = "年代"
            ComboBox2.DataSource = Table2
            ComboBox2.DisplayMember = "年代"


            '▼後処理
            Adapter.Dispose()
            SQLCm.Dispose()
            Cn.Dispose()
        End Sub

    2007年1月26日 15:57
  •  けーくん さんからの引用

    なんだか、はっきりとは理解していないのですが、ホームページやヘルプで検索をしているうちに、思い通りに動くようになりました!

    考え方自体はOKです。ただ、
    Adapter.Fill(Table2)の処理ですが、一般的にデータベースから値を取ってくることは重い処理なので、Table2 = Table.Copy()とする方が効率的と思われます。あと、Disposeを書かず、usingを使う書き方もありますので、調べてみて下さい。

    2007年1月27日 9:32
    モデレータ
  • trapemiya さん、お返事、ありがとうございます。

    もう一つ、質問です。

    エクセルの範囲選択の時は、VBの場合、どのように記述するのでしょうか?

    エクセルのマクロでは、以下のように変数を用いて、セル範囲を取得していました。

    Sheets("入力").Activate
    Dim 問題数 As Integer
    問題数 = Sheets("選択画面2").Range("b2").Value
    Range("b3") = "=rank(a3,$a$3:$a$" & 問題数 + 2 & ")"
    Range("b3").Select
        Selection.Copy

    Sheets("入力").Range(Cells(3, 2), Cells(問題数 + 2, 2)).Select
        Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False

    VBは、データベースを使用するなど、エクセルとは概念が違うのだと思います。そのあたりのイメージがわかずに悩んでいます。

    どうぞよろしくお願いいたします。

    2007年1月28日 4:16
  • VBからExcelのシートにアクセスし、範囲を選択したいということでしょうか? get_Rangeで検索してみて下さい。

    #違う話題は別スレッドに分けましょう。

    2007年1月28日 7:03
    モデレータ