質問: "1944" select dtcode("in0020") msgbox(tmp(0).tostring) end sub
回答: (回答1) 「フォームにtextboxを置いて、textboxの入力内容に従って、”1944”と”1959”を切り替える」 の意味をもっと具体的に書いてください。 dt.rows.add({1944, 107, "山田"}) dt.rows.add({1959, 109, "林"}) を dt.rows.add({1959, 107, "山田"}) dt.rows.add({1944, 109, "林"}) にしたいということですか? where dtcode("in0010") = "1944" を where dtcode("in0010") = "1959" にしたいということですか? いずれも、直接書いてある箇所を、変数なりなんなりに変えればできます。 (回答2) (回答3) まず、 public function asenumerable (source as datatable) as enumerablerowcollection(of datarow) が適用されるのは dt.asenumerable() だけです。 対して dim tmp as enumerablerowcollection(of object) = from dtcode in dt.asenumerable() where dtcode("in0010") = "1944" select dtcode("in0020") というプログラムで 変数tmpに入れようとしているのは from dtcode in dt.asenumerable() where dtcode("in0010") = "1944" select dtcode("in0020") という式(の評価結果)です。ここまでで1つです。 public function asenumerable() の戻り値は関係ありません。 https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/queries/select-clause ここをよく読むとわかるのですが select では ・1つだけ値を指定したら、その型 ・カンマ区切りで複数指定したり、列の別名を指定したりすると「匿名型」 のienumerable(of t)を返します。 (細かくは違うところもあるかもしれませんが) select dtcode("in0020") の場合、 ・dtcodeはdatarow型→ dtcode(列) は object型 なので、このselectにより ienumerable(of object) が返ります。 ※ 実体は enumerablerowcollection(of object) かもしれませんが 「dtcode("in0020"),dtcode("in0020")とするとエラーになる」 のは、 > var1 > 任意。 列式の結果を参照するために使用できる別名。 にあたる部分を推測できなかったためのものでしょう。 先のマニュアルの例では select product.productname → productname という列名 といった推測ができます。 よって、解決策の一つは「列名となるものを指定する」です。 ただ option strict off や option infer on の状態なら、匿名型の扱いも楽なのですが、 option strict on, option infer off の状態だと、匿名型を使うのが面倒です。 なので、もう一つの方法「select で一つの値だけを指定する」を使うのがよいでしょう。 複数の値を使いたいなら、それを一つにまとめるような仕組みを使います。 ・dtcode は(複数の値をまとめた)datarow型です。select dtcode で ienumerable(of datarow)になります ・tuple(of 〜)も即席のクラスを作るのに便利です。 ・同じ型だけを使うのなら、配列も使えます。 ・面倒ですが、(専用に作った)クラス/構造体も使えます。