teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2019/12/06 01:03

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -9,6 +9,7 @@
9
9
  ```
10
10
 
11
11
  ### 追加の疑問への回答
12
+ 本当は、別の質問としてスレッドを立てた方がよいと思いますが、ここで追加の疑問にお答えします。
12
13
  For i = 0 To...~Nextの中でClassData.Rows.RemoveAt(i)のような行削除はお勧めできません。
13
14
  ループ内でClassData.Rows.RemoveAt(i)を行うと、除かれたDataRowの分だけインデックスがズレます。
14
15
  これにより、場合によってはRows(i)のDataRowが意図したものと異なるDataRowである恐れがあります。

3

追加の疑問の回答

2019/12/06 01:03

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -6,4 +6,17 @@
6
6
  Dim dr As DataRow = ClassList.NewRow
7
7
  dr("CLASS") = className
8
8
  ClassList.Rows.Add(dr)
9
- ```
9
+ ```
10
+
11
+ ### 追加の疑問への回答
12
+ For i = 0 To...~Nextの中でClassData.Rows.RemoveAt(i)のような行削除はお勧めできません。
13
+ ループ内でClassData.Rows.RemoveAt(i)を行うと、除かれたDataRowの分だけインデックスがズレます。
14
+ これにより、場合によってはRows(i)のDataRowが意図したものと異なるDataRowである恐れがあります。
15
+ また、ループで「For i As Integer = 0 To ClassData.Rows.Count - 1」と定義した場合、ループの途中でClassData.Rows.Countの値が変化しても、iの上限がループ開始時のまま固定になってしまうと思います。
16
+ これが「5行目(Rows(4))に行がない」エラーの理由だと思います。
17
+
18
+ 対応策は色々とあるのですが、もし、今のコードを流用したいのであれば、
19
+ 「For i As Integer = 0 To ClassData.Rows.Count - 1」の代わりに、
20
+ 「For i As Integer = ClassData.Rows.Count - 1 To 0 Step -1」
21
+ のように行を逆方向から評価することです。
22
+ これならDataRowの抜けによるズレは気にしなくて済みます。

2

誤記の修正

2019/12/06 01:00

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  手っ取り早く前最終行の値を取得したいなら、こんな感じでしょうか?
2
2
  (ClassListが空である場合はそれなりの対策をしてください。)
3
3
  ```VB
4
- Dim drLast as DataRow = ClassList.Rows(ClassList.Rows.Count - 1))
4
+ Dim drLast As DataRow = ClassList.Rows(ClassList.Rows.Count - 1))
5
5
  Dim className As String = drLast("CLASS")
6
6
  Dim dr As DataRow = ClassList.NewRow
7
7
  dr("CLASS") = className

1

誤記を修正

2019/12/05 08:08

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -4,6 +4,6 @@
4
4
  Dim drLast as DataRow = ClassList.Rows(ClassList.Rows.Count - 1))
5
5
  Dim className As String = drLast("CLASS")
6
6
  Dim dr As DataRow = ClassList.NewRow
7
- dr("CLASS") = "J3"
7
+ dr("CLASS") = className
8
8
  ClassList.Rows.Add(dr)
9
9
  ```