データテーブルの「row()」と「rows().item()」の違いについて

Excelの範囲を読み込んでデータテーブルを出力し、利用する場合の質問になります。

「row()」と「rows().item()」について、データテーブルから取り出す場合に前者は「row(列のインデックス番号)」でカッコ内には列を指定(0が入れば1列目、1なら2列目…)となる認識なのですが、後者は「rows(行のインデックス番号)」.「item(列のインデックス番号)」で前方のカッコ内には行、後方のカッコ内には列を指定する で合っていますでしょうか。

row自体の意味は行だと思うのですが、row()の場合にカッコ内は列のインデックス、rows()の場合にカッコ内が行のインデックスとなり、指定の仕方が違う為、混乱しております。
ご教示頂ければ幸いです。

ざっくりいうと、Rowsはrowの配列です。
別物なので、指定の仕方も異なることになります。
※正確には、RowsはDataRowCollectionでrowはDataRowです。

例えば、2行2列のデータテーブルdtAがあるとします。
列名 “col1”(string),“col2”(int)
データ行
“a”,1
“b”,2

そこから、1行目(0スタートなので行番号は1)をとると
row = dtA.rows(0)
※中身は{“a”,1}

2行目をとると
row = dtA.rows(1)
※中身は{“b”,2}

となります。
※このテーブルの場合2行しか入っていないので、dtA.Rowsの中身は上の二つしかありません。
そして、rowは各行単体を表しています。
※もちろん、異なる変数で受けても問題ありません。

2行目の1列目(0スタートなので列番号は0)をとるときは

row(0) = row(“col1”) = row.item(0) = row.item(“col1”)
= dtA.rows(1)(0) = dtA.rows(1)(“col1”) = dtA.rows(1).item(0) = dtA.rows(1).item(“col1”)
= “b”

となり、すべて同じものを指しています。

いかがでしょうか。。

3 Likes

早速のご回答をありがとうございます。
自分の中で整理してみて、分からない場合は改めてご質問させて頂きます。

kyd_has様

再度失礼します。「row()」と「rows().item()」の使い方の続きで、下記は同じような説明をしていると思うのですが、違いは「⇒」以下に記載している認識で相違無いでしょうか。

・「row()」を使うとき
DataTable型変数に格納されている値を指定するときは、変数の後に「row(0)」のように()で値の番号を指定する。
この値は0からスタートするので、最初の値を指定するときは「row(0)」と指定する。
⇒ これは、行そのもの(各行単体) ※1次元=横(行)

・「rows().item()」を使うとき
範囲を読み込むで取得したExcelのデータは、データテーブルとして格納される。
データテーブルは、行と列で構成される表形式の配列データ。
「Row」で行を、「Item」で列を指定し、それぞれ「()」の中に番号を指定する事で、必要なデータを特定出来る。ただし、番号が「0」から開始されるので、1行目は「Row(0)」ではなく「Row(1)」となる。
⇒ これは、配列データ(表形式) ※2次元=横縦(行列)

また、例えばrow() は〇〇の時に利用、データテーブル.rows().item() はXXの時に利用など、利用の使い分けの例などがあればお教え頂けますと幸いです。

度々恐れ入ります。

もし、こちらについてご存知の方・ご教示頂ける方がいらっしゃいましたらご回答頂ければ幸いです。お手数をお掛け致します。

質問へのご回答と、おそらく混乱している原因、それと最後に少し書きたいことを。。

1.【質問へのご回答】row()とdtA.Rows().item()の使い分けについて

row()を使うときとrows().item()を別に考えておられるみたいですが、本質的には同じものです。
なので、使い分けは好みでよいかと。
※私は、一度rowに受けるのが好きなので(単純に記述量を減らすため)
row = dtA.rows(0)
等として使います。
そのあと使用するときに、これまた記述量を減らすために、row.item(0)とせずに
row(0)
等として使用することが多いです。

rowというものは基本的には、単体では意味がないものです。
基本的にはなんらかのデータテーブルに所属します。
※理由は列情報のない行に意味がないからです。
※分かりやすくするためにだいぶ単純化しています。
※正式な情報はmicrosoftの.netの公式ドキュメントがよいかと。すごく分かりにくいですが。。

rowを使用するケースは2つあります。

1-1.row = dtA.Rows(<行番号>)
1-2.row = dtA.NewRow

1-1.はテーブル(excelの表のイメージ)内のある行を表しています。(excelの横(行)のイメージ)
1-2.はテーブルの新規行を表しています。(excelの表の下にデータを1行追加するイメージ)

※繰り返し(各行)で現れているrowは内部的には1.を使用していると考えていただいて構いません。
プロパティの出力にある現在のインデックスというのが行番号を表しています。

2.【混乱している原因?】1行目は「Row(0)」ではなく「Row(1)」となる。について

範囲を読み込む際にdtA.Rows(1)で1行目が取れる理由は、
ヘッダー(項目名)がある表の場合に、ヘッダーの追加をfalseにしているからだと推察します。

たとえば、excelで
1行目 “col1”,“col2” ← これをヘッダー(項目名)と呼んでいます。
2行目 “a”,1←これを1行目と呼んでいると思われます。
3行目 “b”,2
※excelは1始まりで行番号があるため
という表があるとします。

この表を範囲を読み込むアクティビティでdtAに読み込む場合を考えます。

ヘッダーの追加=trueの場合
列名 “col1”,“col2”
データ(2行)
(dtA.Rows(0)) a,1 ← 0番目が"1行目を表している"と感じる
(dtA.Rows(1)) b,2

ヘッダーの追加=falseの場合
列名 “Column1”,“Column2”
データ(3行)
(dtA.Rows(0)) col1,col2
(dtA.Rows(1)) a,1 ← 1番目が"1行目を表している"と感じる
(dtA.Rows(2)) b,2

となります。

なので、範囲を読み込むを使用する場合でもデータテーブル自体の仕様は同じです。

3.【言いたいこと】宛先指定について
このような質問系掲示板では宛先指定はしない方がよいと思います。
回答してくれた人が次いつ入ってくる分からない(最悪帰ってこないこともある)ですし、他によい回答をすぐにしてくれる人が出てくるかもしれないからです。
※hiromitsu_sekine様に言いたいという訳ではありません。他にもいくつか指定するやりとりを見ていて、回答者が忙しそうなのを見るともったいないなーと感じていてどこかで言いたいと思っていたものです。
ここで書いてしまって少し申し訳なく思います。

以上、長くなってしまいましたが、ご参考まで。

kyd_has様

ご回答ありがとうございました。
宛先指定については、今後質問する際に注意致します。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.